资讯动态

如何本地搭建 etcd 健壮性测试环境:gofail 构建失败注入二进制并运行

发布时间:2026/9/13 22:49:49 来源:尧图企业网站定制
如何本地搭建 etcd 健壮性测试环境gofail 构建失败注入二进制并运行【免费下载链接】etcdDistributed reliable key-value store for the most critical data of a distributed system项目地址: https://gitcode.com/GitHub_Trending/et/etcd如果你要在本地跑 etcd 的健壮性测试robustness tests需要先解决一个前提问题这些测试依赖的失败注入能力crash、网络分区、故障点触发只有编译进带 failpoints 的 etcd 二进制后才可用。etcd 用 gofail 中有完整说明。健壮性测试的执行过程是按指定配置创建 etcd 集群 → 一边产生客户端流量一边注入故障 → 记录所有客户端操作及其结果 → 与 etcd 行为模型和一组校验器对比 → 发现问题时生成包含客户端操作记录和数据目录的详细报告。准备条件一份 etcd 仓库的本地 checkout。根目录 Makefile 通过git rev-parse --show-toplevel定位仓库根所以必须是一个 git 工作区且make可用。Go 工具链。仓库通过 .go-version 固定 Go 版本当前为 1.26.6tests/robustness/Makefile 中的test-robustness-reports目标会显式按该版本设置GOTOOLCHAIN。网络可用make gofail-enable会执行go install go.etcd.io/gofail版本并从模块代理拉取 gofail 依赖gofail 的版本号取自 tools/mod/go.mod当前为go.etcd.io/gofail v0.2.0。用 gofail 构建失败注入二进制在仓库根目录按顺序执行make gofail-enable make build make gofail-disable这三条命令的副作用和顺序约束如下make gofail-enable先把 gofail 安装到$GOPATH/bin/gofail然后对一组服务端目录执行gofail enable即server/etcdserver/、server/lease、server/lease/leasehttp、server/storage/backend/、server/storage/mvcc/、server/storage/wal/、server/etcdserver/api/v3rpc/、server/etcdserver/api/membership/、server/etcdserver/api/rafthttp/并在server、etcdutl、etcdctl、tests四个模块里执行go get go.etcd.io/gofail版本。这一步会修改仓库中的源码文件和 go.mod/go.sum目的是注入故障点代码。make build走 scripts/build.sh 编译把etcd、etcdctl、etcdutl等二进制输出到bin/目录。必须在 enable 和 disable 之间执行否则编译出来的二进制不含故障点。make gofail-disable对同样这批目录执行gofail disable并对上述四个模块执行go mod tidy把源码和模块文件恢复到未注入状态。如果make build失败也要先跑这条命令再排查避免把带注入代码的源码留在工作区里。构建完成后带故障点的二进制位于bin/。健壮性测试框架默认就从这里取二进制e2e 框架的--bin-dir标志默认值就是仓库的bin目录见 tests/framework/e2e/flags.go。运行健壮性测试构建完成后执行make test-robustness该目标定义在根目录 Makefile 中PASSESrobustness ./scripts/test.sh $(GO_TEST_FLAGS)对应 scripts/test.sh 里的robustness_pass实际执行go test ./tests/robustness默认超时 30 分钟可用TIMEOUT变量覆盖。它直接运行上面编译好的二进制不会再走make build。可选的环境变量来自 tests/robustness/README.md环境变量作用GO_TEST_FLAGS追加传给go test的参数。README 建议多次重复运行并启用 failfastGO_TEST_FLAGS--count100 --failfastEXPECT_DEBUGtrue输出集群日志RESULTS_DIR修改结果报告保存位置默认在/tmp/下按测试名创建子目录PERSIST_RESULTS持久化测试报告。默认情况下只有失败运行才会保存报告TRACING_SERVER_ADDR把 OpenTelemetry trace 导出到指定地址的 collector例如localhost:4317验证运行结果健壮性测试默认只在失败时生成报告所以安静地跑完就是预期结果之一。如果测试失败按日志定位报告在测试日志中找Saving robustness test report这一行path字段就是报告目录例如/tmp/TestRobustnessExploratory_Etcd_HighTraffic_ClusterOfSize1。报告目录的结构server-*etcd 服务端数据目录每个member下有wal可用 tools/etcd-dump-logs 分析和snap包含 bbolt 数据库文件db可用 tools/etcd-dump-db 分析。client-*客户端请求/响应的 JSON 转储watch.json记录 Watch 请求与响应operations.json记录 KV 操作历史。history.htmlKV 操作历史的可视化文件可用浏览器打开页面上有[ jump to first error ]按钮直接跳到校验报错位置。README 中给出的典型失败日志文档示例线性化问题报ERROR Linearization illegal随后Skipping other validations as linearization failedWatch 问题报ERROR Broke watch guarantee。看到这类日志说明报告已保存按上面目录结构取对应的history.html或client-*/watch.json分析。可选分支复现历史问题与重评报告如果你要复现已知 bug 而不是探索性运行tests/robustness/Makefile 提供了针对具体 issue 的目标例如make test-robustness-issue14370、make test-robustness-issue15271。这些目标会自动完成三件事把对应版本如 v3.5.4的 etcd clone 到/tmp/etcd-v3.5.4-failpoints/、注入 gofail 并用FAILPOINTStrue ./build构建、再用--runTestRobustnessRegression/Issue14370 --count 100 --failfast运行测试结束时打印Failed to reproduce或Successful reproduction。注意其副作用目标规则会先rm -rf对应/tmp/etcd-*-failpoints目录再重建并且需要从 GitHub 拉取源码仅限本地实验环境使用。如果你已经有一份失败报告、想在修复模型后重新校验它把报告目录复制到tests/robustness/testdata/下目录名唯一即可报告目录本身可以包含多份报告然后运行make test-robustness-reports该目标在tests模块中执行go test ./robustness/validate -v --count 1 --run TestDataReports校验testdata目录里所有报告。README 明确说明报告格式不稳定不能保证所有旧报告都能用最新版本重评。限制带 failpoints 的二进制只用于本地健壮性测试不要拿去充当正式服务二进制make gofail-disable后工作区应回到无注入状态。探索性测试TestRobustnessExploratory每次随机挑选故障点同一场景多次运行的注入位置可能不同这也是 README 建议用--count100 --failfast多轮重复的原因。报告默认只在失败时持久化需要留存成功运行报告时显式设置PERSIST_RESULTS。【免费下载链接】etcdDistributed reliable key-value store for the most critical data of a distributed system项目地址: https://gitcode.com/GitHub_Trending/et/etcd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价