Skip to content

第 14 章 数据自愈与一致性

14.1 GlusterFS 自愈机制

当复制卷中的某个 brick 离线后恢复,该 brick 上的数据可能与其他副本不一致。GlusterFS 会自动检测并修复这种不一致,这个过程称为 自愈(Self-Healing)

自愈触发方式

  1. 自动自愈:访问文件时触发
  2. 后台自愈:glustershd 守护进程自动扫描
  3. 手动触发:管理员执行 heal 命令

查看自愈状态

bash
gluster volume heal gv0 info

输出示例:

Brick node1:/data/brick1/gv0
Status: Connected
Number of entries: 0

Brick node2:/data/brick1/gv0
Status: Connected
Number of entries: 0

Brick node3:/data/brick1/gv0
Status: Connected
Number of entries: 0

14.2 Split-Brain 脑裂问题

什么是脑裂

脑裂(Split-Brain)发生在网络分区时,不同分区中的节点都认为自己是主节点,继续接受写操作,导致副本数据 diverge。

网络分区
Node1, Node2 认为 Node3 离线
Node3 认为 Node1, Node2 离线

客户端 A 写入 Node1/Node2
客户端 B 写入 Node3

恢复后,Node1/Node2 和 Node3 数据不一致

脑裂的危害

  • 数据不一致
  • 无法自动确定哪个副本是正确的
  • 需要手动干预修复

14.3 仲裁与信任池

3 副本卷的仲裁

3 副本卷中,写入操作需要至少 2 个 brick 成功。因此:

  • 单节点故障时,剩余 2 个节点可以继续写入
  • 如果网络分为 1+2,2 个节点的分区可以继续工作,1 个节点的分区停止写入

服务器仲裁

启用服务器仲裁后,只有超过半数节点在线时,卷才允许写入:

bash
gluster volume set gv0 cluster.server-quorum-type server

客户端仲裁

客户端仲裁要求写入时至少 majority 个副本可用:

bash
gluster volume set gv0 cluster.quorum-type auto

14.4 手动触发 heal

触发自愈

bash
gluster volume heal gv0

查看 heal 进度

bash
gluster volume heal gv0 info summary

查看失败条目

bash
gluster volume heal gv0 info failed

14.5 脑裂检测与修复

检测脑裂

bash
gluster volume heal gv0 info split-brain

修复方法

方法 1:选择较大的副本

bash
gluster volume heal gv0 split-brain bigger-file <file-path>

方法 2:选择最新的副本

bash
gluster volume heal gv0 split-brain latest-mtime <file-path>

方法 3:选择指定 brick

bash
gluster volume heal gv0 split-brain source-brick <brick-path> <file-path>

预防脑裂

  1. 使用奇数节点(3、5、7...)
  2. 启用服务器仲裁和客户端仲裁
  3. 保证网络稳定
  4. 避免单节点长时间离线后又重新加入

14.6 本章小结

  • GlusterFS 自动检测并修复副本不一致
  • 脑裂是分布式存储中需要重点关注的问题
  • 仲裁机制可有效避免脑裂
  • 手动 heal 命令用于触发修复和处理脑裂
  • 预防胜于治疗,网络和仲裁配置很重要

练习题

  1. 什么是 GlusterFS 的自愈机制?
  2. 脑裂是如何产生的?有什么危害?
  3. 3 副本卷为什么能天然避免 1 节点分区继续写入?
  4. 如果发现脑裂,应该如何修复?