可靠性设计
可靠性设计用于说明 ZCF 架构中各能力域的高可用与数据保护机制。其中,云平台承载云主机和网络服务等业务负载可靠性能力,存储服务承载数据冗余和故障自愈能力,容器服务承载容器集群高可用能力,共同降低故障场景下的业务中断和数据丢失风险。
业务负载高可用
业务负载高可用覆盖云主机和容器集群两类承载对象。云主机高可用用于在物理机或云主机故障时恢复业务运行,容器集群高可用用于保障 Kubernetes 管理节点和关键组件持续可用。
云主机高可用
云主机高可用指平台检测到云主机故障后,自动在健康的物理机重新启动该云主机的机制。该机制可降低云主机宕机时间,保障业务连续性,且整个过程不依赖专有硬件。
- HostFailure:当云主机所在物理机发生故障时,执行高可用。该模式默认开启,主要用于处理物理机断电等底层故障。
- NeverStop:保证云主机永不停机(不包含手动关机场景),主要用于处理上层可见的云主机故障。该模式支持用户自定义配置。
前提条件
- 存储:云主机使用共享存储。如使用本地存储,物理机发生故障时,云主机无法高可用迁移到其他物理机。
- 计算资源:确保计算资源充足,云主机可找到健康的物理机启动。
- 策略设置:启用全局云主机高可用策略,并将云主机高可用模式设置为NeverStop。
实现原理
- 管理节点:负责处理云主机故障信息,并调度故障检测、恢复任务。管理节点定期获取云主机状态,当云主机处于停止状态时,将尝试启动该云主机。
- 物理机 agent:负责汇报云主机故障信息,执行故障检测和 Fencer 机制,定期检查云主机网络及存储状态,检测到故障时,物理机 agent 将强制终止当前云主机进程,并由管理节点在健康物理机上重新启动。
关于故障检测
- 网络检测:
- 检查管理网络:通过管理网连接状态,判断物理机是否故障:
- 检查管理节点和当前物理机间的管理网络心跳,快速发现物理机管理网络连接异常。
- 管理节点通过其他健康的物理机检查疑似异常的物理机,判断该物理机是否彻底从管理网络断开。
- 检查物理机与共享存储的网络连接状态。
- 检查物理机业务网口状态。
- 检查管理网络:通过管理网连接状态,判断物理机是否故障:
- I/O 心跳检测:通过存储层面的心跳记录检查物理机磁盘 I/O 是否正常。如 I/O 心跳检测与(管理)网络检测结果冲突,以 I/O 心跳检测结果为准:
- SAN 存储:检测 sanlock 心跳记录是否按时更新。
- Ceph 存储:检测自定义 host 心跳记录和云盘对应的 RBD Watcher。
- 多存储场景(即云主机根云盘、数据盘使用不同主存储):以根云盘所在主存储记录为准。
关于防脑裂
为防止高可用过程中,因网络分区导致云主机脑裂(即不同物理机上同时运行同一个云主机进程),引入 Fencer 机制,当检测到故障时,将强制终止相关的云主机进程。
关于故障恢复与调度
故障恢复由 Checker 负责,云主机进程强制终止后,Checker 将在健康的物理机重新启动该云主机,与 Fencer 形成闭环,确保云主机只在一台物理机上运行。

容器集群高可用
容器服务底座 Kubernetes 集群的管理节点高可用采用 Kubernetes 官方推荐的高可用方案设计,由三台管理节点组成容器服务集群,每个管理节点主要包含 kube-apiserver、kube-scheduler、kube-controller-manager 三个组件。同时每个管理节点包含一个 etcd 节点,有三台 etcd 节点组成的集群作为 Kubernetes 的元数据存储,实现集群数据的高度可靠性和一致性。

