如何在Zookeeper集群中实现2pc?

2 投票
1 回答
2684 浏览
提问于 2025-04-18 12:30

我有一个关于在Zookeeper集群中实现两阶段提交协议的问题,目的是为了协调多个客户端之间的某些事务。目前我有以下的想法:

  • 协调者 C 注册一个事务节点 /app/tx
  • 为每个参与方注册处理节点 /app/tx/%d (Ni)
  • 在每个参与方节点 Ni 上设置观察者
  • 通知每个 Ni 有新的事务 tx
  • Ni 检查它的节点是否已创建
  • Ni 设置事务为准备中(prepare)或中止(abort)
  • C 收到所有参与方的结果后决定是中止还是继续
  • 如果继续,每个 Ni 执行查询
  • Ni 用成功或失败的结果通知 C
  • C 决定是中止还是提交
  • C 通知所有人结果
  • tx 被提交

但我不确定这个方向是否正确?我也不确定如何在Python的Kazoo库或其他语言(比如Java)中实现这个。能否提供一些代码片段或纠正我的算法?另外,如何扩展这个协议以实现Zookeeper之间的通信?比如,我们维护多个不同的Zookeeper集群,这些集群被划分到不同的区域或其他抽象实体中,我们希望在特定区域内使用两阶段提交来执行这样的显式事务?

1 个回答

0

根据使用Zk的两阶段提交(2PC),你可以对算法进行一些重要的调整,具体步骤如下:

  • 协调者C注册一个事务节点,路径是/app/tx
  • 协调者通知客户端有关事务的情况
  • 当节点在/app/tx下创建时,协调者会在这个路径上设置一个监视(WATCH)
  • 每个客户端会创建一个临时节点,路径是/app/tx/node_i,并决定是准备(prepare)还是放弃(abort)
  • 客户端在这个节点上设置监视
  • 协调者在等待超时或者所有节点创建完成后,决定是提交(commit)还是放弃(abort)
  • 协调者会改变每个客户端的临时节点的值,以表示是提交还是放弃
  • 客户端根据协调者的决定进行提交或放弃事务
  • 客户端更新节点的值为已确认(acknowledged)

撰写回答