Skip to content

如何进行成员变更

Haochuan Cui edited this page Nov 10, 2016 · 1 revision

对成员机器进行增删改是必然要面临的问题,这个问题在PhxPaxos已经得到很好的解决

启用PhxPaxos内置的成员管理下的变更成员方法

如何开启成员管理,请参考options.h参数中文说明下的bUseMembership参数说明。

初始化集群

  • 准备好所有集群节点机器,机器启动PhxPaxos的时候设置好成员列表(Options::vecNodeInfoList)。
  • 在任意一个节点发起一个Propose操作,即可完成集群初始化。
  • 初始化操作会在所有节点机器都将这个成员列表固话到磁盘,并交由PhxPaxos管理,同时生成集群唯一的签名ID,当不同集群之间发生网络串包的时候,签名ID可以拒绝请求已保护集群数据的一致性。
  • 当集群初始化完成后,可通过Node::ShowMembership获得当前集群的成员列表,并且在这之后,集群的节点启动将不再信任Options::vecNodeInfoList

在已有集群新增,替换机器

  • 准备好新的机器,新的机器以空成员启动PhxPaxos(Options::vecNodeInfoList设置为空)。
  • 在任意一个已有的集群成员节点中调用Node::AddMemberNode::ChangeMember

在已有集群删除机器

  • 在任意一个已有的成员节点中调用Node::RemoveMember

如果所有节点都希望立即获得这个成员变更操作的通知,可通过options.h设置Options::pMembershipChangeCallback回调函数。

不不不启用PhxPaxos内置的成员管理下的变更成员方法

这里强调一下,如果不开启PhxPaxos内置成员管理,并不能100%的严格保证数据一致性。但我相信不少开发者可能在已有的体系里面很难做到上文所述的在线更换成员,而是更多的通过配置重启的方法来更新,那么对于这种做法这里仍然给出一个大幅降低出错概率的变更方法。

最好的做法是所有节点都停止运行,然后更新Options::vecNodeInfoList,最后再全部重启,但这种做法对在线服务来说几乎不可行。 下面给出一些可行的方法。

增加成员

增加成员必须每次只能增加一台机器。如果要增加多台机器,那么需要重复执行增加一台机器的所有步骤。

  • 准备好新节点机器,并设置好新的成员列表Options::vecNodeInfoList,启动PhxPaxos。
  • 间隔逐台重启集群已有节点,并同时更新成员列表Options::vecNodeInfoList

删除成员

删除成员必须每次只能删除一台机器。

  • 将需要删除的成员机器停止运行PhxPaxos。
  • 间隔逐台重启集群已有节点,并同时更新成员列表Options::vecNodeInfoList

替换成员

每次只能替换一台机器。

  • 准备好替换节点机器,并设置好新的成员列表Options::vecNodeInfoList,启动PhxPaxos。
  • 将需要被替换的成员机器停止运行PhxPaxos。
  • 观察余下节点是否运行正常,并保证至少观察到一次Propose成功(这是为了保证余下节点的多数派数据已经对齐)。
  • 间隔逐台重启集群已有节点,并同时更新成员列表Options::vecNodeInfoList