网络高可用
网络高可用面向物理链路、基础网络服务和网络服务实例故障场景,保障业务网络持续运行,主要包括物理机网络高可用和网络服务高可用。
物理机网络高可用
物理机网络高可用由交换机侧链路冗余和物理机侧网卡 Bonding 共同实现。交换机侧负责提供链路和设备冗余,物理机侧将多张网卡绑定为一个逻辑接口,两者配合降低单网卡、单链路或单交换机故障对业务网络的影响。
交换机侧高可用:堆叠/M-LAG
交换机侧高可用主要通过堆叠和 M-LAG 技术实现。堆叠将多台交换机虚拟化为一个逻辑设备;M-LAG 在多台独立运行的交换机之间建立跨设备链路聚合,实现链路冗余。通过堆叠或 M-LAG 可实现以下目标:
- 交换机高可用:任一交换机故障时,流量可切换至其他交换机。
- 链路无环路:基于 LACP 协议管理链路聚合,降低多链路转发产生环路的风险。
- 带宽提升:聚合多条物理链路,提高网络总带宽。
物理机侧高可用:网卡 Bonding
物理机侧高可用主要通过网卡 Bonding 实现。Bonding 将物理机的多张网卡绑定为一个逻辑接口,并与交换机侧堆叠或 M-LAG 配合,提供链路冗余和带宽聚合能力。常用模式包括模式 1(active-backup)和模式 4(802.3ad)。
- 模式 1(active-backup):同一时刻只有一张网卡处于活跃状态,其他网卡处于备用状态。主网卡或主链路故障时,流量可切换到备用链路。
- 模式 4(802.3ad):多张网卡通过 LACP 协议形成逻辑链路组(LAG),由交换机与物理机 Bonding 协同实现链路冗余和带宽聚合。

网络服务高可用
网络服务包括基本网络服务(如 DHCP)和由 VPC 路由器或负载均衡实例提供的其他网络服务(如负载均衡、端口转发等)。
分布式 DHCP
- 每台物理机均运行 dnsmasq 进程,为其上云主机提供 DHCP 服务。
- 云主机启动后,管理节点将其 IP/MAC/DNS 等信息下发到物理机 agent。
- 物理机 agent 将信息写入本地 DHCP 服务端配置文件。
- 云主机发送 DHCP 广播请求,本地 DHCP 服务端接收并处理请求。
在该模式下,DHCP 服务不依赖中心节点,管理节点故障不影响已有云主机正常获取 IP 地址。


其他网络服务
其他网络服务主要由 VPC 路由器或负载均衡实例提供,云平台通过 VPC 路由器或负载均衡实例高可用保障网络服务高可用。
VPC 路由器高可用
VPC 路由器支持双机主备模式,即部署一对互为主备的 VPC 路由器,形成高可用组。配置变化实时同步主备路由器,确保主备路由器配置一致。当主路由器状态异常时,将自动切换至备路由器,保证业务持续运行。主备路由器建议分别部署在不同的物理机,进一步避免单点故障。
- 状态监控:
- 心跳检测:主路由器定期通过 VRRP 通告发送心跳给备路由器。
- ZVR 监控:监控 ZVR(ZStack VPC Router)进程状态。
- 故障检测:当出现以下任一情况时,认定主路由器故障:
- 备路由器在指定时间内未收到心跳。
- 主路由器 ZVR 进程异常。
- 主路由器监控 IP 不可达。
- 自动切换:当主路由器故障,且备路由器监控 IP 可达时,备路由器将接管 VIP,升级为新的主路由器,提供网络服务。

负载均衡实例高可用
负载均衡实例高可用和 VPC 路由器高可用机制基本相同:部署一对互为主备的负载均衡实例,形成高可用组,并通过 Keepalived 监控主备实例状态,当主实例故障时,将自动切换至备实例,保障业务持续运行。
- 配置同步:配置变化在高可用组层面触发,先同步至主实例,再异步同步至备实例,确保主备实例配置一致。
- 一致性检查:定期检查主备实例是否与高可用组配置版本一致,自动补充未完成任务或全量下发配置,避免同步遗漏。
存储可靠性
存储可靠性围绕数据冗余、故障域隔离、一致性检查、故障检测和数据重建等能力展开,用于保障存储服务在硬件故障、节点异常和容量变化等场景下持续提供数据访问能力。本节以 ZStack ZStone 为例,介绍分布式存储在 ZCF 架构中的可靠性设计。
数据冗余
概述
数据冗余技术是存储系统实现高可用性、数据保护和业务连续性的基石。在面对日益增长的数据量、复杂的应用场景以及潜在的硬件故障、网络中断、人为误操作等多种威胁时,恰当的数据冗余策略能够为用户提供强有力的数据保护屏障,确保业务连续性和数据价值的最大化。本节将简要对比集中式存储与分布式存储的冗余技术特点,并以 ZStack ZStone 为例介绍副本与纠删码(EC)两种核心数据安全策略。
集中式存储与分布式存储对比
集中式存储
传统集中式存储使用控制器和硬盘柜来提供数据管理和读写能力,通常采用双控制器进行冗余,也有高端存储使用多控制器。存储空间可以通过控制器自带的硬盘槽位或外接扩展硬盘柜提供。传统集中式存储通常使用 RAID 技术,比如 RAID5、RAID6、RAID10 等,来保护数据。

