leader選舉
目標 :確保所以log的entry 傳送方向是: leader -> follower
策略:選出的leader就包含所有term中已經(jīng)提交的log entry
目標:選出包含所有term中已經(jīng)提交的log entry的leader
策略:只向比自己更新的cadidate投票。
更新:
1 最后一條log entry 的term 大的更新。
2 在1 條件下,日志更長的更新。
如何提交之前任期內(nèi)的log entry

如圖的時間序列展示了為什么 leader 無法判斷老的任期號內(nèi)的日志是否已經(jīng)被提交。在 (a) 中,S1 是 leader ,部分地復(fù)制了索引位置 2 的日志條目。在 (b) 中,S1 崩潰了,然后 S5 在任期 3 中通過 S3、S4 和自己的選票贏得選舉,然后從客戶端接收了一條不一樣的日志條目放在了索引 2 處。然后到 (c),S5 又崩潰了;S1 重新啟動,選舉成功,繼續(xù)復(fù)制日志。此時,來自任期 2 的那條日志已經(jīng)被復(fù)制到了集群中的大多數(shù)機器上,但是還沒有被提交。如果 S1 在 (d) 中又崩潰了,S5 可以重新被選舉成功(通過來自 S2,S3 和 S4 的選票),然后覆蓋了他們在索引 2 處的日志。但是,在崩潰之前,如果 S1 在自己的任期里復(fù)制了日志條目到大多數(shù)機器上,如 (e) 中,然后這個條目就會被提交(S5 就不可能選舉成功)。 在這種情況下,之前的所有日志也被提交了。
在c狀態(tài)下 對于 2 號log entry 是否已經(jīng)做過commit(雖然副本數(shù)已經(jīng)過半),leader能否做出判斷?
答案: 不能
因為如果此時如果認為2 號log entry 已經(jīng)提交,并且將2號應(yīng)用與狀態(tài)機,那么接下來的可能的發(fā)展方向是什么呢?
d 狀態(tài)是一種發(fā)展方向,此時2號entry完全覆蓋掉了,一個被commit(或者應(yīng)用到狀態(tài)機) 的entry竟然被覆蓋掉了,what? 這能忍嗎?顯然不行。
如何避免?
我們發(fā)現(xiàn)如果朝著 e方向發(fā)展,在e的狀態(tài)下,認為2是提交的完全沒有問題(不可能再有任何情況會將2 覆蓋掉)。
那么e是什么狀態(tài)呢?
e 的狀態(tài)在當(dāng)前(最新的)任期內(nèi)commit了一條新的 log entry。
所以:
老任期內(nèi)的log entry被當(dāng)前任期內(nèi)的新(對新 log entry)commit 間接提交。
換句話說: 老任期內(nèi)的log entry 能不能看做是被提交的還得依賴后面有沒有新的log entry commit過。