分布式系统原理 之3 Lease机制
分布式系統(tǒng)原理
Lease機(jī)制
Lease 機(jī)制是最重要的分布式協(xié)議,廣泛應(yīng)用于各種實(shí)際的分布式系統(tǒng)中。即使在某些系統(tǒng)中相似的設(shè)計(jì)不被稱為 lease,但我們可以分析發(fā)現(xiàn)其本質(zhì)就是一種 lease 的實(shí)現(xiàn)。
本節(jié)從一個(gè)分布式cache 系統(tǒng)出發(fā)介紹最初的 lease 機(jī)制,接著加以引申,探討 lease 機(jī)制的本質(zhì)。最后介紹了 lease 機(jī)制最重要的應(yīng)用:判定節(jié)點(diǎn)狀態(tài)。
1. 基于 lease 的分布式 cache 系統(tǒng)
本節(jié)先通過討論一種分布式 cache 系統(tǒng)的實(shí)例來介紹 lease 機(jī)制。Lease 機(jī)制最初也是被運(yùn)用于這種系統(tǒng)。
基本的問題背景如下:在一個(gè)分布式系統(tǒng)中,有一個(gè)中心服務(wù)器節(jié)點(diǎn),中心服務(wù)器存儲(chǔ)、維護(hù)著一些數(shù)據(jù),這些數(shù)據(jù)是系統(tǒng)的元數(shù)據(jù)。系統(tǒng)中其他的節(jié)點(diǎn)通過訪問中心服務(wù)器節(jié)點(diǎn)讀取、修改其上的元數(shù)據(jù)。由于系統(tǒng)中各種操作都依賴于元數(shù)據(jù),如果每次讀取元數(shù)據(jù)的操作都訪問中心服務(wù)器節(jié)點(diǎn),那么中心服務(wù)器節(jié)點(diǎn)的性能成為系統(tǒng)的瓶頸。為此,設(shè)計(jì)一種元數(shù)據(jù) cache,在各個(gè)節(jié)點(diǎn)上cache 元數(shù)據(jù)信息,從而減少對(duì)中心服務(wù)器節(jié)點(diǎn)的訪問,提高性能。另一方面,系統(tǒng)的正確運(yùn)行嚴(yán)格依賴于元數(shù)據(jù)的正確,這就要求各個(gè)節(jié)點(diǎn)上 cache 的數(shù)據(jù)始終與中心服務(wù)器上的數(shù)據(jù)一致,cache中的數(shù)據(jù)不能是舊的臟數(shù)據(jù)。最后,設(shè)計(jì)的 cache 系統(tǒng)要能最大可能的處理節(jié)點(diǎn)宕機(jī)、網(wǎng)絡(luò)中斷等異常,最大程度的提高系統(tǒng)的可用性。
為此,利用 lease 機(jī)制設(shè)計(jì)一套 cache 系統(tǒng),其基本原理為如下。中心服務(wù)器在向各節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí)同時(shí)向節(jié)點(diǎn)頒發(fā)一個(gè) lease。每個(gè) lease 具有一個(gè)有效期,和信用卡上的有效期類似,lease 上的有效期通常是一個(gè)明確的時(shí)間點(diǎn),例如 12:00:10,一旦真實(shí)時(shí)間超過這個(gè)時(shí)間點(diǎn),則 lease 過期失效。這樣 lease 的有效期與節(jié)點(diǎn)收到 lease 的時(shí)間無(wú)關(guān),節(jié)點(diǎn)可能收到 lease 時(shí)該 lease 就已經(jīng)過期失效。這里首先假設(shè)中心服務(wù)器與各節(jié)點(diǎn)的時(shí)鐘是同步的,下節(jié)中討論時(shí)鐘不同步對(duì) lease 的影響。中心服務(wù)器發(fā)出的 lease 的含義為:在 lease 的有效期內(nèi),中心服務(wù)器保證不會(huì)修改對(duì)應(yīng)數(shù)據(jù)的值。因此,節(jié)點(diǎn)收到數(shù)據(jù)和 lease 后,將數(shù)據(jù)加入本地 Cache,一旦對(duì)應(yīng)的 lease 超時(shí),節(jié)點(diǎn)將對(duì)應(yīng)的本地 cache數(shù)據(jù)刪除。中心服務(wù)器在修改數(shù)據(jù)時(shí),首先阻塞所有新的讀請(qǐng)求,并等待之前為該數(shù)據(jù)發(fā)出的所有l(wèi)ease 超時(shí)過期,然后修改數(shù)據(jù)的值。
具體的服務(wù)器與客戶端節(jié)點(diǎn)一個(gè)基本流程如下:
流程 2.3.1:基于 lease 的 cache,客戶端節(jié)點(diǎn)讀取元數(shù)據(jù): 1. 判斷元數(shù)據(jù)是否已經(jīng)處于本地 cache 且 lease 處于有效期內(nèi) 1.1 是:直接返回 cache 中的元數(shù)據(jù) 1.2 否:向中心服務(wù)器節(jié)點(diǎn)請(qǐng)求讀取元數(shù)據(jù)信息1.2.1 服務(wù)器收到讀取請(qǐng)求后,返回元數(shù)據(jù)及一個(gè)對(duì)應(yīng)的 lease1.2.2 客戶端是否成功收到服務(wù)器返回的數(shù)據(jù)1.2.2.1 失敗或超時(shí):退出流程,讀取失敗,可重試1.2.2.2 成功:將元數(shù)據(jù)與該元數(shù)據(jù)的 lease 記錄到內(nèi)存中,返回元數(shù)據(jù) 流程 2.3.2:基于 lease 的 cache,客戶端節(jié)點(diǎn)修改元數(shù)據(jù)流程 1. 節(jié)點(diǎn)向服務(wù)器發(fā)起修改元數(shù)據(jù)請(qǐng)求。 2. 服務(wù)器收到修改請(qǐng)求后,阻塞所有新的讀數(shù)據(jù)請(qǐng)求,即接收讀請(qǐng)求,但不返回?cái)?shù)據(jù)。 3. 服務(wù)器等待所有與該元數(shù)據(jù)相關(guān)的 lease 超時(shí)。 4. 服務(wù)器修改元數(shù)據(jù)并向客戶端節(jié)點(diǎn)返回修改成功上述機(jī)制可以保證各個(gè)節(jié)點(diǎn)上的 cache 與中心服務(wù)器上的中心始終一致。這是因?yàn)橹行姆?wù)器節(jié)點(diǎn)在發(fā)送數(shù)據(jù)的同時(shí)授予了節(jié)點(diǎn)對(duì)應(yīng)的 lease,在 lease 有效期內(nèi),服務(wù)器不會(huì)修改數(shù)據(jù),從而客戶端節(jié)點(diǎn)可以放心的在 lease 有效期內(nèi) cache 數(shù)據(jù)。
述基礎(chǔ)流程有一些性能和可用性上的問題,但可以很容易就優(yōu)化改性。優(yōu)化點(diǎn)一:服務(wù)器在修改元數(shù)據(jù)時(shí)首先要阻塞所有新的讀請(qǐng)求,造成沒有讀服務(wù)。進(jìn)一步的優(yōu)化是,當(dāng)進(jìn)入修改流程,服務(wù)器頒發(fā)的lease 有效期限選擇為已發(fā)出的 lease 的最大有效期限。實(shí)際使用中,第一層優(yōu)化就足夠了。優(yōu)化點(diǎn)二:服務(wù)器在修改元數(shù)據(jù)時(shí)需要等待所有的 lease 過期超時(shí),從而造成修改元數(shù)據(jù)的操作時(shí)延大大增大。優(yōu)化的方法是,在等待所有的 lease 過期的過程中,服務(wù)器主動(dòng)通知各個(gè)持有l(wèi)ease的節(jié)點(diǎn)放棄lease并清除cache中的數(shù)據(jù),如果服務(wù)器收到客戶端返回的確認(rèn)放棄lease的消息,則服務(wù)器不需要在等待該 lease 超時(shí)。
2. lease 機(jī)制的分析
首先給出本文對(duì) lease 的定義:Lease 是由頒發(fā)者授予的在某一有效期內(nèi)的承諾。
頒發(fā)者一旦發(fā)出 lease,則無(wú)論接受方是否收到,也無(wú)論后續(xù)接收方處于何種狀態(tài),只要 lease 不過期,頒發(fā)者一定嚴(yán)守承諾;另一方面,接收方在 lease的有效期內(nèi)可以使用頒發(fā)者的承諾,但一旦 lease 過期,接收方一定不能繼續(xù)使用頒發(fā)者的承諾。
Lease 機(jī)制具有很高的容錯(cuò)能力。首先,通過引入有效期,Lease 機(jī)制能否非常好的容錯(cuò)網(wǎng)絡(luò)異常。再者,Lease 機(jī)制能較好的容錯(cuò)節(jié)點(diǎn)宕機(jī)。最后,lease 機(jī)制不依賴于存儲(chǔ)。
Lease 機(jī)制依賴于有效期,這就要求頒發(fā)者和接收者的時(shí)鐘是同步的。對(duì)于這種時(shí)鐘不同步,實(shí)踐中的通常做法是將頒發(fā)者的有效期設(shè)置得比接收者的略大,只需大過時(shí)鐘誤差就可以避免對(duì) lease 的有效性的影響。
3. 基于 lease 機(jī)制確定節(jié)點(diǎn)狀態(tài)
在分布式系統(tǒng)中確定一個(gè)節(jié)點(diǎn)是否處于正常工作狀態(tài)是一個(gè)困難的問題。由于可能存在網(wǎng)絡(luò)分化,節(jié)點(diǎn)的狀態(tài)是無(wú)法通過網(wǎng)絡(luò)通信來確定的。下面舉一個(gè)較為具體的例子來討論這個(gè)問題。
例 2.3.1:在一個(gè) primary-secondary 架構(gòu)的系統(tǒng)中,有三個(gè)節(jié)點(diǎn) A、B、C 互為副本,其中有一
個(gè)節(jié)點(diǎn)為 primary,且同一時(shí)刻只能有一個(gè) primary 節(jié)點(diǎn)。另有一個(gè)節(jié)點(diǎn) Q 負(fù)責(zé)判斷節(jié)點(diǎn) A、B、C
的狀態(tài),一旦 Q 發(fā)現(xiàn) primary 異常,節(jié)點(diǎn) Q 將選擇另一個(gè)節(jié)點(diǎn)作為 primary。假設(shè)最開始時(shí)節(jié)點(diǎn) A
為 primary,B、C 為 secondary。節(jié)點(diǎn) Q 需要判斷節(jié)點(diǎn) A、B、C 的狀態(tài)是否正常。
首先需要說明的是基于“心跳”(Heartbeat)的方法無(wú)法很好的解決這個(gè)問題。節(jié)點(diǎn) A、B、C 可以周期性的向 Q 發(fā)送心跳信息,如果節(jié)點(diǎn) Q 超過一段時(shí)間收不到某個(gè)節(jié)點(diǎn)的心跳則認(rèn)為這個(gè)節(jié)點(diǎn)異常。
上述問題的出現(xiàn)的原因在于雖然節(jié)點(diǎn) Q 認(rèn)為節(jié)點(diǎn) A 異常,但節(jié)點(diǎn) A 自己不認(rèn)為自己異常,依舊作為 primary 工作。其問題的本質(zhì)是由于網(wǎng)絡(luò)分化造成的系統(tǒng)對(duì)于“節(jié)點(diǎn)狀態(tài)”認(rèn)知的不一致。
上面的例子中的分布式協(xié)議依賴于對(duì)節(jié)點(diǎn)狀態(tài)認(rèn)知的全局一致性,即一旦節(jié)點(diǎn) Q 認(rèn)為某個(gè)節(jié)點(diǎn)A 異常,則節(jié)點(diǎn) A 也必須認(rèn)為自己異常,從而節(jié)點(diǎn) A 停止作為 primary,避免“雙主”問題的出現(xiàn)。解決這種問題有兩種思路,第一、設(shè)計(jì)的分布式協(xié)議可以容忍“雙主”錯(cuò)誤,即不依賴于對(duì)節(jié)點(diǎn)狀態(tài)的全局一致性認(rèn)識(shí),或者全局一致性狀態(tài)是全體協(xié)商后的結(jié)果;第二、利用 lease 機(jī)制。
由中心節(jié)點(diǎn)向其他節(jié)點(diǎn)發(fā)送 lease,若某個(gè)節(jié)點(diǎn)持有有效的 lease,則認(rèn)為該節(jié)點(diǎn)正常可以提供服務(wù)。用于例 2.3.1 中,節(jié)點(diǎn) A、B、C 依然周期性的發(fā)送 heart beat 報(bào)告自身狀態(tài),節(jié)點(diǎn) Q 收到 heart beat后發(fā)送一個(gè) lease,表示節(jié)點(diǎn) Q 確認(rèn)了節(jié)點(diǎn) A、B、C 的狀態(tài),并允許節(jié)點(diǎn)在 lease 有效期內(nèi)正常工作。節(jié)點(diǎn) Q 可以給 primary 節(jié)點(diǎn)一個(gè)特殊的 lease,表示節(jié)點(diǎn)可以作為 primary 工作。一旦節(jié)點(diǎn) Q 希望切換新的 primary,則只需等前一個(gè) primary 的 lease 過期,則就可以安全的頒發(fā)新的 lease 給新的primary 節(jié)點(diǎn),而不會(huì)出現(xiàn)“雙主”問題。
4. lease 的有效期時(shí)間選擇
Lease 的有效期雖然是一個(gè)確定的時(shí)間點(diǎn),當(dāng)頒發(fā)者在發(fā)布 lease 時(shí)通常都是 將當(dāng)前時(shí)間加上一個(gè)固定的時(shí)長(zhǎng)從而計(jì)算出 lease 的有效期。
如何選擇 Lease 的時(shí)長(zhǎng)在工程實(shí)踐中是一個(gè)值得討論的問題。如果 lease 的時(shí)長(zhǎng)太短,例如 1s,一旦出現(xiàn)網(wǎng)絡(luò)抖動(dòng) lease 很容易丟失,從而造成節(jié)點(diǎn)失去 lease,使得依賴 lease 的服務(wù)停止;如果 lease 的時(shí)長(zhǎng)太大,例如 1 分鐘,則一旦接受者異常,頒發(fā)者需要過長(zhǎng)的時(shí)間收回 lease 承諾。例如,使用 lease 確定節(jié)點(diǎn)狀態(tài)時(shí),若 lease 時(shí)間過短,有可能造成網(wǎng)絡(luò)瞬斷時(shí)節(jié)點(diǎn)收不到 lease 從而引起服務(wù)不穩(wěn)定,若 lease 時(shí)間過長(zhǎng),則一旦某節(jié)點(diǎn)宕機(jī)異常,需要較大的時(shí)間等待 lease 過期才能發(fā)現(xiàn)節(jié)點(diǎn)異常。
工程中,常選擇的 lease 時(shí)長(zhǎng)是 10 秒級(jí)別,這是一個(gè)經(jīng)過驗(yàn)證的經(jīng)驗(yàn)值,實(shí)踐中可以作為參考并綜合選擇合適的時(shí)長(zhǎng)。
5. 工程投影
GFS 中的 Lease。GFS 中使用 Lease 確定 Chuck 的 Primary 副本。Lease 由 Master 節(jié)點(diǎn)頒發(fā)給 primary 副本,持有Lease 的副本成為 primary 副本。
Niobe 中的 Lease。Niobe 中雖然沒有明確說明使用了 Lease 機(jī)制,但是通過分析可以發(fā)現(xiàn),這是一個(gè) Lease 機(jī)制。Niobe 協(xié)議中,也是通過 Lease 機(jī)制維持 Primary 副本的選擇,不同的是 Niobe 中的 Lease 是由 Secondary 節(jié)點(diǎn)向 Primary 節(jié)點(diǎn)發(fā)送。在 Niobe 協(xié)議中,每個(gè) Secondary 副本都會(huì)給 Primary 副本發(fā)送 Lease,這個(gè) Lease 的含義是: 在 Lease 時(shí)間內(nèi),本副本承認(rèn)你是 Primary 節(jié)點(diǎn)。從這里我們可以看到,niobe 中的 lease 含義也可以理解為:“我承諾在接下來 lease 時(shí)間內(nèi),我不會(huì) kill 你”。
Chubby 與 Zookeeper 中的 Lease。我們知道 chubby 通過 paxos 協(xié)議實(shí)現(xiàn)去中心化的選擇 primary 節(jié)點(diǎn)(見 2.8.6 )。一旦某個(gè)節(jié)點(diǎn)獲得了超過半數(shù)的節(jié)點(diǎn)認(rèn)可,該節(jié)點(diǎn)成為 primary 節(jié)點(diǎn),其余節(jié)點(diǎn)成為 secondary 節(jié)點(diǎn)。Secondary節(jié)點(diǎn)向 primary節(jié)點(diǎn)發(fā)送 lease,該 lease 的含義是: “承諾在 lease 時(shí)間內(nèi),不選舉其他節(jié)點(diǎn)成為 primary節(jié)點(diǎn)”。除了 secondary 與 primary 之間的 lease,在 chubby 中,primary 節(jié)點(diǎn)也會(huì)向每個(gè) client 節(jié)點(diǎn)頒發(fā)lease。該 lease 的含義是用來判斷 client 的死活狀態(tài),一個(gè) client 節(jié)點(diǎn)只有只有合法的 lease,才能與 chubby 中的 primary 進(jìn)行讀寫操作。與 Chubby 不同,Zookeeper 中的 secondary 節(jié)點(diǎn)(在 zookeeper 中稱之為 follower)并不向 primary節(jié)點(diǎn)(在 zookeeper 中稱之為 leader)發(fā)送 lease,zookeeper 中的 secondary 節(jié)點(diǎn)如果發(fā)現(xiàn)沒有 primary節(jié)點(diǎn)則發(fā)起新的 paxos 選舉,只要 primary 與 secondary 工作正常,新發(fā)起的選舉由于缺乏多數(shù)secondary的參與而不會(huì)成功。
間接使用 Lease。筆者很難想象,如何在工程上既不使用 Lease 而又實(shí)現(xiàn)一個(gè)一致性較高的系統(tǒng)。直接實(shí)現(xiàn) lease機(jī)制的確會(huì)對(duì)增加系統(tǒng)設(shè)計(jì)的復(fù)雜度。然而,由于有類似 Zookeeper 這樣的開源的高可用系統(tǒng),在工程中完全可以間接使用 Lease。借助 zookeeper,我們可以簡(jiǎn)單的實(shí)現(xiàn)高效的、無(wú)單點(diǎn)選主、狀態(tài)監(jiān)控、分布式鎖、分布式消息隊(duì)列等功能,而實(shí)際上,這些功能的實(shí)現(xiàn)都是依賴于背后 zookeeper與 client 之間的 Lease 的。
參考:《分布式系統(tǒng)原理介紹》 - 劉杰
總結(jié)
以上是生活随笔為你收集整理的分布式系统原理 之3 Lease机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式系统原理 之2 基本副本协议
- 下一篇: 分布式系统原理 之4 Quorum 机制