分布式存储
分布式存储采用无中心的组网方式,每个存储节点都可以提供计算和存储资源,以实现更灵活的扩展性和更大的存储规模。存储节点通过通用以太网交换机互联起来,并基于分布式存储软件向上层业务提供统一的存储资源池。此外,分布式存储支持横向扩展,单集群可扩展到上千节点提供 EB 级别容量,适合海量数据的存储场景。

集中式存储 VS 分布式存储
- 跨节点冗余:分布式存储支持跨节点冗余,例如 3 副本允许 2 个节点同时故障而不丢失数据,而 RAID 技术局限于单节点内磁盘冗余。
- 全局热备与数据恢复:分布式存储无需单独热备盘,所有硬盘参与数据恢复,效率显著高于 RAID 模式(仅一块热备盘)。同时,分布式存储无需额外硬件支持,而 RAID 模式需要独立的 RAID 卡。
副本技术
定义
副本是一种数据保护技术,通过在不同的节点上复制相同的数据来实现数据冗余和高可用性。当一个节点发生故障时,可以使用其他节点上的副本来恢复数据。支持用户设置 2~6 副本,在生产环境中推荐使用 3 副本。
- 正常场景读写
以服务器级别的 3 副本冗余策略为例,写入数据时,将被系统拷贝成 3 份相同的副本,分别存储于三台不同的服务器上的数据盘中。读取数据时,系统将从任意一台服务器上读取数据并返回给用户。
图 9. 三副本正常场景读写 
- 故障场景读写
以服务器级别的 3 副本冗余策略为例,当服务器 C 故障后,系统将在剩余的 2 台服务器中存储副本。读取数据时,当服务器 C 故障后,系统将在剩余 2 台服务器中读取 1 个副本返回给用户。
图 10. 三副本故障场景读写 
纠删码技术
概述
- 标准 EC(K+M):K 指数据的切片数量,M 指校验数据的数量,表示冗余能力为允许 M 个故障域同时坏掉,而数据正常使用。
- 折叠 EC(K+M:B):K 指数据的切片数量,M:B 指校验数据的数量,表示冗余能力为允许 M 个硬盘或 B 个故障域同时坏掉,而数据正常使用。
策略类型
| EC 策略 | 得盘率 | |
|---|---|---|
| 推荐值 | 2+1 | 66.67% |
| 4+2 | 66.67% | |
| 8+3 | 72.73% | |
| 4+2:1 | 66.67% | |
| 8+2:1 | 80.00% | |
| 16+2:1 | 88.89% | |
| 自定义 | K/(K+M) | |
标准 EC
- 正常场景读写
标准 EC (K+M):以故障域为服务器级别的 4+2 EC 策略为例,写入数据时,系统将数据切分为 4 个相同大小的数据分片,同时通过校验算法生成 2 个同样大小的校验分片,系统将这 6 个数据分片随机存入 6 台服务器中。当任意 2 台服务器发生故障时,数据仍可正常使用。读取数据时,系统从 4 台服务器上的不同数据盘中读取数据块,将 4 个数据块拼装成完整数据后返回给用户。
图 11. EC (4+2)正常场景写数据 
图 12. EC (4+2)正常场景读数据 
- 故障场景读写
标准 EC (K+M):以故障域为服务器级别的 4+2 EC 策略为例,当故障后的剩余服务器数量小于 K+M 时,在故障恢复前系统会将新写入的数据存放在剩余的服务器上,保证 I/O 不中断的同时,可靠性级别也不降低,待故障恢复后,数据冗余策略重新恢复为 K+M。读取数据时,系统会从其它正常服务器中读取数据,通过校验算法恢复数据返回给用户。
图 13. EC (4+2)故障场景写数据 
图 14. EC (4+2)故障场景读数据 
折叠 EC
折叠 EC,也可以称之为亚节点 EC,也是一种常见的数据冗余技术。区别于标准 EC 的 K+M,折叠 EC 通常的配比形式为 K+M:B,其中 B 通常为 1。折叠 EC 在保证数据复制的高可靠性的同时,仍可以保持较高的硬盘利用率。
例如:标准 EC 最小故障域是存储节点,因此普通 EC 最小模式也至少需要 6 个节点。而折叠 EC 的 4+2:1 配比,最少仅需 3 个存储节点即可满足数据冗余要求。
此外,支持折叠 EC 和标准 EC 一样可以进行扩容和缩容,也可以在满足故障域要求的前提下,将折叠 EC 转化为标准 EC。
- 正常场景读写
折叠 EC (K+M:B):以故障域为服务器级别的 4+2:1 EC 策略为例,写入数据时,系统将数据切分为 4 个相同大小的数据分片,同时通过校验算法生成 2 个同样大小的校验分片,系统将这 6 个数据分片随机存入 5 台服务器中。当任意 1 台服务器发生故障时,数据仍可正常使用。读取数据时,系统从 3 台服务器上的不同数据盘中读取数据块,将 4 个数据块拼装成完整数据后返回给用户。
图 15. EC (4+2:1)正常场景写数据 
图 16. EC (4+2:1) 正常场景读数据 
- 故障场景读写
折叠 EC (K+M:B):以故障域为服务器级别的 4+2:1 EC 策略为例,当故障 1 台服务器或 M 块硬盘后,系统仍将按照 K+M 个数据块和校验块写入剩余正常服务器中。读取数据时,系统会从其它正常服务器中读取数据,通过校验算法恢复数据返回给用户。
图 17. EC (4+2:1)故障场景读数据 
副本和纠删码对比
- 空间利用率:纠删码的优势较大,以 4+2 的 EC 策略为例,其得盘率约为 66%,而 3 副本的空间利用率仅为 33.3%。
- 读写性能:副本和纠删码的读写性能在小块读写场景下有较大差异,在大块场景下,两者性能差距会逐渐缩小。纠删码在数据写入时涉及数据校验,且可能产生写惩罚,在数据读取时,因横跨多个节点,任何一个节点时延过高都可能对读写性能造成很大影响。而副本在数据读取时只需要读取 1 个完整分片即可,不涉及节点数据拼接。
- 重构性能:副本的优势往往更大,因为不涉及数据校验,只是单纯的数据拷贝,所以速度较快。而纠删码的重构涉及反向校验的计算过程,所需的读写数据量和 CPU 计算消耗都会更大。
- 容错性能:两种策略各有优劣势。副本方面,多副本技术可以允许(副本数-1)个非监控节点同时故障而不丢失数据;纠删码方面,以 4+2 的 EC 策略为例,可以允许 2 个非监控节点发生故障而不丢失数据。
故障域隔离
- 服务器级别:集群内每台服务器为一个故障域,一份数据的不同副本或分片分别存储在不同服务器中。
- 机架级别:集群内每个机架为一个故障域,一份数据的不同副本或分片分别存储在不同机架中。推荐集群规模较大、机架数量较多的情况选择此级别。
- 机房级别:集群内每个机房为一个故障域,一份数据的不同副本或分片分别存储在不同机房中。推荐集群规模大、机房数量较多的情况选择此级别。



