etcd 实战课
唐聪
腾讯云资深工程师,etcd 活跃贡献者
28449 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 28 讲
开篇词 (1讲)
etcd 实战课
15
15
1.0x
00:00/00:00
登录|注册

12 | 一致性:为什么基于Raft实现的etcd还会出现数据不一致?

确认boltdb出现异常
确认MVCC模块的treeIndex模块异常
确认Apply流程异常
确认Raft日志同步正常
验证Raft日志条目同步是否正常
猜测5:boltdb出现异常
猜测4:MVCC模块的treeIndex子模块出现问题
猜测3:Apply模块出现问题
猜测2:Raft日志同步异常
猜测1:etcd集群出现分裂
查看etcd集群各节点状态
查看各组件状态
是否还有其他令你记忆深刻的问题和Bug
针对数据不一致问题,是否还有更好的建议
良好的运维规范
定时数据备份
应用层的数据一致性检测
开启etcd的数据毁坏检测功能
defrag操作也可能会导致不一致
etcd 3.2和3.3版本Lease模块的Revoke Lease行为不一致
Apply流程可能导致数据不一致
Raft算法只能确保各个节点的日志一致性
一步步解密真相
定位之旅
收到求助,Kubernetes集群出现异常
思考题
最佳实践
其他典型不一致Bug
为什么会不一致
故事要从去年1月的时候说起
为什么基于Raft实现的etcd还会出现数据不一致?

该思维导图由 AI 生成,仅供参考

你好,我是唐聪。
今天我要和你分享的主题是关于 etcd 数据一致性的。
我们都知道 etcd 是基于 Raft 实现的高可用、强一致分布式存储。但是有一天我和小伙伴王超凡却遭遇了一系列诡异的现象:用户在更新 Kubernetes 集群中的 Deployment 资源镜像后,无法创建出新 Pod,Deployment 控制器莫名其妙不工作了。更令人细思极恐的是,部分 Node 莫名其妙消失了。
我们当时随便找了一个 etcd 节点查看存储数据,发现 Node 节点却在。这究竟是怎么一回事呢? 今天我将和你分享这背后的故事,以及由它带给我们的教训和启发。希望通过这节课,能帮助你搞懂为什么基于 Raft 实现的 etcd 有可能出现数据不一致,以及我们应该如何提前规避、预防类似问题。

从消失的 Node 说起

