領導者的選擇
1)為什麼需要領導者,當他完全無罪釋放時
領導者是具有執行關鍵操作的獨家權限的節點:啟動克朗/ETL,協調縫隙,分配密鑰,更改配置。它簡化了不變量(「單個執行者」),但增加了風險(SPOF,pere選舉,lag)。
使用領導,如果:- 需要單次執行(例如,每分鐘一次計費聚合器);
- 需要更改排序(配置註冊表、分布式鎖);
- 群集協議涉及領導力復制(Raft)。
- 問題解決了按鍵的冪等性和順序;
- 可以通過work-stealing/隊列進行平行;
- 「領導者」成為唯一的瓶頸(廣泛的粉絲)。
2)基本模型: lease+法定人數+時代
術語
Lease(貸款):領導者有資格獲得T秒;必須延長。
心跳:間歇性延長/信號「活著」。
Epoch/term(時代,學期):單調增長的領導人數。幫助識別「老」領導者。
Fencing token:與資源使用者(DB/store)檢查並拒絕舊領導者操作的單調數字相同。
不變量
在任何時候,不超過一個有效的領導者(安全)。
如果失敗,則可以取得進展:在合理的時間內選出新的(生活)。
領導者的行動伴隨著時代。辛基人只接受較新的時代。
3)算法和協議概述
3.1 Raft(領導力復制)
狀態:Follower → Candidate → Leader。
計時器:random election timeout(jitter),RequestVote;領導者將AppendEntries視為心跳。
保修:法定人數,標準前提下無裂紋,邏輯單調日誌(term/index)。
3.2 Paxos/Single-Decree / Multi-Paxos
共識的理論基礎;在實踐中-變化(e。g.,Multi-Paxos)具有「選定的協調員」(領導者對等)。
更難直接實現;更頻繁地使用現成的實現/庫。
3.3 ZAB (ZooKeeper Atomic Broadcast)
ZK機制:具有恢復階段的日誌的領導力復制;時代(zxid)和連續的短暫節點,用於諸如領導之類的原語。
3.4 Bully/Chang-Roberts(戒指/君主)
靜態拓撲的「訓練」算法沒有法定人數。不考慮部分網絡故障/分離-不要在銷售中應用。
4)實用平臺
4.1 ZooKeeper
模式EPHEMERAL_SEQUENTIAL:過程創建「/leader/lock-XXX」,最小編號為領導者。
會話丟失⇒節點消失⇒ per-Choice是即時。
正義通過「前任」的期望。
4.2 etcd (Raft)
集群本身級別的本地領導;對於應用程序-etcd concurrency: 「Session+Mutex/Election」。
Lease-ID с TTL, keepalive;可以將時代存儲在鍵值中。
4.3 Consul
「session」+「KV acquire」:持有鑰匙的人既是領導者。會議中的TTL/心跳。
4.4 Kubernetes
Leases coordination API (`coordination.k8s.io/v1`): ресурс `Lease` c `holderIdentity`, `leaseDurationSeconds`, `renewTime`.
客戶端庫「leaderelection」(client-go)實現捕獲/擴展;非常適合領導者。
5)如何建立「安全」領導者
5.1保存時代和技巧
每個領導者都會增加epoch(例如etcd/ZK zxid修訂版或單獨的計數器)。
領導者的所有副作用(寫入DB,執行任務)都必須傳遞「epoch」並進行比較:sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
老領袖(在分裂大腦之後)將被拒絕。
5.2時間
「leaseDuration」 ≥ 「2-3 × heartbeatInterval+網絡+p99 GC暫停」。
選拔時間-隨機化(jitter),以確保候選人不會發生沖突。
如果失去延期-立即停止關鍵操作。
5.3身份認同
`holderId = node#pid#startTime#rand`.更新/卸載時,請檢查相同的控件。
5.4名觀察員(看門狗)
所有追隨者都訂閱了「Lease/Election」更改,並根據狀態開始/停止工作。
6)實現: 片段
6.1 Kubernetes (Go)
go import "k8s. io/client-go/tools/leaderelection"
lec:= leaderelection. LeaderElectionConfig{
Lock: &rl. LeaseLock{
LeaseMeta: metav1. ObjectMeta{Name: "jobs-leader", Namespace: "prod"},
Client: coordClient,
LockConfig: rl. ResourceLockConfig{Identity: podName},
},
LeaseDuration: 15 time. Second,
RenewDeadline: 10 time. Second,
RetryPeriod: 2 time. Second,
Callbacks: leaderelection. LeaderCallbacks{
OnStartedLeading: func(ctx context. Context) { runLeader(ctx) },
OnStoppedLeading: func() { stopLeader() },
},
}
leaderelection. RunOrDie(context. Background(), lec)
6.2 etcd (Go)
go cli, _:= clientv3. New(...)
sess, _:= concurrency. NewSession(cli, concurrency. WithTTL(10))
e:= concurrency. NewElection(sess, "/election/rollup")
_ = e. Campaign (ctx, podID )//blocking call epoch: = sess. Lease ()//use as part of fencing defer e. Resign(ctx)
6.3 ZooKeeper (Java, Curator)
java
LeaderSelector selector = new LeaderSelector(client, "/leaders/rollup", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership () performs leader work with try/finally
7)Pere選舉和服務退化
領導者的尖銳抨擊→時間表中的「魚骨」。通過增加leaseDuration/renewDeadline並消除GC/CPU-pil進行治療。
在筆試期間,請打開布朗努特:降低背景任務的強度或將其完全凍結到確認的領先地位。
對於冗長的喬布斯,在領導者改變後做chekpoints+idempotent碼頭。
8) Split-brain: 如何不擊中
使用具有法定人數的CP存儲(etcd/ZK/Consul);沒有領導人的法定人數,就無法接受。
切勿在沒有法定仲裁員的情況下在AP緩存上建立領先優勢。
即使在CP模型中,保持資源級別的調試也是針對罕見的非緊急情況(暫停、暫停驅動程序)的保險。
9)可觀察性和操作
度量標準
`leadership_is_leader{app}` (gauge 0/1).
`election_total{result=won|lost|resign}`.
`lease_renew_latency_ms{p50,p95,p99}`, `lease_renew_fail_total`.
「epoch_value」(聚類單調)。
「flaps_total」是每個窗口的領導者班次數。
對於ZK/etcd:復制時差,法定健康。
經常更換領導者(每小時>N)。
延期失敗「renew」/高 p99。
Epoch的不相容性(不同節點中的兩個不同時代)。
沒有領導者超過X秒(除非企業允許)。
Logi/Traces
鏈接事件:「epoch」、「holderId」、「reason」(失落的租賃、會議曝光)、「duration_ms」。
10)花花公子(Game Days)
分區:切斷兩個區域之間的網絡-只允許在法定部分進行領導。
GC-stop:人為地停止5-10秒的領先者-必須失去租金並停止工作。
Clock skew/Drift:確保正確性獨立於wall clock (fencing/epoch保存)。
殺死-9:領導者的突然崩潰→ leaseDuration ≤背後的新領導者。
慢存儲:減速Raft驅動器/日誌-評估選舉時間,調節時間。
11)反模式
通過Redis 「SET NX PX」的「Leader」,沒有固定且沒有法定人數。
「leaseDuration」小於關鍵操作的p99持續時間。
失去領導能力後停止/繼續工作(「再下車一會兒」)。
選舉計時器缺乏抖動→選舉風暴。
一個沒有支票的長喬布-每個支票都會導致從頭開始重復。
沒有後退的流量領導和路由的緊密連接-flup下的pods獲得5xx。
12)實施支票
- 選擇法定仲裁員:etcd/ZK/Consul/K8s Lease。
- 在領導者的所有副作用中保持和傳遞epoch/fencing。
- 設置了計時器:「leaseDuration」,「renewDeadline」,「retryPeriod」 以及網絡/GC的庫存。
- 內置了看門人,並在失去領導能力時正確停止工作。
- 領導任務是偶然的,並且是偶然的。
- 包括「epoch/holderId」 度量/alerts和loging。
- 進行遊戲日:分區,GC-stop, kill, clock skew。
- 有記錄的政客:領導者是誰/什麼,誰可以取代他,如何消除大紀元的沖突。
- 退化計劃:系統在沒有領導者的情況下做什麼。
- 性能測試:負載下的flaps不是SLO rushat。
13) FAQ
問:沒有法定人數就能建立領導嗎?
A:賣的是沒有。需要CP組件(法定)或具有等效保修的雲服務。
Q:如果有lease,為什麼要大紀元?
答:Lease提供生存能力,但在分裂/停頓後不能防止「老領袖」。Epoch/fencing使舊領導者的效果無效。
問:K8s中哪些時間違約?
答:經常使用「LeaseDuration≈15s」,「RenewDeadline≈10s」,「RetryPeriod≈2s」。在您的p99負載和GC下運行。
問:如何在本地測試領導力?
答:運行3-5個實例,模擬網絡(tc/netem),暫停(SIGSTOP),殺死領導者(SIGKILL),檢查度量/日誌/時代。
問:改變領導者時如何應對長期挑戰?
A:Checkpoint+等效碼頭;當失去領導時-立即停止並釋放資源。
14)結果
強大的領導者選擇是法定仲裁者+時代紀律。保持領先作為租金與心跳,beyte所有的fencing令牌效果,設置與庫存計時,使領導者的任務相去甚遠,觀察,定期失去故障。然後,「一人一人」表演者將不是口號,而是抵禦停頓,網絡異想天開和人為錯誤的保證。