通过故障域隔离技术,可将故障对业务的影响限制在某个范围内,避免出现“牵一发而动全身”的情况发生,从而提高业务连续性。
通过基于故障域的扩容技术,配合合理的存储策略,可以将新扩容的节点独立成一个硬盘池,避免了数据的迁移。这种方式能够实现业务的无感扩容,向应用屏蔽了底层存储的变更细节,避免了传统存储变更时需要业务系统同时变更的情况。这样一来,运维人员及业务人员的工作量大大减少,同时也能提高系统的可靠性和性能。
数据一致性检查
- Scrub 检查:针对元数据,其特点是执行时间短且执行周期频繁,建议每天执行数据一致性检查。支持自定义 Scrub 时间。
- Deep-Scrub 检查:针对数据,其特点是执行时间较长且对 I/O 有一定压力,建议在业务量低谷时进行。若超过 30 天未完成一次 Deep-Scrub 检查,将发出告警提示。
故障检测与自愈
存储服务支持自动故障监测和报警机制。该机制监控存储系统和各个存储服务器,检测到故障时将自动向平台发送告警消息。用户可另外添加邮箱报警器接收告警消息,以及时采取措施进行故障修复。
同时,检测到故障发生时,支持自动服务重启和数据迁移,最大程度上保障了数据的可靠、可用,从而形成高可靠、高可用的分布式存储系统。
数据重平衡
分布式存储支持数据重平衡,使存储集群中的数据均衡分布在各个存储服务器下的数据盘上,从而提高存储系统的性能和可靠性。
- 能根据存储池设置和存储服务器的负载情况,自动有将数据从负载较高的节点转移到负载较低的节点上,以达到负载均衡的效果。
- 存储集群中有服务器发生故障,或有新服务器加入集群时,将自动进行数据迁移,从而保证数据一致性和可靠性。
手动数据重平衡:
同时支持手动数据重平衡功能,用户可根据实际的数据分布情况,手动进行数据重平衡操作。
数据保护与恢复
数据保护与恢复覆盖快照、灾备、CDP 和系统配置备份等能力,用于在误操作、系统故障或灾难场景下保留可恢复的数据状态。
快照管理
- 集中式存储快照机制:本地存储/NFS/Shared Mount Point/Shared Block 使用 QCOW2 外部快照(External Snapshot),属于 ROW 快照机制的一种。
- 分布式存储快照机制:企业版 Ceph/Vhost/CBD 使用 ROW 快照技术。ZStack ZStone 使用 COW 快照。
集中式存储快照机制
关于 QCOW2 外部快照的说明。
- 快照链与快照树
通常一块磁盘对应一条快照链,支持对一块磁盘创建一棵快照树,快照树的每一个分支都是一条快照链。
图 21. 快照树 
快照树包括以下信息:- 快照链:磁盘的一组快照组成的关系链,快照树的每一个分支都是一条快照链。
- 快照节点:快照链中的一个节点,表示磁盘的一份快照。
- 快照容量:快照占用的存储空间。支持查看快照树中所有快照的总容量,以及单个快照节点的容量。
注:- 对于非 Ceph 存储,系统默认每条快照链最多有 128 个节点,用户可在全局设置中,通过修改云盘快照增量的最大数目自行设置快照链的最大长度。对于 Ceph 存储,单盘最大快照数量为 32,包括手动创建及自动创建的快照。
- 快照链长度达到上限后:
- 若继续创建自动快照,系统会自动删除最早的自动快照。
- 若继续创建手动快照,用户需手动删除不需要的快照。
- 在生产环境中,建议单块磁盘的快照数量尽量控制在 5 以内,快照过多会影响云主机/云盘的 IO 性能、数据安全以及主存储容量。如需长期备份,建议使用灾备服务。
- 创建快照
当一个外部快照被创建,实质是新建一个空白的 qcow2 文件,该空白文件的 backing file 指向旧 qcow2 文件,旧 qcow2 文件置为只读,于是旧 qcow2 文件自身成为一个快照,后续只对新 qcow2 文件写入数据。
- 基于 backing file 创建单条快照链。
图 22. 创建快照 单链 
假定已有一个原始镜像(Base),以该原始镜像为模板创建云主机 1,对云主机 1 依次创建快照 1A、快照 1B。- 原始镜像:一个已制作好的磁盘镜像文件,包含完整的操作系统以及引导程序,作为 Base(只读)。
- 云主机 1:新建空白文件 Overlay-1,backing file 指向 Base,Base 保持为只读,于是 Base 成为一个快照,后续只对 Overlay-1 写入数据。
- 快照 1A:新建空白文件 Overlay-1A,backing file 指向 Overlay-1,Overlay-1 置为只读,于是 Overlay-1 成为一个快照,后续只对 Overlay-1A 写入数据。
- 快照 1B:新建空白文件 Overlay-1B,backing file 指向 Overlay-1A,Overlay-1A 置为只读,于是 Overlay-1A 成为一个快照,后续只对 Overlay-1B 写入数据。云主机 1 使用的是快照链内最后一个快照 1B 对应的磁盘文件,快照 1B 为 Active。
- 基于 backing file 创建多条快照链。
图 23. 创建快照 多链 
假定已有一个原始镜像(Base),以该原始镜像为模板创建云主机 1、云主机 2、云主机 3,对云主机 1 依次创建快照 1A、快照 1B,对云主机 2 创建快照 2A,对云主机 3 创建快照 3A。- 原始镜像:一个已制作好的磁盘镜像文件,包含完整的操作系统以及引导程序,作为 Base(只读)。
- 快照链 1:
- 云主机 1:新建空白文件 Overlay-1,backing file 指向 Base,Base 保持为只读,于是 Base 成为一个快照,后续只对 Overlay-1 写入数据。
- 快照 1A:新建空白文件 Overlay-1A,backing file 指向 Overlay-1,Overlay-1 置为只读,于是 Overlay-1 成为一个快照,后续只对 Overlay-1A 写入数据。
- 快照 1B:新建空白文件 Overlay-1B,backing file 指向 Overlay-1A,Overlay-1A 置为只读,于是 Overlay-1A 成为一个快照,后续只对 Overlay-1B 写入数据。云主机 1 使用的是快照链 1 内最后一个快照 1B 对应的磁盘文件,快照 1B 为 Active。
- 快照链 2:
- 云主机 2:新建空白文件 Overlay-2,backing file 指向 Base,Base 保持为只读,后续只对 Overlay-2 写入数据。
- 快照 2A:新建空白文件 Overlay-2A,backing file 指向 Overlay-2,Overlay-2 置为只读,于是 Overlay-2 成为一个快照,后续只对 Overlay-2A 写入数据。云主机 2 使用的是快照链 2 内最后一个快照 2A 对应的磁盘文件,快照 2A 为 Active。
- 快照链 3:
- 云主机 3:新建空白文件 Overlay-3,backing file 指向 Base,Base 保持为只读,后续只对 Overlay-3 写入数据。
- 快照 3A:新建空白文件 Overlay-3A,backing file 指向 Overlay-3,Overlay-3 置为只读,于是 Overlay-3 成为一个快照,后续只对 Overlay-3A 写入数据。云主机 3 使用的是快照链 3 内最后一个快照 3A 对应的磁盘文件,快照 3A 为 Active。
- 基于 backing file 创建单条快照链。
- 合并快照
外部快照之间互相依赖(每一个 overlay 依赖它的 backing file),每个快照保存有相应数据,不可直接删除某个快照来缩短链长度。外部快照可通过向下合并(Blockcommit)或向上合并(Blockpull)两种方式来缩短链长度。
- 向下合并(Blockcommit)
在同一条快照链内,支持将 overlays 合并至 backing files。
图 24. 向下合并 
假定已有一个原始镜像(Base),基于 Base 创建云主机 1,并对云主机 1 创建 3 个互相依赖的外部快照,即:快照 1A、快照 1B、快照 1C。现将快照 1A、快照 1B 向下合并至云主机 1,于是快照 1C(Active)的 backing file 直接指向云主机 1,快照链缩短。快照 1A、快照 1B 不再有用,删除即可。
- 向上合并(Blockpull)
在同一条快照链内,支持将 backing files 合并至 overlays。
图 25. 向上合并 
假定已有一个原始镜像(Base),基于 Base 创建云主机 1,并对云主机 1 创建 3 个互相依赖的外部快照,即:快照 1A、快照 1B、快照 1C。现将快照 1A、快照 1B 向上合并至快照 1C(Active),于是快照 1C(Active)的 backing file 直接指向云主机 1,快照链缩短。快照 1A、快照 1B 不再有用,删除即可。
- 向下合并(Blockcommit)
分布式存储快照机制
企业版 Ceph 使用 ROW 快照技术,ZStack ZStone 使用 COW 快照技术。
灾备服务
灾备服务以业务数据恢复为目标,融合定时全量备份、定时增量备份等机制,对云主机、云盘和管理节点数据库等数据进行备份,并在数据误删、主存储数据损坏或数据中心灾难等场景下恢复业务数据。灾备服务包括数据备份和数据恢复两类关键机制。
数据备份
灾备服务支持基于 Qemu 块设备层的数据备份,各类型主存储上的云主机均支持备份。备份类型可分为:全量备份、增量备份。全量备份包含完整的数据集合,增量备份仅包含自上一次备份后所有更新的数据集合。全量备份和增量备份均仅备份真实数据。
默认情况下,备份策略是在首次全量备份后,每 63 个增量备份的下一次备份就会自动执行一次全量备份。这是因为增量备份之间有依赖关系,在做新的一次全量备份后,才能对之前的增量备份进行删除。实际上,系统内部有更智能灵活的应对策略来决定使用哪种合适的备份方式,以确保备份数据的安全可靠。
数据备份可分为三部分:数据复制、数据传输、数据保存。
数据复制
灾备模块利用 Qemu 块设备层的脏数据跟踪功能(Dirty Bitmap)实现备份数据的跟踪与导出。
云主机磁盘文件数据发生变化的位置被称为脏数据位置,Dirty Bitmap 记录自上次备份后,虚拟磁盘文件上产生脏数据的所有位置记录,根据位置记录,就可导出自上次备份后所有被修改过的数据,即增量的备份数据。最终全量备份文件和各个增量备份文件会产生一个完整的备份链,保存完整的数据。
云平台提供自适应的备份导出策略,后台会根据不同情况选择导出增量数据还是全量数据。Dirty Bitmap 存在于 Qemu 进程的内存中,云主机重启后就会丢失这部分信息,因此当云主机重启后云平台会自动选择导出全量备份数据。

