优化滚动更新中的 Leader 分布¶
NebulaGraph 集群使用分布式架构将数据分成多个逻辑分片,这些分片通常均分在不同的节点上。分布式系统中,同一份数据通常会有多个副本。为了保证多个副本数据的一致性,NebulaGraph 集群使用 Raft 协议实现了多分片副本同步。Raft 协议中,每个分片都会选举出一个 Leader 副本,Leader 副本负责处理写请求,Follower 副本负责处理读请求。
通过 Operator 创建的 NebulaGraph 集群在滚动更新过程中,一个存储节点会暂时停止提供服务以进行更新。关于滚动更新的概述,参见执行滚动更新。如果 Leader 副本所在的节点停止提供服务,会导致该分片的读写不可用。为了避免这种情况,Operator 会在 NebulaGraph 集群滚动更新过程中,默认将 Leader 副本迁移到其他未受影响节点上。这样,当一个存储节点处于更新状态时,其他节点上的 Leader 副本能够继续处理客户端请求,以保证集群的读写可用性。
一个存储节点上的所有 Leader 副本全部迁移到其他节点的这个过程可能会持续较长时间。为了更好地控制滚动更新的时间,Operator 提供了一个名为enableForceUpdate
参数。当确定没有外部访问流量时,可将该参数设置为true
,这样,Leader 副本将不会被迁移到其他节点上,从而加快滚动更新的速度。
滚动更新触发条件¶
Operator 会在以下情况下触发 NebulaGraph 集群的滚动更新:
- NebulaGraph 集群的版本发生变化。
- NebulaGraph 集群的配置发生变化。
- NebulaGraph 集群的服务执行重启操作。
配置滚动更新策略¶
在创建集群实例的 YAML 文件中,添加spec.storaged.enableForceUpdate
参数,设置为true
或false
,以控制滚动更新的速度。
当enableForceUpdate
为true
时,表示不迁移分片 Leader 副本,从而加快滚动更新的速度;反之,表示迁移分片 Leader 副本,以保证集群的读写可用性。默认值为false
。
Warning
设置enableForceUpdate
为true
时,确保没有流量进入集群进行读写操作。因为该设置会强制重建集群 Pod,此过程会发生数据丢失或客户端请求失败的情况。
配置示例:
...
spec:
...
storaged:
enableForceUpdate: true // 设置为 true 时,表示不迁移分片 Leader 副本,而是直接重建集群 Pod。
...