一:案例背景
在当今大数据时代,数据存储和管理已成为企业IT架构中的关键环节。分布式存储系统因其高可用性、高扩展性、低成本等优势,逐渐成为企业数据存储的首选。Ceph作为一款开源的分布式存储系统,受到了越来越多企业和单位的关注和采用。然而,在享受Ceph带来的便利的同时,如何应对因误操作等原因导致的数据丢失,成为企业IT运维人员必须面对的问题。
二:案例描述
本文将介绍一个在OpenStack系统中,使用KVM虚拟化和Ceph分布式存储服务器时,因配置文件误删除且服务器没有备份容灾的情况下,如何进行数据恢复的案例。我们将详细阐述问题发生的原因、恢复过程以及预防措施,为广大运维人员提供借鉴和参考。
系统环境:
1.OpenStack版本:Pike
2.KVM虚拟化
3.Ceph版本:Luminous
4.存储服务器:4台,每台配置为32核CPU、128GB内存、8TB硬盘*8
问题描述:
客户运维团队在对OpenStack平台进行日常维护时,不慎误删了KVM虚拟化环境中Ceph分布式存储集群的一个关键配置文件。这一突发状况立即引起了团队的警觉,因为Ceph集群的配置文件包含了存储池的定义、OSD(对象存储设备)的映射、Ceph集群的osdmap、monmap、监控信息等核心数据,删除后,Ceph集群的部分存储池无法正常访问,进而影响整个云服务业务的正常运行,总结起来有三点:
虚拟机无法启动:KVM虚拟化的配置文件缺失将导致虚拟机无法启动或连接到正确的存储池。
存储节点故障:Ceph的配置文件如果丢失,可能导致存储节点之间无法正确通信,影响数据的读写操作。
服务中断:整个OpenStack云平台的服务可能因为配置文件的缺失而中断,影响到业务的连续性。
三:解决方案
1.应急响应
客户联系我们以后,我方技术团队面对这一紧急情况,立即让客户的运维团队启动应急预案,采取了以下措施:
1.紧急停机:首先,为避免进一步的数据损坏,立即停止了所有可能影响到Ceph集群的操作,包括数据写入和读取。
2.环境评估:对当前的Ceph分布式集群状态进行全面评估,确认受影响的范围及程度,包括哪些配置文件丢失,是否已造成数据损坏等。
2.恢复挑战
在服务器没有备份容灾的情况下进行数据恢复是极具挑战性的,主要挑战包括:
无备份可用:传统的恢复方式依赖于已有的备份,而在没有备份的情况下,需要通过日志文件、元数据和其他剩余数据来重建丢失的配置。
系统复杂性:OpenStack平台与Ceph分布式存储的配置复杂,恢复过程中稍有不慎就可能造成数据的永久性丢失。
时间紧迫:在实际业务环境中,服务的中断会带来巨大的损失,因此需要快速而准确地进行恢复。
3.案例评估
首先,我们需要了解Ceph的分布式存储机制。跟其他分布式存储系统不一样的是,Ceph在称之为RADOS的核心对象存储架构之上,提供了块存储、文件存储以及对象存储的接口,因此Ceph可以称之为统一存储(Unified Storage)。Ceph主要由Monitors、Managers、OSDs三种类型的组件组成。其中,Monitors负责维护集群状态信息,Managers负责管理集群资源,OSDs负责存储数据。
Ceph的底层是RADOS(分布式对象存储系统),RADOS由两部分组成:OSD和MON。MON负责监控整个集群,维护集群的健康状态,维护展示集群状态的各种图表,如OSDMap、MonitorMap、PGMap和CRUSHMap。OSD负责存储数据、复制数据、平衡数据、恢复数据,与其它OSD间进行心跳检查等。通常情况下一块硬盘对应一个OSD。
Ceph分布式数据的存储过程,无论使用哪种存储方式(对象、块、文件),存储的数据都会被切分成对象(Objects)。
存储池:不同用户因为不同的目的把对象存储在不同的存储池里,这些对象分布于OSD上。对象保存在不同的存储池(Pool)中,是对象存储的逻辑组,对应不同的用户。存储池管理着归置组数量、副本数量、和存储池规则集。
归置组:归置组(PGPlacementGroup)是对象池的片段,Ceph根据对象的Oid和一些其他信息做计算操作,映射到归置组,无数的对象被划分到不同的归置组。PG是一个逻辑概念,它在数据寻址时类似于数据库中的索引。每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到对象所属的PG,然后遍历这个PG就可以了,无需遍历所有对象。而且在数据迁移时,也是以PG作为基本单位进行迁移。
OSD:最后PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上,最终把PG中的所有对象存储到OSD节点上。
BlueStore:在新版本中,Ceph默认以Bluestore存储引擎,作为RADOS中OSD的ObjectStore存储底层实现BlueStore整体架构。
存储空间:BlueStore将整个存储空间分为3个部分:WAL,DB,SLOW。慢速(Slow)空间:主要用于存储对象数据,由BlueStore管理。高速(DB)空间:存储blufs和rocksdb产生的数据,由BlueFS直接管理,如果不存在或者DB设备空间不足,则选择Slow类型设备空间。超高速(WAL)空间:主要存储RocksDB的WAL(即.log)文件,由BlueFS直接管理,如果不存在或者WAL设备空间不足,则逐级降级选择DB、SLOW分区。
Rocksdb:BlueStore使用Rocksdb作为自己元数据存储的底层实现,将各种元数据以kv型记录的方式存在数据库中。写入机制:任何元数据的写入都会先写到WAL,然后再写入MemoryTable(Memtable)。当一个Memtable写满了之后,就会变成immutable的Memtable,RocksDB在后台会通过一个flush线程将这个Memtableflush到磁盘,生成一个SortedStringTable(SST)文件。
BlueFS:BlueFS与通用文件系统不同,是Bluestore专为Rocksdb所设计的精简文件系统。BlueFS的文件和目录的元数据以日志事务的形式保存在日志文件中,在上电过程中,replay日志文件中的事务,就可以加载所有的元数据到内存中。
在本案例中,由于配置文件误删除,导致部分OSD无法正常工作,进而影响了存储池的访问。我们还利用Ceph的日志文件进行了深入分析,试图从日志中找到任何可能的线索,比如配置文件的修改记录或异常操作。虽然日志文件不能直接恢复丢失的配置文件,但它提供了宝贵的参考信息,帮助确认恢复操作的正确性和完整性。
4.恢复方案
首先给大家梳理下Ceph分布式故障后,常规处理的主要流程,分为三大步骤:
- 感知集群状态
Ceph集群分为MON集群和OSD集群两大部分。其中MON集群由奇数个Monitor节点组成,这些Monitor节点通过Paxos算法组成一个决策者集群,共同作出关键集群事件的决策和广播。“OSD节点离开”和“OSD节点加入”就是其中两个关键的集群事件。
MON集群管理着整个Ceph集群的成员状态,将OSD节点的状态信息存放在OSDMap中,OSD节点定期向MON和对等OSD(Peer OSD)发送心跳包,声明自己处于在线状态。MON接收来自OSD的心跳消息确认OSD在线;同时,MON也接收来自OSD对于Peer OSD的故障检测。MON根据心跳间隔等信息判定OSD是否在线,同时更新OSDMap并向各个节点通告最新集群状态。比如某台服务器宕机,其上OSD节点和MON集群的心跳超时或是这些OSD的对等OSD发送的失败通告超过阈值后,这些OSD将被MON集群判定为离线。
判定OSD节点离线后,Ceph将最新的OSDMap通过消息机制随机分发给一个OSD,客户端(对等OSD)处理IO请求的时候发现自身的OSDMap版本过低,会向MON请求最新的OSDMap。每个OSD中PG的另外两个副本可能在集群任意OSD中,借此经过一段时间的传播,最终整个集群的OSD都会接收到OSDMap的更新。
- 确定受故障影响的数据
Ceph中对象数据的维护由PG(Placement Group)负责,PG作为Ceph中最小的数据管理单元,直接管理对象数据,每个OSD都会管理一定数量的PG。客户端对于对象数据的IO请求,会根据对象ID的Hash值均衡分布在各个PG中。PG中维护了一份PGLog,用来记录该PG的数据变化,这些记录会被持久化记录到后端存储中。
PGLog中记录了每次操作的数据和PG的版本,每次数据变更操作都会使PG的版本自增,PGLog中默认保存3000条记录,PG会定期触发Trim操作清理多余的PGLog。通常情况下,在同一个PG的不同副本中的PGLog应该是一致的,故障发生后,不同副本的PGLog可能会处于不一致的状态。
OSD在收到OSDMap更新消息后,会扫描该OSD下所有的PG,清理已经不存在的PG(已经被删除等情况),对PG进行初始化,如果该OSD上的PG是Primary PG的话,PG将进行Peering操作。在Peering的过程中,PG会根据PGLog检查多个副本的一致性,并尝试计算PG的不同副本的数据缺失,最后得到一份完整的对象缺失列表,用作后续进行Recovery操作时的依据。对于无法根据PGLog计算丢失数据的PG,需要通过Backfill操作拷贝整个PG的数据来恢复。需要注意的是,在这Peering过程完成前,PG的数据都是不可靠的,因此在Peering过程中PG会暂停所有客户端的IO请求。
- 恢复受影响的数据
Peering完成后,PG进入Active状态,并根据PG的副本状态将自己标记为Degraded/Undersized状态,在Degraded状态下,PGLog存储的日志数量默认会扩展到10000条记录,提供更多的数据记录便于副本节点上线后的数据恢复。进入Active状态后,PG可用并开始接受数据IO的请求,并根据Peering的信息决定是否进行Recovery和Backfill操作。
Primary PG将根据对象的缺失列表进行具体对象的数据拷贝,对于Replica PG缺失的数据Primary 会通过Push操作推送缺失数据,对于Primary PG缺失的数据会通过Pull操作从副本获取缺失数据。在恢复操作过程中,PG会传输完整4M大小的对象。对于无法依靠PGLog进行Recovery的,PG将进行Backfill操作,进行数据的全量拷贝。待各个副本的数据完全同步后,PG被标记为Clean状态,副本数据保持一致,数据恢复完成。
通过Ceph处理故障的流程,我们可以看到Ceph如何应对集群故障常见的问题。首先是减少对资源的消耗:在断电重启这类故障中,Ceph可以只恢复有变化的数据,从而减少数据恢复量;另一方面,MON不会主动向所有OSD推送集群状态,而是采用OSD主动获取最新OSDMap的方式防止大规模集群发生故障场景下产生突发流量。
另外,由于Ceph的IO流程必须要通过Primary PG进行,一旦Primary PG所在的OSD宕机,IO将无法正常进行。为了保证恢复过程中不会中断正常的业务IO,MON会分配PG Temp临时处理IO请求,在数据恢复完成后再移除PG Temp。同时在整个恢复过程中,Ceph也允许用户通过配置文件调整恢复线程数,同时进行的恢复操作数,恢复数据网络传输优先级等相关参数来限制恢复的速度,从而降低对正常业务的影响。
但是在本案例中,因为涉及到了元数据的丢失,所以以上常规的故障处理流程都不适用,需使用专业Ceph数据恢复方案:
(1)备份当前Ceph集群状态
为了防止在数据恢复过程中产生新的问题,首先对当前Ceph集群状态进行备份:
# ceph tell mon.* backup
(2)分析Ceph日志
通过分析Ceph日志,我们找到了误删除配置文件的详细过程。由于Ceph的日志记录了详细的操作记录,我们得以确定误操作的具体时间点。
(3)恢复元数据:Ceph存储系统中保留的元数据可能包含原始配置文件的部分内容,通过元数据的分析,可以恢复部分关键配置。
(4)重建配置文件
根据日志,元数据和剩余配置文件,我们手动重新编写配置文件,尝试恢复了部分配置信息。但是,由于关键配置文件已删除,部分信息无法完全恢复。
(5)手动扫描存储池
为了找回丢失的数据,针对ceph分布式的文件存储方式,我们手动将服务器硬盘中的文件全部提取出来。再分析文件的命名方式,解析出文件磁盘卷的组合方式,在同一组文件磁盘卷中文件的命名都存在同一ID(例如5eB83240b4c1);将所有文件将同一组文件磁盘卷的文件归类到统一文件夹并做好命名标记。继续分析标记文件夹中文件,在文件磁盘卷名称ID后存在文件排列顺序ID(例如0000000000000000),将标记文件夹文件以顺序ID排序发现文件顺序ID并不连续;通过解析文件顺序ID之间相互的数据结构,确定文件顺序ID丢失部分为文件磁盘卷中全为零的文件块,手动将文件磁盘卷组合完成。对组合完成的文件磁盘卷检验是否完整,若有错误则继续上一步操作,若无错误则手动提取恢复的数据。
(6)重新配置Ceph集群
根据恢复的数据,我们重新配置了Ceph集群。在Ceph集群恢复正常后,我们重新配置了KVM虚拟化,确保虚拟机可以正常使用Ceph分布式存储。
(7)测试并验证
在恢复完成后,进行全面的测试,确保所有虚拟机能够正常启动,存储系统能够正常读写数据,主要通过以下三个步骤:
配置检查:使用Ceph提供的命令行工具检查集群的配置状态,确保所有配置项均已正确恢复;
数据一致性校验:运行数据一致性校验工具,验证Ceph集群中的数据是否完整无损。
性能测试:进行一系列的读写性能测试,评估恢复后Ceph集群的性能是否满足业务需求。经过验证,存储池恢复正常,业务运行未受影响。
四:案例总结
经过紧张而有序的工作,我方技术团队终于成功恢复了Ceph分布式存储服务器集群的配置文件,并确保了整个系统环境的稳定运行。此次事件虽然惊心动魄,但也带来了宝贵的经验教训:
- 加强备份管理:务必建立健全的备份机制,定期备份Ceph集群关键配置文件和数据,确保备份的完整性和可用性,以防不测。
- 提高安全意识:合理设置管理员权限,加强运维人员的安全教育和培训,提升自身的运维能力和数据保护水平,降低人为错误的发生概率。
- 完善应急预案:制定规范的操作流程,不断完善和优化应急预案,确保在紧急情况下能够迅速、有效地响应。
- 加强监控与日志分析:开启日志审计功能,记录管理员的所有操作,便于追溯和排查问题,充分利用监控系统和日志分析工具,及时发现并处理潜在问题。
Ceph是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供块存储服务(rbd)、对象存储服务(rgw)以及文件系统存储服务(cephfs)。目前也是OpenStack的主流后端存储,和OpenStack亲如兄弟,为OpenStack提供统一共享存储服务。使用Ceph作为OpenStack后端存储,具有如下优点:
所有的计算节点共享存储,迁移时不需要拷贝根磁盘,即使计算节点挂了,也能立即在另一个计算节点启动虚拟机(evacuate)。
利用COW(Copy On Write)特性,创建虚拟机时,只需要基于镜像clone即可,不需要下载整个镜像,而clone操作基本是0开销,从而实现了秒级创建虚拟机。
Ceph RBD支持thin provisioning,即按需分配空间,有点类似Linux文件系统的sparse稀疏文件。创建一个20GB的虚拟硬盘时,最开始并不占用物理存储空间,只有当写入数据时,才按需分配存储空间。
OpenStack和KVM有什么区别?OpenStack和KVM虽然都属于云计算技术领域的范畴,但两者有着不同的概念。简单来说,OpenStack是一个开源的云计算管理平台项目,由多个主要的组件构成,可以用来部署和管理云计算平台中的各种资源;而KVM(Kernel-based Virtual Machine)是一种基于Linux内核实现的开源虚拟化技术,可以将Linux内核转化为一个超级虚拟机监控器。
OpenStack和KVM的关系:OpenStack是云管理平台,其本身并不提供虚拟化功能,真正的虚拟化能力是由底层的Hypervisor(如KVM、Qemu、Xen等)提供。而OpenStack则可以管理KVM虚拟化环境。KVM可帮助您将Linux转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。它是目前比较热门的虚拟化方案,例如许多国外主机都是基于KVM虚拟化的。KVM这样的Hypervisor软件,实际上是提供了一种虚拟化能力,模拟CPU的运行,更为底层。但是它的用户交互并不良好,不方便使用。于是,为了更好地管理虚拟机,就需要OpenStack这样的云管理平台。
当数据发生丢失时,海境超备研发团队深入研究各种服务器和系统设计思路,认真对比故障类别,攻克疑难恢复案例,总结成功恢复经验,拥有成功修复服务器数据库,虚拟化平台,分布式存储等数据中心相关的上万个疑难案例,并掌握了勒索病毒恢复核心技术,所有恢复的数据不丢记录,结构完整,直接使用,不报错。