前言
对于一款分布式存储产品来说,最重要的莫过于在系统运行过程中性能稳定且在异常触发时可靠。因为存储系统不单单需要考虑软件本身的一些问题, 而且分布式存储服务由于“数据密集型”的特点,更多的要关注内存、磁盘等存储资源。故障场景的触发非常简单,很多现成的工具都可以用来进行异常实验触发,比如 Choas Mesh\Namazu\ChaosBlade,但从我们对存储系统的测试经验看,很大一部分问题还是发生在故障触发+软件操作等组成场景下的故障实验,并且 bug 暴露具有偶然性,另外对系统实验后进行整体的健康校验和阈值设置也是最重要的卡点,如何对 Curve 的可靠性、稳定性按照这些要求进行校验和磨练,就成为了测试的重点。
卡点门禁
实验理念
- 真实物理环境:Ceph 也有一套较系统自动化测试套 teuthology,测试用例也是非常细致,但是在实际使用过程中由于用例量较大、每个用例重新部署环境等原因需要花费很多时间,以致很多测试人员会选择虚拟机进行使用。而在真实环境下测试往往跟容易发现一些内核、硬件等兼容性问题;
- 基础数据:需要在启动所有用例测试前的 setup 中进行基础数据执行,比如fio、vdbench 等工具的启动模拟真实不中断的业务场景,还可以根据修改的内容精准推算使用场景,比如 OpenStack\AI\K8S 场景;
- 有效卡点:在 Curve 的异常自动化里,会有很多异常场景下的卡点,可以有效阻断不稳定代码的合入。比如:我们要求存储服务单进程故障时 io 需要在5s内恢复、数据迁移的时间要求、硬盘故障恢复要求等;
- 提高场景覆盖:设计过程中我们会尽量提高异常场景的覆盖,同时也要考虑测试效率的折中。比如:在整个异常测试集进行过程中,我们会不断的做存储系统的部分接口操作(创卷、删卷、扩容、快照等),这样控制面基本在异常场景也做到了很大的场景覆盖,同时也大大提升了测试效率;
- 高频次触发:由于存储系统的复杂性,分布式存储的很多 bug 都是概率性触发的,这就使得我们不仅仅在代码提交时会去触发异常自动化,在其他空余时间比如晚上都会去不断触发测试,也大大降低了人工测试的成本;
故障场景
架构组合
存储系统跟系统架构、环境配置、发行版等都是息息相关,要想存储系统能在所有场景下都稳定运行,关键还在于如何快速的对各个场景做可靠性验证。
如上图,我们在排列组合出各种环境架构组合后,再结合上述的故障场景触发进行测试,做到所有架构情况下的异常覆盖。
关键指标
在整个异常执行过程中,如何评判整个系统的稳定性成为这个测试过程的重中之重。在 Curve 存储系统的测试过程中,我们会特别关注以下几个指标做为稳定性的卡点:
stability metric指标:在异常注入后,通过获取接口成功 qps、存储卷iops、io处理时延等 metric 信息做为其中一项测试通过指标;
负载指标:负载关键指标包括主要进程的CPU、内存使用情况,比如 chunkserver\metaserver\mds 等服务;
压测工具指标:我们会在整个集群部署完成后测试启动前将压测工具启动,做为背景数据进行加压,包括 fio\vdbench\mdtest,压测工具需要同时覆盖基本的 io 场景,包括 4k randrw 和 1024k rw ,并且在测试过程中需要去做故障前后的 io 情况抖动校验,较好的保障了基础故障场景下集群的可用性。同时 vdbench 也可以做业务层数据一致性的校验;
一致性指标:数据一致性对应分布式系统来说是最高级别的要求。包括业务层写入一致性,三副本一致性,元数据一致性,快照克隆前后数据一致性等等。vdbench 等压测工具可以做到业务层面的一致性校验,三副本一致性、元数据一致性我们会在内部增加校验接口,直接调用后触发校验,这些都会在每个故障场景触发后做为测试通过的凭证;
恢复速度指标:分布式存储系统需要有比较完善的负载均衡和故障冗余副本恢复策略,通过自动化调整参数触发集群数据迁移,判定迁移数据量、完成情况和花费时间,基本就可以判断出集群的故障恢复能力。
工具使用
在整个异常执行过程中,尤其是硬件层面的异常主要通过工具来模拟。比较常用的测试工具并且已经集成到 Curve 自动化流程中的,比如:
磁盘故障注入 systemtap
网络故障使用 tc
内存故障 memtester
Ipmitool 节点宕机
Mce-test cpu 故障
Chaosd模拟进程挂起、结束、通信超时、状态异常
压测工具 fio\vdbench\iozone\mdtest
一致性检测工具 vdbench/jepsen
一些混沌测试工具也可以做为我们场景实验的一员,比如前面提到的ChaosMesh、Chaosblade。
总结
Curve 在整体代码提交和每个晚上都会进行严格的异常自动化套执行,极大的保障了主线版本代码质量的稳定性。自动化代码同时也在随着版本功能进行不断的迭代更新,有兴趣的小伙伴也欢迎一起参与守护开源项目 Curve 高质量的乐趣之中!