Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
343 views
in Technique[技术] by (71.8m points)

zookeeper 保证数据一致性的问题

(1)执行过半写成功并commit的数据 ,集群内部会保证所有机器都执行了这个事务,同时zk客户端收到 操作成功的提示。这个是一致性状态,包括集群内部一致性, 客户端响应结果与集群内部状态一致。

(2)如果leader执行过半写 但在commit之前 宕机了,那么会选举新的leader,此时选举之后进行数据同步,这个尚未commit的事务最终也会在集群内部达到一致性,但是对于客户端来说 这个操作执行失败了。
此时不就出现问题了吗?比如客户端创建一个节点,集群内部显式节点创建成功,但是客户端却收到节点创建失败的结果

(3)如果leader 在将事务A的提案发送给FollowA后宕机了,集群中其他follow节点没有收到事务A的提案,经过leader选举和数据同步之后,事务A的提案应该 会在集群中所有节点都执行并提交(这个理解应该没什么问题吧?),但是此时客户端收到了操作失败的响应结果,而集群内部却显式事务执行成功并提交。 这不就出现不一致了吗?

问题:zk如何解决2和3中出现的问题的?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Zab 原子广播协议,类似两阶段提交。

对于2,如果leader执行commit,客户端也收到成功。如果尚未commit,集群各个节点不会接收到proposal的commit同步,leader宕机,客户端收到失败。

对于3,如果leader 在将事务A的提案发送给FollowA后宕机了,集群中其他follow节点没有收到事务A的提案,此提案并不会生效。即使触发选举,也不会生效。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...