想象你们小区门口有一块“权威公告栏”。所有通知、失物招领、物业安排,全小区只认这一块板子。管理员有好几位,但握着“官方马克笔”的只有一位——他说了算,其他人负责校对备份。更妙的是这块板子有几条铁规:贴临时公告要租位置,租约到期没人续就被撕掉;居民可以登记“这块区域一变就喊我”,不用每天跑来看;写公告还支持带条件——“如果这里还是昨天的内容,我才更新,否则别动”。这套规则,就是 etcd 的缩影。 etcd,正是 Kubernetes 背后的那块“官方公告栏”。哪个 Pod 还活着、某服务住在哪个地址、整个集群该长什么样,全都记在 etcd 里。它把“强一致”“租约”“监听”“条件更新”这些吓人的分布式概念,变成了公告栏上一件件具体的日常。作为键值数据库家族里“少而精”的代表,它不追求海量存储,只承诺一件事:只要多数管理员点头,谁都看到同一个版本的事实。

岗位关联

掌握 etcd 的典型应用,是理解 Kubernetes 运行机制、设计高可用分布式系统的必修课;对 AI 从业者而言,模型服务发现、分布式训练调度、配置热更新同样离不开它。

目录
  1. 可视化演示
  2. etcd概览定位
  3. Raft一致性
  4. 租约机制
  5. Watch通知
  6. CAS事务
  7. 元数据配置
  8. 容量与运维
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

etcd概览定位

公告栏的本质很简单:左边写标题(键),右边写正文(值)。etcd 也一样,它就是一个键值存储——一个 key 指到一段 value。但千万别小看这本“业主名册”:它不是一个本子,而是五本一模一样、随时互相同步的本子,分别握在五位管理员手里。只要多数人认定某个版本,任何人翻开来看到的都是同一页内容——这就是“强一致”。

技术上,etcd 的键支持 /a/b/c 这样的目录式路径,值是几 KB 以内的小文本或序列化对象。它专职服务“少而精”的数据:Kubernetes 把所有 API 对象(Pod、Service、Deployment)都变成键值对存进 etcd,etcd 一旦不可用,K8s 整个瘫痪——“基石”二字当之无愧。理解 etcd,就是理解公告栏的五大规矩:键值对、Raft 共识、租约、Watch、CAS 事务。

认识这五个词,就等于拿到了公告栏的完整规则表。接下来,我们逐个展开。

etcd=⟨键值对, Raft 共识, 租约, Watch, CAS 事务⟩\text{etcd} = \langle \text{键值对},\ \text{Raft 共识},\ \text{租约},\ \text{Watch},\ \text{CAS 事务} \rangle
这个“五元组”就是 etcd 的全部家当:存储靠键值对,一致靠 Raft,生死靠租约,通知靠 Watch,秩序靠 CAS。
  1. 键值对数据以 "key→value" 形式存放,key 是公告栏标题,value 是正文。
    k→vk \to v
  2. Raft 共识多副本达成“同一事实”的算法,对应管理员团队统一口径。
    多数派同意⇒提交\text{多数派同意} \Rightarrow \text{提交}
  3. 租约给键限时,到期未续自动失效。
    key 的寿命=租约 TTL\text{key 的寿命} = \text{租约 TTL}
  4. Watch监听键的变化,变化主动推给订阅者。
    变化事件→订阅者\text{变化事件} \to \text{订阅者}
  5. CAS 事务满足条件才更新,整个过程原子完成。
    条件成立⇒更新\text{条件成立} \Rightarrow \text{更新}

Raft一致性

为什么这块公告栏如此可信?因为管理员团队有条铁律:任何改动,必须让“多数管理员”点头才生效。五个人里至少三个同意,内容才算数——这就是 Raft 共识的朴素版本。

在 etcd 集群中,任一时刻只有一个“领导者”,它独占官方马克笔;其余是跟随者,负责备份和投票。客户端只能找领导者写。领导者把一条新日志(要写的内容)广播给跟随者,它们落盘后回执;领导者凑齐多数派回执就提交日志,并通知所有节点应用它。为什么只要多数派而不是全体?因为节点会宕机、网络会抖动。多数派保证“只要超过一半节点还活着,集群就继续干活”,同时任意两个多数派必有交集——不会出现两个领导者同时签字。

所以五节点 etcd 集群允许最多挂两台机器。只要三台管理员还能互相通气,公告栏就照常营业——这就是强一致的底气。

