各位大大好,最近看了zookeeper、zab的一些设计思想,有几个问题实在想不明白,虚心求教
如果有A、B、C三台服务器,A是leader:
- client客户端发送写请求,A广播提案set /abc "value",写事务日志
- B与C收到提案然后写事务日志,BC成功回复ack,然后A发送commit给BC
- B发送ack后、收commit前与A发生网络分区
- A认为按提案已经收到大多数follow的回复,给client回复成功
疑问点有:
- 针对c,此时如果有client读请求到B get /abc,B还能回复abc么???是不是因为B与A建立了tcp长链接,发生分区后tcp断线,然后B变成LOOKING,LOOKING不会响应客户端读请求
- 针对a与b的写事务日志,因为zookeeper一开始是写到os的文件buffer中,又有配置syncforce来设置是否直接fsync,那么leader给follower发送的commit,到底commit了什么??客户端能读到follower已经发送ack了但是还没收到leader commit的数据么???
还有一些实际应用中的问题:
- 了解到kafka-zookeeper比较难运维,难点是zookeeper比较难运维,难点是什么呢???
- 现在如果对一致性要求不是那么强的场景下,是不是etcd比zookeeper更优,感觉zookeeper的watch太拉了(只告诉我发生了什么动作,不告诉我发送了什么数据的变更)
谢谢各位大大指教