如何在Zookeeper集群中实现2pc?
我有一个关于在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)