领导者的选择
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令牌效果,设置与库存计时,使领导者的任务相去甚远,观察,定期失去故障。然后,"一人一人"表演者将不是口号,而是抵御停顿,网络异想天开和人为错误的保证。