本质区别:数据量和同步模式
| Raft (etcd) | Kafka | |
|---|---|---|
| 单次写入数据量 | 极小(KB 级,KV 元数据) | 极大(MB 级,消息体 + 索引) |
| 复制模式 | 同步等多数派确认 | 异步 ISR,可配置 acks |
| 失败策略 | 抖动超时 → 立即失败 + 快速选主 | 抖动 → ISR 收缩 → 等待恢复 |
etcd 的"快失败"机制
etcd 是一个分布式的 key-value 存储 ,基于 Raft 协议保证一致性,核心用于存储系统元数据。
它的名字来源于 Unix 的 /etc 目录(存配置)+ d(distributed)= "distributed etc"(分布式配置存储)。
类似 Linux "一切皆文件",etcd 就是 "一切皆配置" 的分布式存储。
etcd = 分布式 KV 存储 + Raft 一致性协议 + HTTP/gRPC 接口
网络抖动,Follower 响应慢:
etcd(Raft):
→ Leader 等到 election timeout(几百毫秒)
→ 认为 Follower 挂了
→ 立即继续(不等)
→ 触发快速选举(毫秒级)
Kafka:
→ 等待 acks(可配置 timeout)
→ ISR 收缩(需要配置)
→ 写入延迟升高
→ 恢复后 ISR 扩展
→ 中间几秒延迟毛刺
etcd 选 leader 只需几百毫秒 ,因为它不需要同步大量数据。Kafka 选 leader 需要等待 ISR 恢复和分区状态更新,默认 leader 选举最多可以到 30 秒 (replica.lag.time.max.ms)。
写放大效应
Kafka 的写入是累积批处理的:
正常:消息积攒 5ms → 批量写入 → 延迟 5ms
抖动:消息积攒 50ms → 批量更大 → 延迟 50ms
→ 生产端超时重试 → 延迟叠加
etcd 的写入是内存操作 (写 WAL + 内存状态),单次操作 < 1ms,抖动时最多影响一个写请求,不会"积攒"。
一句话总结
Raft 抗抖动是因为:数据小 + 快失败机制(抖动即判定失败、快速选主)。Kafka 怕抖动是因为:数据大 + 异步 ISR 等待 + 批处理累积放大延迟。 etcd 设计目标是"低延迟、高可靠",Kafka 设计目标是"高吞吐、最终一致",抖动对前者影响是"一次失败",对后者影响是"持续积压"。