Q=⌊n2⌋+1Q = \left\lfloor \dfrac{n}{2} \right\rfloor + 1
这是“拍板所需的票数公式”:n 个节点,过半即拍板。5 节点集群算出 3,意味着最多允许挂 2 台。
  1. n 为节点总数比如公告栏有五名管理员,n=5。
    n=5n = 5
  2. 取一半5 的一半是 2.5。
    n2=2.5\frac{n}{2} = 2.5
  3. 向下取整地板函数把 2.5 变成 2。
    ⌊2.5⌋=2\left\lfloor 2.5 \right\rfloor = 2
  4. 再加一保证“严格超过一半”,得写操作所需的最少同意数。
    Q=2+1=3Q = 2 + 1 = 3

租约机制

公告栏有条规矩:贴临时通知要“租位置”。比如失物招领贴出来,若一周内没人续租,管理员就把帖子撕掉。这个“限期贴条”机制,在 etcd 里叫租约(Lease)。

租约本质是一个 TTL 倒计时。服务拿到租约后,要周期性地“续期”——相当于每隔几秒刷新一次计时器。一旦失联,倒计时走完,etcd 就判定这个键的主人已“死亡”,自动删除所有绑定该租约的键。典型应用是服务心跳:节点周期性向 etcd 续约,一旦宕机,键自动过期,调度器立刻安排替补。分布式锁也依赖这招——持锁进程崩溃,锁能自动释放,绝不会死锁。

只要服务一直“打卡”,租约就一直有效;一旦断联超时,公告栏自动清理。这就是 etcd 保证“活着的才存在”的手段。

texpire=tgrant+TTLt_{\text{expire}} = t_{\text{grant}} + \text{TTL}
到期时刻 = 授予时刻 + 租期。计时器归零前没来续,公告就被撕掉。
  1. t_grant 授予时刻租约创建那一刻,管理员贴条并启动计时器。
    tgrant: 创建租约的时间t_{\text{grant}}:\ \text{创建租约的时间}
  2. TTL 租期公告栏允许占用的时长,比如 10 秒、30 秒。
    TTL: 租约有效期\text{TTL}:\ \text{租约有效期}
  3. t_expire 到期时刻两者相加,得到“必须续期否则清理”的截止时间。
    texpire=tgrant+TTLt_{\text{expire}} = t_{\text{grant}} + \text{TTL}

Watch通知

过去村民想盯一块公告区域,只能隔一会儿跑来看一眼——费腿。后来公告栏推出“订阅”服务:登记感兴趣的键或前缀,内容一变,管理员立刻喊你,不用再轮询。

etcd 的 Watch 就是这套逻辑:客户端对某个键或前缀发起 watch,之后数据一变,etcd 立刻向客户端推送事件流(写入、删除、更新),而不是等客户端来问。Kubernetes 的控制器正是靠 Watch 秒级感知资源变化,再把实际状态调谐到期望状态。Watch 底层靠“修订号”(revision)串起事件的先后:每次写操作,全局修订号加一,事件携带修订号,客户端断线重连后还能从上次的编号“补听”,保证不漏。但太久远的历史会被压缩清理。

有了 Watch,服务发现变得简单:客户端盯着 /services 前缀,新服务注册、旧服务下线,全部实时知晓。村民再也不用跑腿——管理员会喊他。

E=(k, v, type, rev),revnew=revold+1E = (k,\ v,\ \text{type},\ rev),\qquad rev_{\text{new}} = rev_{\text{old}} + 1
每个变更事件都带编号,像公告栏给每条新公告盖一个递增的章,谁都排得出先后。
  1. 事件四元组一次变化包含键、新值、操作类型、修订号。
    E=(k, v, type, rev)E = (k,\ v,\ \text{type},\ rev)
  2. 操作类型写入还是删除,决定事件语义。
    type∈{PUT, DELETE}\text{type} \in \{ \text{PUT},\ \text{DELETE} \}
  3. 修订号递增每次变更全局加一,事件可排序、可断点续传。
    revnew=revold+1rev_{\text{new}} = rev_{\text{old}} + 1

CAS事务

公告栏还有个大杀器:条件更新。村民说:“如果板块上还是我上次看到的内容(版本号 5),我就把它改成新内容;如果不是,什么都别做。”管理员必须原子地完成“查看—比较—写入”,中间不许别人插队。

