被丢弃的消息不能再次出现
當?leader?接收到消息請求生成?proposal?后就掛了,其他?follower?并沒有收到此?proposal,因此經過恢復模式重新選了?leader?后,這條消息是被跳過的。?此時,之前掛了的?leader?重新啟動并注冊成了?follower,他保留了被跳過消息的proposal?狀態,與整個系統的狀態是不一致的,需要將其刪除。
ZAB協議需要滿足上面兩種情況,就必須要設計一個leader選舉算法:能夠確保已經被leader提交的事務Proposal能夠提交、同時丟棄已經被跳過的事務Proposal。
針對這個要求
1. 如果leader選舉算法能夠保證新選舉出來的Leader服務器擁有集群中所有機器最高編號(ZXID最大)的事務Proposal,那么就可以保證這個新選舉出來的Leader一定具有已經提交的提案。因為所有提案被?COMMIT?之前必須有超過半數的?follower ACK,即必須有超過半數節點的服務器的事務日志上有該提案的?proposal,因此,只要有合法數量的節點正常工作,就必然有一個節點保存了所有被?COMMIT?消息的?proposal?狀態
2. 另外一個,zxid是64位,高32位是epoch編號,每經過一次Leader選舉產生一個新的leader,新的leader會將epoch號+1,低32位是消息計數器,每接收到一條消息這個值+1,新leader選舉后這個值重置為0.這樣設計的好處在于老的leader掛了以后重啟,它不會被選舉為leader,因此此時它的zxid肯定小于當前新的leader。當老的leader作為follower接入新的leader后,新的leader會讓它將所有的擁有舊的?epoch?號的未被?COMMIT?的?proposal?清除
?
總結
以上是生活随笔為你收集整理的被丢弃的消息不能再次出现的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 已经被处理的消息不能丢
- 下一篇: 关于ZXID
