etcd鲁棒性自主测试
作为Kubernetes等生产系统的关键组件,etcd项目的首要任务是可靠性。确保一致性和数据安全要求项目贡献者持续改进测试方法。在本文中,我们将介绍如何利用高级模拟测试来发现细微错误、验证发布版本的鲁棒性,并增强对etcd稳定性的信心。我们将分享关键发现以及它们如何改进etcd。
增强etcd鲁棒性测试
许多关键软件系统依赖etcd保持正确性和一致性,尤其是作为Kubernetes的主要数据存储。在v3.5版本出现一些问题后,etcd维护者开发了新的鲁棒性测试框架,以更好地测试各种故障场景下的正确性。为了进一步增强测试能力,我们将Antithesis的确定性模拟测试平台集成到工作流程中。
该平台通过在确定性管理程序中运行整个etcd集群来工作。这种专门环境赋予测试软件对每个非确定性源的完全控制,包括网络行为、线程调度和系统时钟。这意味着它发现的任何错误都可以完美且可靠地重现。
在这种模拟环境中,测试方法从传统的基于场景的测试转向声明式属性验证。这种方法不是使用严格断言来命令式地编写针对特定结果的测试,而是使用关于系统行为的声明性属性断言。这些属性是系统必须始终保持的高级不变量,例如“数据一致性永不违反”或“监视事件从不丢失”。
该平台随后将这些属性视为要破坏的目标,而非被动检查。它结合自动化探索和定向故障注入,积极搜索导致属性违反的精确事件序列和故障组合。这种主动搜索违规的方式使平台能够发现由复杂因素组合产生的细微错误。Antithesis将这种方法称为“自主测试”。
这建立在etcd现有鲁棒性测试的基础上,后者也采用基于属性的方法。然而,在没有确定性环境或自动化探索的情况下,原始框架类似于蒙眼投掷飞镖并希望命中靶心。可能会发现错误,但该过程严重依赖随机机会且难以重现。Antithesis的确定性模拟和主动探索移除了眼罩,实现了系统化且可重现的错误搜索。
测试方法
我们此次测试的目标是:
- 验证etcd v3.6的鲁棒性
- 通过发现和修复错误来提高etcd软件质量
- 通过自主测试增强现有测试框架
我们在Antithesis模拟平台上运行现有鲁棒性测试,针对3节点和1节点etcd集群测试了各种故障,包括:
- 网络故障:延迟、拥塞和分区
- 容器级故障:线程暂停、进程终止、时钟抖动和CPU限制
我们测试了具有已知错误的旧版etcd以验证测试方法,同时测试了稳定版本(3.4、3.5、3.6)和主开发分支。总共运行了830小时实际测试时间,模拟了4.5年的使用情况。
发现结果
结果令人印象深刻。模拟测试不仅找到了我们测试的所有已知错误,还在主开发分支中发现了几个新问题。
关键发现包括:
- 发现了一个关键监视错误,该错误被现有测试遗漏,存在于所有稳定版本的etcd中
- 所有已知错误均被找到,增强了我们对组合测试方法发现回归问题的信心
- 通过揭示线性化检查器模型中的缺陷,改进了我们自己的测试
主开发分支中的问题
描述 | 报告链接 | 状态 | 影响 | 详情 |
---|---|---|---|---|
对未来修订版的监视可能收到旧事件 | 分类报告 | 已在3.6.2修复 (#20281) | 中 | Antithesis发现的新错误 |
对未来修订版的监视可能收到旧通知 | 分类报告 | 已在3.6.2修复 (#20221) | 中 | Antithesis和鲁棒性测试共同发现的新错误 |
短时间内收到两个快照时发生恐慌 | 分类报告 | 待处理 | 低 | 先前由鲁棒性测试发现 |
数据库页预期为5时发生恐慌 | 分类报告 | 待处理 | 低 | Antithesis发现的新错误 |
基于监视响应的操作时间不正确 | 分类报告 | 已在主分支修复测试 (#19998) | 低 | Antithesis发现的鲁棒性测试中的错误 |
已知问题
Antithesis还成功找到并重现了这些在旧版本中的已知问题——etcd维护者设置的“Brown M&Ms”集合。
描述 | 报告链接 |
---|---|
压缩删除时监视丢失事件 | 分类报告 |
压缩期间崩溃导致版本号减少 | 分类报告 |
监视进度通知未与流同步 | 分类报告 |
碎片整理期间崩溃导致版本不一致 | 分类报告 |
可监视运行锁错误 | 分类报告 |
结论
将这种高级模拟测试集成到我们的开发工作流程中取得了成功。它使我们能够发现和修复关键错误,改进现有测试框架,并增强对etcd可靠性的信心。我们将继续利用这项技术,确保etcd仍然是社区稳定可信的分布式键值存储。