数据传输
针对不同的虚拟化组件版本,支持两套不同的实现方案,主要区别在备份数据的传输上。
第一种方案:Data Over SSHFS。使用 SSHFS 在计算节点上挂载远程备份服务器的备份目录,然后将备份数据导入备份服务器。SSHFS 是一个简单的 FUSE Over SSH 方案,数据链路由 SSH 会话加密,每个备份任务有单独的 SSHFS 链路。

第二种方案:Data Over NBD。在备份服务器上使用 NBD 模块导出一个备份磁盘,然后在计算节点通过 Qemu 的块设备任务(Block-job),直接将备份数据导入备份磁盘。

数据保存
备份服务器支持多种存储介质,包括:SAN、NAS、磁盘阵列以及带库等。
备份数据在备份服务器中切片去重存放,备份数据会被切分成 64MB 大小的数据块,然后计算 Hash,建立索引。拥有相同 Hash 的数据块不会被存储多份。

数据恢复
从本地备份数据恢复云主机/云盘,会把备份服务器上的切片数据合并导入主存储中。
如果是非 Ceph 主存储,合并后的备份恢复数据会以磁盘链的形式存放;如果是 Ceph 主存储,会把磁盘链合并成单个磁盘文件存放。
如果是新建恢复,恢复到主存储的磁盘数据会被当作镜像缓存来创建新云主机/云盘;如果是覆盖恢复,会把恢复到主存储的磁盘路径更新到当前云主机/云盘的数据库记录中,随后删除旧的云主机/云盘文件。

