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

时间:2014-07-08 15:26:19

标签: java python apache-zookeeper distributed-transactions 2phase-commit

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

  • 协调员C注册交易节点/app/tx
  • 为每个参与方/app/tx/%d (Ni)
  • 注册处理节点
  • 在每个参与方节点Ni
  • 上设置观察者
  • 通知每个Ni新交易tx
  • Ni检查其节点是否已创建
  • Ni将事务设置为prepare()/ abort()
  • C收到所有各方的结果并决定中止/继续
  • 如果继续,则每个Ni执行查询
  • N我通知C ok / fail
  • C决定abort | commit
  • C通知每个人结果。
  • tx已提交

但我不确定这是一个正确的方向吗?而且我不确定如何在python kazoo或任何其他语言(Java)中实现它?如果您能通过提供片段或更正我的算法来帮助我,那会很好吗? 此外,如何扩展此协议以进行动物园间管理员通信?比方说,我们维护多个不同的zookeeper集群,这些集群被包装到区域或任何其他抽象实体中,我们希望使用两阶段提交在特定区域上执行此类显式事务?

1 个答案:

答案 0 :(得分:0)

基于2PC using Zk的算法的重要调整是,

  • 协调员C注册事务节点/ app / tx
  • 协调员通知客户有关交易的信息
  • 当在其下创建节点时,协调器在/ app / tx上设置WATCH
  • 每个客户创建一个ephimeral node / app / tx / node_i,决定准备/中止
  • 客户端在节点上设置监视
  • Coorindator决定在等待超时或创建所有节点后提交/中止
  • 协调员更改每个客户端的ephimeral节点的值以提交/中止
  • 客户提交/中止交易
  • 客户端将节点值更新为已确认