虚心求教zookeeper、zab的一些疑惑

334 阅读1分钟

各位大大好,最近看了zookeeper、zab的一些设计思想,有几个问题实在想不明白,虚心求教

如果有A、B、C三台服务器,A是leader:

  1. client客户端发送写请求,A广播提案set /abc "value",写事务日志
  2. B与C收到提案然后写事务日志,BC成功回复ack,然后A发送commit给BC
  3. B发送ack后、收commit前与A发生网络分区
  4. A认为按提案已经收到大多数follow的回复,给client回复成功

疑问点有:

  1. 针对c,此时如果有client读请求到B  get /abc,B还能回复abc么???是不是因为B与A建立了tcp长链接,发生分区后tcp断线,然后B变成LOOKING,LOOKING不会响应客户端读请求
  2. 针对a与b的写事务日志,因为zookeeper一开始是写到os的文件buffer中,又有配置syncforce来设置是否直接fsync,那么leader给follower发送的commit,到底commit了什么??客户端能读到follower已经发送ack了但是还没收到leader commit的数据么???

还有一些实际应用中的问题:

  1. 了解到kafka-zookeeper比较难运维,难点是zookeeper比较难运维,难点是什么呢???
  2. 现在如果对一致性要求不是那么强的场景下,是不是etcd比zookeeper更优,感觉zookeeper的watch太拉了(只告诉我发生了什么动作,不告诉我发送了什么数据的变更)

谢谢各位大大指教