CDP 服务
CDP 服务用于为云主机中的重要业务系统提供细粒度持续数据保护。通过 CDP 服务,用户可以将云主机数据恢复到指定时间状态,也可以在不恢复系统的情况下找回文件。CDP 服务包括数据备份、数据恢复和备份可靠性指标等能力。
数据备份
CDP 数据备份通过持续跟踪云主机数据变化,将变化数据同步到备份服务器,并形成可用于恢复的时间点数据状态。
数据复制
CDP 模块利用 Qemu 块设备层的脏数据跟踪功能(Dirty Bitmap)以及 Drive-mirror 实现备份数据的跟踪与导出。
云主机磁盘文件数据发生变化的位置被称为脏数据位置,Dirty Bitmap 记录自上次备份后,虚拟磁盘文件上产生脏数据的所有位置记录,根据位置记录,就可导出自上次备份后所有被修改过的数据,即增量的备份数据。
云平台提供自适应的备份导出策略,后台会根据不同情况选择导出增量数据还是全量数据。Dirty Bitmap 存在于 Qemu 进程的内存中,云主机重启后就会丢失这部分信息,因此当云主机重启后云平台会自动选择导出全量备份数据。

导出的备份数据通过 Drive-mirror 被导入保存至 CDP 备份服务器上的空白 QCOW2 磁盘文件中。空白的磁盘文件在创建 CDP 任务时会预先被创建出来,再通过 NBD 协议导出成一个网络上可访问的块设备,这样 CDP 备份任务就可把云主机的云盘数据持续导入至 CDP 备份服务器。

