主要观点:Jetcd 是 etcd 协调服务的官方 Java 客户端库,存在不当重试机制,导致事务多次执行或看似失败实则成功,引发丢失更新、循环信息流和中止读取等问题,这些问题已存在两年半,无补丁但可禁用重试机制,此工作由 Jepsen 独立完成且符合伦理政策。
关键信息:
- 测试设计基于 2020 年 etcd3.4.3 的测试框架,重点关注 list-append 和 wr-register 工作负载及进程崩溃故障,用 tcpdump 捕获数据包,Wireshark 分析消息。
- 结果显示 Jetcd 会自动重试发送网络请求,在不安全上下文中会导致多种安全违规,如丢失更新、循环信息流和中止读取。
- 讨论指出这些问题影响 Jetcd0.6.0 至 0.8.2 版本,Jepsen 已向 etcd 和 Jetcd 报告但未得到妥善处理,Jepsen 强调其验证方法的局限性。
- 建议禁用 Jetcd 的重试机制,分布式系统工程师应注意区分确定失败和不确定失败,测试和解决服务器及客户端的问题。
重要细节: - 在丢失更新的示例中,一个 etcd 服务器崩溃时的三个事务,因 Jetcd 秘密提交事务两次导致事务交互不同版本,违反了 Read Committed、Snapshot Isolation 和 Serializable 一致性。
- 循环信息流的示例中,客户端秘密提交中间事务两次导致事务间出现循环,这在 Read Committed 和 Serializable 系统中不应出现。
- 中止读取的示例中,列表追加工作负载中的事务因 Jetcd 秘密提交导致已中止的事务被观察到,违反了多种一致性模型。
- Jepsen 曾向 etcd 和 Jetcd 报告问题但未得到有效解决,最终自行完成新的分析验证 Jetcd 问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。