問題:
當(dāng) raft group 發(fā)生腦裂的情況下枫疆,老的 raft leader 可能在一段時間內(nèi)并不知道新的 leader 已經(jīng)被選舉出來,這時候客戶端在老的 leader 上可能會讀取出陳舊的數(shù)據(jù)(stale read)慈迈。
比如璧微,我們假想一個擁有 5 個節(jié)點的 raft group:
其中 Node 5 是當(dāng)前的 raft leader,當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)時片橡,在 Node 5 的 raft lease 任期還沒結(jié)束的一段時間內(nèi),Node 5 仍然認(rèn)為自己是當(dāng)前 term 的 leader淮野,但是此時捧书,另外一邊分區(qū)已經(jīng)在新的 term 中選出了新的 leader。
如果此時录煤,客戶端在新的 leader 上更新了某個值 x鳄厌,此時是可以更新成功的(因為還是可以復(fù)制到多數(shù)派)。但是在分區(qū)的另一端妈踊,此時一個客戶端去讀取 x 的值,Node 5 還會返回老的值泪漂,這樣就發(fā)生了 stale read廊营。
解決方案
引入一個新的概念, region leader。region leader 是一個邏輯上的概念, 任意時刻對于某一個 region 來說, 一定只擁有一個 region leader, 每個 region leader 在任期之內(nèi)嘗試每隔 t 時間間隔, 在 raft group 內(nèi)部更新一下 region leader 的 lease. 所有的讀寫請求都必須通過 region leader 完成萝勤,
但是值得注意的是露筒, region leader 和 raft leader 可能不是一個節(jié)點,當(dāng) region leader 和 raft leader 不重合的時候敌卓,region leader 會將請求轉(zhuǎn)發(fā)給當(dāng)前的 raft leader慎式,當(dāng)網(wǎng)絡(luò)出現(xiàn)分區(qū)時,會出現(xiàn)以下幾種情況:
- region leader 落在多數(shù)派,老 raft leader 在多數(shù)派這邊
- region leader 落在多數(shù)派瘪吏,老 raft leader 在少數(shù)派這邊
- region leader 落在少數(shù)派癣防,老 raft leader 在多數(shù)派這邊
- region leader 落在少數(shù)派,老 raft leader 在少數(shù)派這邊
用開篇的例子來分情況討論:
對于第一種情況掌眠,region leader 的 lease 不會過期蕾盯,因為 region leader 的心跳仍然能更新到多數(shù)派的節(jié)點上,老的 raft leader 仍然能同步到大多數(shù)節(jié)點上蓝丙,少數(shù)派這邊也不會選舉出新的 leader级遭, 這種情況下不會出現(xiàn) stale read。
第二種情況渺尘,就是開篇提到會出現(xiàn) stale read 的典型情況挫鸽,老的 raft leader 被分到了少數(shù)派這邊,多數(shù)派這邊選舉出了新的 raft leader 鸥跟,如果此時的 region leader 在多數(shù)派這邊掠兄。
因為所有的讀寫請求都會找到 region leader 進(jìn)行,即使在原來沒有出現(xiàn)網(wǎng)絡(luò)分區(qū)的情況下锌雀,客戶端的請求也都是要走 node 1 蚂夕,經(jīng)由 node 1 轉(zhuǎn)發(fā)給 node 5,客戶端不會直接訪問 node 5腋逆,所以此時即使網(wǎng)絡(luò)出現(xiàn)分區(qū)婿牍,新 leader 也正好在多數(shù)派這邊,讀寫直接就打到 node 1 上惩歉,皆大歡喜等脂,沒有 stale read。
第三種情況撑蚌,region leader 落在少數(shù)派這邊上遥,老 raft leader 在多數(shù)派這邊,這種情況客戶端的請求找到 region leader争涌,他發(fā)現(xiàn)的無法聯(lián)系到 leader(因為在少數(shù)派這邊沒有辦法選舉出新的 leader)粉楚,請求會失敗,直到本次 region leader 的 lease 過期亮垫,同時新的 region leader 會在多數(shù)派那邊產(chǎn)生(因為新的 region leader 需要嘗試走一遍 raft 流程)模软。因為老的 region leader 沒辦法成功的寫入,所以也不會出現(xiàn) stale read饮潦。但是付出的代價是在 region leader lease 期間的系統(tǒng)的可用性燃异。
第四種情況和第三種情況類似,多數(shù)派這邊會產(chǎn)生新的 raft leader 和 region leader继蜡。
總體來說回俐,這種方法犧牲了一定的可用性(在腦裂時部分客戶端的可用性)換取了一致性的保證逛腿。