数据恢复点
云主机数据传输至 CDP 备份服务器上后,以 QCOW2 磁盘文件形式存放。针对 QCOW2 磁盘文件会有一个 Qemu 存储服务来提供各种保护策略下的数据恢复点。
CDP 任务的数据恢复点由 BP 点和 RP 点组成。BP 点以粗粒度形式按时间定期生成外部快照(默认 20 分钟),RP 点则可根据实际设置的 CDP 保护策略,最快以 1 秒 1 次记录 IO 变化来生成恢复点。
CDP 备份服务器首先会对云主机数据进行一次全量复制生成基本 BP 点,后续通过 Qemu 持续捕获 I/O 数据变化,将每次变化的 I/O 数据打上时间戳生成 RP 点并保存下来。恢复点的生成都是在 CDP 备份服务器上做的,对原云主机无任何影响。

数据恢复
CDP 数据恢复支持基于指定恢复点恢复云主机数据或找回文件,帮助用户在误操作、业务异常或恢复演练场景下验证并恢复数据。
找回文件
当因误删云主机丢失部分文件时,CDP 备份数据支持快速浏览备份文件,实现文件级别的数据恢复。用户可选择任意恢复点浏览恢复点中的文件和数据,也可预览文件内容,确认文件包含所需数据后,再选择下载文件或锁定恢复点做后续的数据恢复。