故事要从去年 1 月的时候说起,某日晚上我们收到一个求助,有人反馈 Kubernetes 集群出现了 Deployment 滚动更新异常、节点莫名其妙消失了等诡异现象。我一听就感觉里面可能大有文章,于是开始定位之旅。
我首先查看了下 Kubernetes 集群 APIServer、Controller Manager、Scheduler 等组件状态,发现都是正常。
然后我查看了下 etcd 集群各节点状态,也都是健康的,看了一个 etcd 节点数据也是正常,于是我开始怀疑是不是 APIServer 出现了什么诡异的 Bug 了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以作者唐聪的经历为例,分享了在Kubernetes集群中遇到的etcd数据不一致问题。作者描述了遇到的问题,包括Deployment控制器失效、Node节点消失等诡异现象。经过排查,发现基于Raft实现的etcd出现了数据不一致和数据丢失的情况。在排查过程中,作者提出了多种可能的原因,并逐一验证排除。最终,通过对Apply流程的深入分析和测试,发现数据不一致是由鉴权版本号不一致导致的,而这一问题影响了etcd v3所有版本长达3年之久。作者成功复现并解决了这一Bug,并将解决方案提交给了社区。文章强调了对于分布式系统开发和运维人员的重要性,以及即使是基于Raft实现的强一致存储系统,也可能出现数据不一致的情况。此外,文章还总结了etcd数据不一致的风险和原因,并提出了一些最佳实践,如开启etcd的数据毁坏检测功能、应用层的数据一致性检测、定时数据备份等。总体而言,本文展示了技术问题排查的复杂性,对于从事分布式系统开发和运维的技术人员具有一定的参考价值。文章内容涵盖了作者在Kubernetes集群中遇到的etcd数据不一致问题,以及对应的排查和解决过程,强调了分布式系统开发和运维的重要性,同时提出了一些实用的最佳实践,为读者提供了宝贵的实践总结和技术参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《etcd 实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • Coder
    精彩,总体上获得以下收获: 1. 基础篇知识学以致用,问题定位、分析思路 2. 不一致bug原因,复制状态机模式的问题,应用日志条目到状态机时,因etcd里面含有各种业务逻辑,无法保证各个节点都成功 3. 了解几个常见不一致的bug, 这个老师能给下详细的github issue、pr地址,还需要深入消化小才能彻底搞懂 4. 最佳实践干货满满,感受到了老师在这块的丰富经验,我感觉监控key数挺好用的,也简单,数据安全是红线,定时备份太重要了,否则遇到老师说的数据不一致bug,就欲哭无泪了

    作者回复: 赞,有收获就好,总结到位,地址我给下: https://github.com/etcd-io/etcd/issues/11651 https://github.com/etcd-io/etcd/pull/11613 https://github.com/etcd-io/etcd/issues/11689

    2021-02-15
    9
  • yangf
    在项目中大量使用了 etcd,这里介绍两个曾经遇到的问题。 1. 使用 etcd watch,在 go watch client 中出现大量内存堆积的问题,一度怀疑是 etcd lib 的问题,深入定位后发现是从 watch channel 中消费速度小于 key 变更速度导致。(在我的个人博客里记录了这个问题:https://amyangfei.me/2020/12/19/best-practice-with-go-etcd/#Consume-data-from-the-watch-response-channel-ASAP ) 2. 使用 etcd lease 的一系列问题,包括 concurrency 包提供的 `session.Done` 通知存在延迟问题,etcd lease 删除 key 也存在的延迟删除问题。(个人博客里还有一篇文章对 lease 的一些实现原理和使用注意点做了分析:https://amyangfei.me/2020/12/27/thinking-about-etcd-lease/) 遇到 etcd 使用问题经常搜索,还见到过唐老师提的 issue/pr :-)

    作者回复: 赞,优秀,总结得挺好,watch这个案例我觉得可以给社区提个PR,在Watch API增加下说明,lease的实现的确会导致删除key存在延迟,甚至在高负载、磁盘IO异常等情况下会导致old leader也会触发撤销lease操作。

    2021-02-18
    3
    8
  • 春风
    老师,leader需要法定人数,脑裂在什么情况下发生呢

    作者回复: 如果出现网络分区故障,旧的leader和集群其他节点出现了网络隔离,其他节点选出了新leader,旧的leader也没有感知到新leader, 这时会出现短暂双leader。如果使用的串行读,那么旧的leader也能提供读取数据,线性读因需要获取集群共识数据,因此是无法读取的,旧的leader也是无法写入的。 严格意义上来说,这种情况不能称之为脑裂,就目前来说,如果不存在任何未知的bug, 基于Raft共识算法实现的etcd, 是可以防止脑裂发生的。

    2021-02-22
    2
    2
  • shp
    请问老师,每隔30分钟备份一次,如果需要使用备份恢复数据,那么在备份后到使用备份恢复前这段时间的数据操作是不是会全部丢失,还是有什么方法只恢复损坏的数据?

    作者回复: 是的,会丢失数据,备份可缩短到3-10分钟一次,etcd 3.5已经支持在learner节点上进行备份,对读写性能不会有任何影响,如果想恢复损害的数据要看具体情况了(比如什么bug触发的、是否某个节点有完整数据、业务client是否有打印写请求日志等),操作起来有不少复杂度,自从我文中所列的几个可能导致不一致bug被修复后,最近一年多社区已经没有报任何不一致的问题啦,如果担心不一致,可升级到3.4较新版本。

    2021-08-02
    1
  • 写点啥呢
    请教唐老师,04节内容中介绍etcd写请求流程中涉及到多个log,不稳定raft log->wal -> 稳定raft log,能不能请老师进一步介绍下这三个日志的用处和关系呢?特别是在涉及到节点崩溃数据恢复时候这几个日志是如何配合恢复数据的? 谢谢老师

    作者回复: 好的,等我忙完专栏目录计划的内容,答疑篇预计会增加一篇etcd启动后发生了什么,可以在这篇里面,增加相关内容,稍等哈

    2021-02-15
    1
  • Tachone
    apply 失败为啥不强制设置raft状态机为error呢,拒绝写入,这样应该是最安全的,不会出现数据不一致了还在写入
    2023-11-29归属地:北京
  • yybear
    获取各个节点的 revision 和 boltdb hash 值,若出现 Follower 节点的 revision 大于 Leader 等异常情况时,就可以认为不一致 --------------------------------- revision 是apply时递增的,如果follower的apply处理速度大于Leader 的速度,是存在Follower 节点的 revision 大于 Leader的情况吧?
    2021-10-08
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部