@
a7082633 (2) leader 执行过半写成功收到了 Follow 的响应(注意 leader 收到了过半写成功确认 ack ), 但是在 leader 向 Follow 发出 commit 指令的时候 leader 宕机了。
这个时候 集群进行 leader 选举。 选举后 集群内部会进行数据同步,这个没有被上一任 leader 提交的事务 会被新 leader 重新发出 事务提案到 所有 follow,然后所有 follow 执行事务并返回响应 ACK 到新 leader, 新 leader 执行 commit,从而实现 将这个事务应用到集群中每一台机器。
但是因为上一任 leader 宕机, 客户端会收到操作执行失败的结果。
比如客户端创建一个节点,集群内部显式节点创建成功,但是客户端却收到节点创建失败的结果。
------以上是对原问题的 重新描述--------
你说的“ follow 也没有收到 commit,也就是事务执行失败 ” 这话好像不太正确。
参考
https://blog.csdn.net/u010627840/article/details/100526648 这里面有下面一段话
比如 leader 发起提议 P1,并收到半数以上 follower 关于 P1 的 ACK 后,在广播 commit 消息之前宕机了,选举产生的新 leader 之前是 follower,未收到关于 P1 的 commit 消息,内存中是没有 P1 的数据。而 ZAB 协议的设计是需要保证选主后,P1 是需要应用到集群中的。这块的逻辑是通过选主后的数据同步来弥补。
也就是,follow 没有收到 commit,但是对于集群来说 这个事务 最终也会被集群中的所有节点执行。
但是对于客户端,因为 leader 宕机导致事务执行失败,