跳转至

优化滚动更新中的 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参数,设置为truefalse,以控制滚动更新的速度。

enableForceUpdatetrue时,表示不迁移分片 Leader 副本,从而加快滚动更新的速度;反之,表示迁移分片 Leader 副本,以保证集群的读写可用性。默认值为false

Warning

设置enableForceUpdatetrue时,确保没有流量进入集群进行读写操作。因为该设置会强制重建集群 Pod,此过程会发生数据丢失或客户端请求失败的情况。

配置示例:

...
spec:
...
  storaged:
    enableForceUpdate: true // 设置为 true 时,表示不迁移分片 Leader 副本,而是直接重建集群 Pod。
    ...

最后更新: May 23, 2024