这就是 CAS(Compare-And-Swap)。etcd 用事务 API 实现:在 If 里放比较条件(比如“键的版本号等于期望值”),在 Then 里放更新操作;条件不满足就走 Else。整个过程原子完成,没有并发漏洞。分布式锁正是这么实现的:多个节点抢同一个锁键,用“键不存在”作为条件,谁 CAS 成功谁拿到锁;持锁者定期续约,用完删除。领导选举同理——多个候选人都想当“领导者”,谁能用 CAS 抢到同一个键,谁就上岗。

CAS 让“先到先得”变得公平且安全:不会两人同时抢到锁,后到的人也无法覆盖先到的人。公告栏的秩序,靠的就是这条铁律。

{k.mod_rev=rexpect⇒ vk←vnew, r←r+1k.mod_rev≠rexpect⇒ no-op\begin{cases}k.\text{mod\_rev} = r_{\text{expect}} & \Rightarrow \ v_k \leftarrow v_{\text{new}},\ r \leftarrow r + 1 \\k.\text{mod\_rev} \neq r_{\text{expect}} & \Rightarrow \ \text{no-op}\end{cases}
版本号对得上才动笔,对不上就罢手——这是公告栏避免“后写覆盖先写”的公平开关。
  1. 键的修订号每个键都记录着被修改的次数,相当于公告上的修订章。
    k.mod_revk.\text{mod\_rev}
  2. 比较判断当前修订号是否等于期望值。
    k.mod_rev=rexpectk.\text{mod\_rev} = r_{\text{expect}}
  3. 成立则更新写入新值,并把修订号加一。
    vk←vnew,r←r+1v_k \leftarrow v_{\text{new}},\quad r \leftarrow r + 1
  4. 不成立则放弃说明已被别人改过,本次操作什么也不做。
    no-op\text{no-op}

元数据配置

公告栏用久了,慢慢变成了社区的“总账本”:哪栋楼几户、楼长是谁、今天有什么安排,全记在上面。etcd 在真实世界里正是这个角色——Kubernetes 的元数据库。

K8s 的每个资源对象(Pod、Service、Deployment)都被序列化后,以目录式键存放在 etcd,路径形如 /registry/pods/default/app-1,意思就是“default 命名空间下有个 app-1 的 Pod”。配置中心的用法一脉相承:把配置放在 /config/{服务名} 路径下,各实例 watch 这个路径;配置一变,所有实例立刻收到通知并热加载,不用重启、不用手工同步。服务注册发现则是“注册 = 写键 + 租约保活,发现 = 读键 + watch”的组合拳。

整个集群的“期望状态”浓缩在键值树里,而租约、Watch、CAS 共同保证这份账本既实时又可靠。etcd 就是 K8s 的“大脑记忆体”。

k=prefix+namespace+name,v=JSON(资源对象)k = \text{prefix} + \text{namespace} + \text{name},\quad v = \mathrm{JSON}(\text{资源对象})
目录式键 = 分类前缀 + 命名空间 + 名字;值就是资源的完整描述。整棵键树就是集群的“账本”。
  1. 前缀分类同类资源共享目录前缀,便于批量监听。
    prefix="/registry/pods/"\text{prefix} = \text{"/registry/pods/"}
  2. 拼出唯一键命名空间区分项目,名字区分对象。
    k=prefix+namespace+namek = \text{prefix} + \text{namespace} + \text{name}
  3. 值序列化资源对象变成 JSON 文本存进值。
    v=JSON(资源对象)v = \mathrm{JSON}(\text{资源对象})

容量与运维

公告栏再权威,也不能无限大。贴满一万张纸,重点反而找不到,管理员翻找也变慢。etcd 同样有清晰的能力边界:它追求强一致,不追求海量。

etcd 默认存储上限约 2GB,生产环境建议控制在 8GB 以内;键的总数量和单个键大小是规划重点。因为每次写操作都要复制到多数派并落盘,数据越多,集群压力和延迟越大。运维的三个要点:一是“压缩”(compaction)——定期删除历史修订版本,否则版本堆积会撑爆磁盘;二是“碎片整理”(defrag)——压缩后空间碎片化,需要整理回收;三是监控——磁盘空间、fsync 延迟、慢请求、领导者选举次数,都是体检指标。

记住一句话:把“少而精”的强一致数据交给 etcd,把海量数据交给专门的存储系统。公告栏如果什么都贴,就什么都不是了。

Stotal≈Nkeys×SavgS_{\text{total}} \approx N_{\text{keys}} \times S_{\text{avg}}
存储占用量 ≈ 键的个数 × 键的平均大小。这个粗估公式,是容量规划的第一笔账。
  1. 键数量公告栏上一共贴了多少条公告。
    Nkeys: 键的个数N_{\text{keys}}:\ \text{键的个数}
  2. 平均大小每条公告平均占多大地方。
    Savg: 平均键值大小S_{\text{avg}}:\ \text{平均键值大小}
  3. 相乘估算两者乘积粗估总量,指导容量规划。
    Stotal≈Nkeys×SavgS_{\text{total}} \approx N_{\text{keys}} \times S_{\text{avg}}

AI 应用场景

场景一:分布式模型训练的任务协调

阶段:训练调度与集群资源协调

解决的问题:多机多卡训练需要一个所有节点都认可的“任务台账”——谁在跑哪个实验、每个 worker 是否健康。传统做法用数据库加轮询,一致性和实时性都差;etcd 用租约记录 worker 心跳,用 Watch 实时通知调度器节点上下线,任务状态全局强一致可见。

具体案例:某 ML 平台的自研训练调度器中,每个 worker 启动时向 etcd 注册 /jobs/{job_id}/workers/{id} 并绑定租约。心跳停止 15 秒后键自动过期,调度器 watch 到变化后立刻把任务重新调度到空闲 GPU 上,避免训练卡死无人知晓。

场景二:推理服务的配置热更新

阶段:模型部署与配置管理

解决的问题:模型上线时,模型版本号、流量切分比例、特征开关要同步到成百上千台推理机。传统改配置文件加重启的方式又慢又易错;把配置放进 etcd,所有实例 watch 同一路径,更新即时生效,无需重启。

具体案例:某推荐系统把 /config/recommend 的内容设为 {model_version: v2.3, traffic_ratio: 0.5}。运营调整比例后,etcd 推送变更,所有推理实例在数秒内热更新配置,实现模型灰度上线的平滑切换。

Python 演示

python76 行
# -*- coding: utf-8 -*-"""etcd 核心机制迷你模拟器:租约 + CAS + Watch 事件流"""import time  class EtcdMini:    def __init__(self):        self.data = {}       # key -> value/rev/expire        self.revision = 0    # 全局修订号,类似公告编号        self.watchers = []   # (key, callback)     def put(self, key, value, ttl=None):        self.revision += 1        expire = time.time() + ttl if ttl else None        self.data[key] = {"value": value, "rev": self.revision,                          "expire": expire}        self._notify(key, "PUT", value, self.revision)        return self.revision     def get(self, key):        item = self.data.get(key)        if not item:            return None        if item["expire"] and time.time() > item["expire"]:            del self.data[key]            self.revision += 1            self._notify(key, "DELETE", None, self.revision)            return None        return item["value"]     def cas(self, key, expect_rev, new_value):        cur = self.data.get(key)        cur_rev = cur["rev"] if cur else 0        if cur_rev != expect_rev:            return False, cur_rev        self.revision += 1        cur["value"] = new_value        cur["rev"] = self.revision        self._notify(key, "PUT", new_value, self.revision)        return True, self.revision     def watch(self, key, callback):        self.watchers.append((key, callback))        return len(self.watchers) - 1     def _notify(self, key, etype, value, rev):        for k, cb in self.watchers:            if k == key:                cb({"key": key, "type": etype, "value": value, "rev": rev})  def on_change(event):    print("[Watch] %s %s rev=%d value=%s" %          (event["key"], event["type"], event["rev"], event["value"]))  def main():    etcd = EtcdMini()    etcd.watch("/service/predict", on_change)     rev1 = etcd.put("/service/predict", "v1.0.0", ttl=1)    print("写入成功, revision =", rev1)     ok, rev2 = etcd.cas("/service/predict", rev1, "v1.1.0")    print("CAS 更新成功?", ok, "新 revision =", rev2)     ok, _ = etcd.cas("/service/predict", rev1, "v9.9.9")    print("旧版本 CAS 再试?", ok, "(应为 False)")     print("当前值 =", etcd.get("/service/predict"))    time.sleep(1.2)    print("租约过期后 =", etcd.get("/service/predict"))  if __name__ == "__main__":    main()
目的:用标准库模拟 etcd 的租约、CAS 与 Watch 机制,展示一次“带 TTL 写入 → CAS 更新 → 租约过期”的完整生命周期。
  1. self.data[key] = {"value": value, "rev": self.revision, ...}每个键都存着值、修订号与到期时刻,相当于公告条上盖了三枚章。
  2. expire = time.time() + ttl if ttl else None把 TTL 秒数换算成绝对到期时间,计时器开始倒计时。
  3. if cur_rev != expect_rev: return False, cur_revCAS 的“比较”环节:修订号对不上,直接拒绝更新。
  4. self.revision += 1每次写操作让全局修订号加一,对应 etcd 的 revision 递增。
  5. self._notify(key, "PUT", value, self.revision)更新后立刻通知所有 watch 该键的回调,对应 Watch 推送。
  6. rev1 = etcd.put("/service/predict", "v1.0.0", ttl=1)写入一个带 1 秒租约的配置键,模拟服务注册。
  7. ok, rev2 = etcd.cas("/service/predict", rev1, "v1.1.0")持有旧修订号做条件更新,模拟基于版本的乐观并发控制。

常见误区

误区etcd 也是 KV 数据库,那把订单、日志、用户数据都塞进去,反正看起来也能读写。

正解etcd 的设计目标是“强一致的少量关键数据”,默认容量约 2GB,官方建议控制在 8GB 内。数据量大时,写放大、快照、网络复制都会拖垮集群。它像公告栏——贴满一万份广告,谁还找得到正事?海量数据应交给 MySQL、对象存储或消息队列。

为何常见:同为 KV 存储,容易把 Redis、LevelDB 和 etcd 混为一谈;看到“能读写”就忽略了容量与一致性的定位差异。

误区5 个节点得 5 个全活着才敢写,挂一台就觉得集群要完。

正解Raft 只需多数派(5 节点中 3 个)在线即可写入。挂一两台只是容忍范围内的正常情况,集群继续服务;只有挂到只剩 2 台时才会拒绝写入以避免脑裂。规则是“多数人签字生效”,不是“全员签字”。

为何常见:直觉上“多副本才安全”,容易把“复制到多数派”误解为“必须全部确认”。

误区TTL 一到,这个键立刻就没了,像蒸发一样。

正解租约过期是“逻辑过期”——etcd 标记该键失效,读写都会把它当作不存在;但底层数据要等后续压缩(compaction)才被真正清理。对应用来说“读不到”就够了,但监控磁盘时不能指望过期键立刻释放空间。

为何常见:把缓存里“懒删除”的经验和物理删除混为一谈,以为界面上看不到就等于磁盘上不存在。

误区实现分布式锁不就是 set 一个键吗?删掉就解锁,完全不用管别的。

正解真正的分布式锁需要三件事:用 CAS 保证只有一个客户端“创建成功”;用租约防止持锁者崩溃后死锁;释放时校验 owner,防止租约过期后新主人已接管时误删别人的锁。公告栏里“贴条占位”必须配合“限时租约”和“条件更新”,否则秩序全乱。

为何常见:单机锁的思维惯性带到了分布式;没经历过“持锁者宕机导致所有任务永久阻塞”的事故。

误区Watch 既然能拿事件,那我就能像查日志一样把过去一个月的变更加起来回放。

正解Watch 是“从现在开始”的事件流,历史版本依赖存储保留;etcd 会定期压缩删除旧修订号,过期事件无法重放。想要历史审计,应用应自己消费事件并落地到外部存储。

为何常见:把“通知机制”和“历史存储”两种能力混为一谈,以为事件流默认永久存在。

面试题

Q1. etcd 集群默认采用哪种一致性协议?

单选题 · easy

  • A.Raft协议← 正确答案
  • B.Paxos协议
  • C.PBFT协议
  • D.Gossip协议

答案:A。Raft 是 etcd 的核心,把共识拆成“选举 + 日志复制”,比 Paxos 更易理解实现。Paxos 也是共识算法但并非 etcd 默认实现;PBFT 用于抗拜占庭错误,场景不同;Gossip 是最终一致,不满足强一致要求。

Q2. 一个 5 节点的 etcd 集群,至少几个节点在线才能正常写入?

单选题 · easy

  • A.2个节点
  • B.3个节点← 正确答案
  • C.4个节点
  • D.5个节点

答案:B。提交需要多数派,按公式 ⌊5/2⌋+1=3。若只有 2 个节点在线,无法构成多数派,写入会超时失败。这正体现了“多数派拍板”的容错设计:五名管理员中有三位同意即可贴公告。

Q3. 租约(Lease)在 etcd 中的核心作用是什么?

单选题 · easy

  • A.给键设置有效期← 正确答案
  • B.加密存储键值
  • C.缓存加速读取
  • D.备份元数据

答案:A。租约给键一个“限时占位”,到期不续约则键失效删除,常用于服务心跳和临时锁。加密、缓存、备份都不是租约的职责——它只管“限时”,像公告栏的出租位。

Q4. 关于 etcd 的 Watch 通知模型,正确的说法有哪些?

多选题 · mid

  • A.服务器向客户端推送变更事件← 正确答案
  • B.客户端需要定时轮询查询
  • C.可监听指定前缀的一批键← 正确答案
  • D.历史事件可以永久回溯查看

答案:AC。Watch 是推送式通知,客户端注册后等事件即可、无需轮询;支持单键与前缀监听,Kubernetes 用它做服务发现。历史事件会被压缩(compaction)清理,无法永久回溯,因此 D 错误。

Q5. 为什么用 etcd 实现分布式锁时必须给锁加租约(TTL)?

单选题 · mid

  • A.提高系统整体并发
  • B.减少网络传输开销
  • C.防止缓存被击穿
  • D.崩溃后锁自动释放← 正确答案

答案:D。持锁进程可能宕机,若不设 TTL,锁会被永远占着,其他节点只能饿死。租约让锁在持锁者失联后自动过期释放——公告栏的“无人续租就回收”机制,是分布式锁不阻塞的前提。

Q6. 以下哪个场景更适合使用 etcd 而不是 MySQL?

单选题 · mid

  • A.海量交易流水
  • B.强一致小元数据← 正确答案
  • C.图片视频文件
  • D.复杂SQL报表

答案:B。etcd 是强一致 KV,适合存“少而精”的元数据和配置,如 K8s 集群状态;它的容量和查询能力有限。海量流水、大文件、复杂 SQL 应交给关系数据库、对象存储或数仓。

Q7. 客户端持有的锁租约意外过期但任务仍在运行时,最可能发生什么?

单选题 · hard

  • A.数据将会永久丢失
  • B.锁可能被其他节点获取← 正确答案
  • C.集群进入只读模式
  • D.租约将自动续期成功

答案:B。租约过期后锁键随即失效,另一个节点可通过 CAS 拿到锁,出现“双主”风险。这正是分布式锁的经典难点,通常需要续约守护协程或 fencing token 缓解。数据丢失、集群只读、自动续期都不是必然结果。

Q8. Raft 选举为什么要求“严格超过半数”而非“等于半数”的选票?

单选题 · extreme

  • A.防止同一任期出现两个领导者← 正确答案
  • B.让所有节点都参与日志复制
  • C.保证每个节点保存最新日志
  • D.简化投票计票过程的复杂度

答案:A。严格多数保证任意两个多数派必有交集,从而同一任期最多一个领导者;等于半数时可能出现票数打平,且无法保证多数派之间有交集,会破坏选举安全与日志安全。

Q9. etcd 的典型应用场景有哪些?

多选题 · mid

  • A.服务注册与发现← 正确答案
  • B.分布式配置中心← 正确答案
  • C.海量日志数据存储
  • D.分布式锁与选举← 正确答案

答案:ABD。服务注册发现依赖 Watch 实时通知,配置中心依赖强一致加 Watch,锁和选举依赖 CAS 事务。海量日志适合专门的日志系统,etcd 容量小且定位是“少而精”,不适合存日志。

Q10. 关于 etcd 的容量规划与运维,正确的做法有哪些?

多选题 · hard

  • A.键值总量应合理控制← 正确答案
  • B.开启压缩清理历史版本← 正确答案
  • C.高频全量查询无性能影响
  • D.需监控磁盘与慢请求← 正确答案

答案:ABD。etcd 面向小数据强一致,应限制键数量和大小;定期 compact 回收历史修订版本;全量查询会拉取整个目录、放大网络和内存开销,并非无影响;磁盘、慢请求、选举稳定性都要纳入监控。