快速恢复
当云主机业务发生故障或遭受病毒需做整机数据恢复时,CDP 备份数据支持秒级快速恢复,满足业务快速恢复上线的需求。
快速恢复主要包含两个步骤:云主机快速拉起、云主机数据迁移。
在 CDP 备份服务器上,云主机备份数据以 QCOW2 磁盘格式存放。为实现快速拉起,首先会将备份的 QCOW2 磁盘通过 NBD 以网络块设备方式映射出来,然后云主机在计算节点上通过 NBD 来访问备份服务器上的云主机备份磁盘,此时云主机已正常提供业务,用户可正常读写云主机。
由于云主机磁盘尚未存放至主存储,后台会启动一个存储迁移任务,将备份服务器上的磁盘数据同步到主存储上。在该过程中,对云主机的修改写入均会被记录为脏页,一并同步至主存储的目标磁盘中。
当同步任务发现数据全部拷贝完成后,云主机会默认将磁盘路径动态切换成主存储的路径来访问。后台迁移过程会将云主机的所有数据均同步至主存储,并且整个过程对用户完全无感知,也不会对云主机业务产生影响。

备份可靠性指标
评估灾备系统可靠性有两个重要指标:RPO 与 RTO。RPO(Recovery Point Objective)指恢复点目标,强调灾难发生后,企业能容忍的数据丢失量。RTO(Recovery Time Objective)指恢复时间目标,强调灾难发生后,企业能容忍的数据恢复时间。
CDP 模块在云主机低负载情况下 RPO 与 RTO 最低均可达 1 秒。

系统配置备份
系统配置备份对于云平台来说至关重要。当云平台发生异常,或相关配置丢失时,可通过系统配置的备份数据进行恢复。
云平台提供备份服务模块,支持本地灾备、异地灾备、公有云灾备多种灾备方案。
