AutoMQ BYOC(FSx WAL)· 撮合订单总线场景实测 —— 技术交流材料
致 AutoMQ 团队:这是我们在 AWS 东京区对 AutoMQ 商业版(BYOC,FSx for ONTAP WAL)做的一轮系统实测的整理。 目的是交流与请教:把我们看到的现象、复现条件和数据完整摆出来,请贵方指出我们在用法 / 配置上的不当之处, 并对其中的疑似缺陷给出解释、规避或修复计划。
口径:「实测」= 结果文件里的数字或 broker 日志原文;「我们的理解」= 推测,单独标出,欢迎纠正。 每个问题都给出复现条件;所有消息都做了逐条审计(丢失 / 乱序 / 重复),全部测试中未发现已确认消息丢失。
测试时间:2026-10-28 – 11-08 · 版本:控制台 8.4.7 → 8.4.8-aws,数据面 5.5.6 → enterprise-core 5.5.7(Kafka 3.9.1)。
目录
- 一页摘要
- 评估场景与门槛
- 测试环境
- 测试方法
- 测试覆盖
- 正面结果
- 需要交流的问题(7.1 双 FSx 专章 · 7.2 Q28 · 7.3 FSx 首选 AZ · 7.4 Q29 · 7.5 S3 · 7.6 灰色故障 · 7.7 kill -9 · 7.8 客户端规避的代价 · 7.9 运维与配置 · 7.10 部署与文档)
- 5.5.7 已不再复现的问题
- 问题清单汇总
- 建议的交流方式与我们能提供的材料
1. 一页摘要
我们测了什么:把 AutoMQ 商业版当作撮合 / 交易系统的订单总线来评估——单分区与多分区、acks=all + 幂等、开环定速订单流,
1k–200k msg/s 速率阶梯、1–4 h 浸泡,以及十余类故障与运维事件(进程崩溃、受控重启、AZ 网络分区、AWS FIS 模拟 AZ 级故障、
FSx HA 切换、broker ↔ FSx 灰色故障、S3 不可用、扩缩容、在线升级、单 FSx / 双 FSx)。
稳态表现很好:5.5.7 单分区 4 h 浸泡 288 M 条,p99 7.87 ms、p99.99 32.65 ms,0 丢 / 0 失败;客户端调优后单分区 200k msg/s、p99 8.66 ms; 在线升级、在线扩缩、FSx 备份 / 扩 IOPS / 扩 SSD 都几乎无感;broker 实例被停后 BYOC 约 1.7 min 自动拉起替换实例。
希望重点交流的 5 件事(详见 §7):
| # | 主题 | 一句话 |
|---|---|---|
| 1 | 双 FSx(file_system_count = 2) |
我们按建议部署了双 FSx,但没有看到「消除 FSx 单点」的效果:切断任一套仍全集群停写;失去一套 ≈ 5 min 后部分分区不自愈、需人工重启;双 FSx 缩回单 FSx 会让 broker 崩溃循环(Q30) |
| 2 | Q28 | FSx 首选 AZ 短暂网络分区后,长连接幂等生产者被持续 [OUT_OF_ORDER] 拒写、永久写不进去;5.5.7 仍复现 |
| 3 | FSx 首选 AZ = 全集群故障域 | 该 AZ 网络分区或 AZ 级故障时,三个 AZ 的生产者一起停写(FIS 实验:369–376 s) |
| 4 | Q29 | 无任何故障,12 个生产者的负载下 CPU 背压把 RequestRate 配额 20,000 压到 ≈ 2,400,Produce 一起被限,周期性停写 5–8.6 s |
| 5 | S3 不可用 | 5.5.7 上 S3 不可用 300 s 即停写 106–136 s(5.5.6 同条件 0 影响),停写随 S3 中断时长增长 |
我们希望得到的:对每个问题,①是否为预期行为 / 已知问题;②正确的配置或用法;③若是缺陷,修复版本与时间; ④我们可以在新版本上按同一套方法复测并回传结果。
2. 评估场景与门槛
场景:撮合引擎的订单入口总线。要求同一 key(交易对 / 账户)严格有序、已确认消息零丢失、任何单点故障下停写尽量短且能自动恢复。
生产端为长连接网关(幂等生产者,acks=all),典型为单分区(严格全序)或少量分区。
我们用的评估门槛(项目内部建议值,供理解数据的含义;不是对产品的通用要求):
| # | 指标 | 门槛 |
|---|---|---|
| L-1 / L-2 | 稳态写确认 p99 / p99.9(200 B,acks=all) |
≤ 10 ms / ≤ 20 ms(20 / 50 ms 为可接受上沿) |
| L-3 | 2 h 浸泡 p99.99 / max | ≤ 50 ms / ≤ 200 ms |
| F-1 | 单 broker 硬故障,受影响分区停写 | ≤ 10 s(30 s 为可接受上沿) |
| F-2 | FSx HA 切换,全集群停写 | ≤ 5 s(30 s 且可预约为上沿) |
| F-3 | 已确认消息丢失 | 0 |
| F-4 | 每 key 乱序 | 0 |
| F-5 | 迁移 / 自平衡 / 滚动升级,每次停写 | ≤ 3 s |
| F-6 | 恢复是否需要人工 | 全自动 |
| F-7 | S3 不可用时写路径不受影响的时长 | ≥ 300 s |
「停写」一律指订单流最长连续零确认秒数;「最大确认」是单条消息最长确认时间,二者不同,下文分开写。
3. 测试环境
| 项 | 值 |
|---|---|
| Region / AZ | ap-northeast-1,apne1-az1 / az2 / az4 各一台 broker |
| 版本 | 控制台 automq-byoc-console:8.4.7-aws → 8.4.8-aws;数据面 5.5.6 → enterprise-core-5.5.7(Kafka 3.9.1,在线滚动升级);Terraform provider automq/automq 0.4.10 |
| broker | 3 × m7g.xlarge(4 vCPU / 16 GiB),KRaft combined(3 个都是 controller),broker.session.timeout.ms = 9000 |
| WAL | wal_mode = FSWAL,file_system_type = ONTAP_V2;FSx MULTI_AZ_2,384 MBps(部分测试 768 MBps)、1,024 GiB、3,072 IOPS(后升至 6,144);首选子网 = az2 的 broker 子网,备用 = az1 |
| 双 FSx 阶段 | file_system_count = 2(控制台 apply 1,834 s),三台 broker 同时挂载两套 /wal;两套 FSx 的首选子网都在 az2 |
| 计费 | Pay-as-you-go · pricing_mode = UsageBased |
| 网络 | broker 专用子网(每 AZ 一个、独立 NACL,用于故障注入),出网经 NAT;S3 Gateway Endpoint、EC2 Interface Endpoint;客户端在独立子网 |
| 客户端 | 3 × c7g.2xlarge(每 AZ 一台),Java 21,Kafka 客户端库 4.1.1;压测工具为自研 Bench(开环定速 + 逐条审计,可提供源码) |
| 实例级配置 | log.retention.ms = 3600000、auto.create.topics.enable = false;放置敏感测试中经 instance_configs 设 autobalancer.controller.exclude.topics(订单 topic 排除自动均衡,见 Q8) |
| 服务端 zone router | automq.zonerouter.channels=1@nfs:///mnt/nfs/1?…(STATIC)、automq.zonerouter.local.write.mode=router_channel(DEFAULT) |
4. 测试方法
4.1 订单流模型
| 项 | 取值 |
|---|---|
| 消息 | 100 / 200 / 500 B;value = [生产者标签][key 序号][每 key 单调递增 seq][计划发送时刻][填充] |
| key | 每生产者 64 个(浸泡 256),轮询分配;每 key 的 seq 从 0 单调递增 |
| topic | 多分区 me-orders 24 分区(均匀铺到 3 台);按 AZ 钉位的 me-pin-az1/az2/az4 各 6 分区;单分区 me-sp-az1(leader 在 az1) |
| 发送 | 开环定速:第 i 条的计划时刻 = start + i / rate;延迟从计划时刻算,避免协调遗漏(coordinated omission) |
| 生产者 | acks=all、enable.idempotence=true;in-flight、linger、batch、压缩、超时、zone router 开关按变体组合(附录 A) |
| 审计消费者 | 同一 JVM、同一时钟,assign 全部分区,从发送前的 end offset 读到 drain 结束(最多 90 s) |
| 统计 | 对数线性直方图(< 10 ms 精度 10 µs)报 p50 / p90 / p99 / p99.9 / p99.99 / max;每秒时间线(发送、确认、失败、零确认秒) |
4.2 逐条审计的定义
| 字段 | 定义 |
|---|---|
丢失(lost_exact) |
收到成功确认、但 drain 结束后审计消费者仍未读到的条数(位图精确计算)。> 0 即一票否决 |
| 报失败但已写入(phantom) | 生产者回调报失败、但审计消费者读到了的条数(Kafka 超时语义的通性,用于判断业务侧是否必须幂等) |
| 重复 / 乱序 | 同一 (key, seq) 读到 ≥ 2 次 / 读到的 seq ≤ 该 key 已见最大值 |
| 未确认尾部 | 审计消费者落后(consumed < acked)且流内无缺口时,drain 内没读到的尾部单列为「未确认」,不计为丢失 |
| 零确认秒 | 每秒时间线中有发送、但确认数为 0 的秒 |
4.3 故障注入
| 故障 | 做法 |
|---|---|
| 进程崩溃 | 对 leader 所在 broker pkill -9 -f kafka.Kafka;另有二次崩溃、杀 controller |
| 受控关闭 | EC2 stop(触发 broker 受控关闭) |
| AZ 网络分区 | broker 子网 NACL:保留子网内互通,对外全断(az2 子网同时承载 FSx 首选 ENI) |
| AZ 级组合故障 | AWS FIS 一个实验内同时 aws:network:disrupt-connectivity(broker 子网,scope all,5 min,FIS 自动回滚)+ aws:ec2:stop-instances(该 AZ 的 broker);客户端不受影响 |
| broker ↔ FSx 灰色故障 | NACL 只拒绝 broker → FSx 浮动 IP 的 NFS 端口(111 / 635 / 2049 / 4045 / 4046) |
| FSx HA 切换 | 带外修改 FSx 吞吐档触发(AWS 例行维护会触发同类切换) |
| 失去一套 FSx(双 FSx) | 对其中一套 FSx 的 NFS 端口做上述切断,60 s / 300 s,可叠加 kill -9 |
| S3 不可用 | broker 实例角色内联 Deny s3:* 300 s / 900 s |
| 运维事件 | 在线升级、扩缩 3 ↔ 6、分区迁移、控制台换 FSx 吞吐档、FSx 备份 / 扩 IOPS / 扩 SSD、FSx 邻居负载、历史回读 |
公共负载:三路审计订单流(三个 AZ 的客户端,各 5k msg/s × 200 B),注入前 130 s 稳态、注入后保持并在 finally 中撤销,每路 900 s + drain;
相邻故障间隔 ≥ 300 s;故障后对各 topic 做写入探测,判断是否自愈。
4.4 数据有效性纪律
- 单变量:两组对照只差一个变量(客户端超时、幂等、in-flight、单 / 双 FSx、版本)。
- 复测:关键结论至少 2 次;单次离群必须复测;结论里写明「n 次中 m 次」。
- 放置校验:自动均衡会改掉手工放置(见 Q8),放置敏感测试前后都校验 leader 位置,不符即重新钉位并作废该组。
- 作废规则:重叠运行、放置漂移、注入实际时长与名义不符、网络路径异常(如 WAL 绕行 NAT,见 Q15)的结果全部作废重跑,不进本文。
5. 测试覆盖
| 类别 | 内容(5.5.7 为主,部分 5.5.6 对照) |
|---|---|
| 稳态延迟 | 消息大小 × in-flight × linger × 放置(同 AZ / 跨 AZ / 靠近 FSx 首选)矩阵;1k–50k / 1k–200k 速率阶梯(单分区与多分区) |
| 客户端调优 | 单分区 38 个客户端组合(batch.size、压缩、linger、in-flight、超时)按同一判据选优 |
| 浸泡 | 多分区 2 h、单分区 1 h / 4 h;双 FSx 2 h |
| 业务形态 | 12 生产者同写、4 KiB 大消息、5 组消费者扇出、事务、单分区混合负载(24k msg/s + 事务) |
| 故障 | kill -9(5.5.6 15 次、5.5.7 23 次)、EC2 stop、AZ 网络分区(三个 AZ)、FIS AZ 级组合故障(az1 × 2、az2 × 2)、灰色故障、FSx HA 切换、S3 不可用、客户端超时 / 幂等 / zone router 各变体 |
| 双 FSx(D0–D11) | 单 FSx 基线重跑、切断一套 66 s / 300 s、叠加 kill -9、计划内 HA 切换(单套 / 两套同时)、FSx 首选 AZ 分区、单分区 Q28、2 h 浸泡、缩回单 FSx |
| 运维 | 在线升级 5.5.6 → 5.5.7、扩缩 3 ↔ 6、分区迁移、换 FSx 吞吐档、FSx 备份 / IOPS / SSD、邻居负载、历史回读 30 GB |
6. 正面结果
| 项 | 5.5.7 实测 |
|---|---|
| 单分区 4 h 浸泡(20k msg/s × 200 B) | 288.0 M 条:p50 6.16 / p99 7.87 / p99.9 15.35 / p99.99 32.65 / max 235.6 ms;0 丢 / 0 失败 |
| 客户端调优后单分区上限 | batch.size 256 KiB + zstd(1):1k–200k 全部达标,200k p99 8.66 ms;1 h 浸泡(20k)p99.99 33.75 / max 88.82 ms |
| 在线升级 5.5.6 → 5.5.7 | 逐台换实例,每台一个 1.1–2.9 s 尖刺,0 丢 / 0 乱序 / 0 重复 / 0 失败 |
| 在线扩缩 3 ↔ 6 | 订单 topic 最大确认 0.1–0.3 s(5.5.6 缩容为 2.14–2.39 s) |
| FSx 在线运维 | 备份、IOPS 3,072 → 6,144、SSD 1,024 → 1,536 GiB:三项最大确认 0.1 s、0 失败 |
| FSx HA 切换(单 FSx) | 单段 ≤ 6.5 s、最长零确认 3–4 s(5.5.6 最长 10.1 s),0 丢 |
| broker 实例丢失 | FIS 停掉 az1 broker 后,BYOC 约 1.7 min 在同 AZ 自动拉起替换实例 |
| 双 FSx 尾延迟 | 稳态 p50 低 0.3–1.1 ms;2 h 浸泡 p99.99 26.55 / max 56.8 ms(单 FSx 55.85 / 238.7 ms) |
| 数据安全 | 全部测试中已确认消息丢失 0、乱序 0、重复 0 |
7. 需要交流的问题
每节格式:现象 → 复现条件 → 实测数据 → 日志原文 → 我们的理解(推测)→ 想请教。编号沿用我们此前材料中的 Q 编号,便于对照。
7.1 双 FSx(file_system_count = 2)—— 专章
背景:针对「FSx 是 WAL 单点」,贵方建议组合两个 FSx cluster。我们在 5.5.7 + 控制台 8.4.8 上部署了双 FSx(apply 1,834 s),
三台 broker 同时挂载两套 /wal,两套 FSx 的首选子网都在 az2。下表是同一 harness 下单 FSx 与双 FSx 的对照:
| 验证 | 单 FSx | 双 FSx | 我们的观察 |
|---|---|---|---|
| 稳态 p50 / p99(24 分区,1k → 50k) | 6.5–7.5 / 9.9–15.9 ms | 6.1–6.8 / 9.8–13.1 ms | 略好 ✅ |
| 2 h 浸泡 p99.99 / max | 55.85 / 238.7 ms | 26.55 / 56.8 ms | 尾部明显更好 ✅ |
| 切断一套 FSx(NFS 端口)≈ 66 s(D1) | 全集群停写 62–70 s,0 失败 | 全集群停写 62–85 s,失败 16,644 | 没有切换到另一套 |
| 切断一套 ≈ 300 s(D2)/ 再叠加 kill -9(D3) | (对照:broker ↔ FSx 切断 120 s ⇒ 停写 149 s,自愈) | 零确认 369–524 s / 333–573 s,失败 289 万 / 439 万;故障撤销 10 min 后仍有分区不可写,受控重启 broker 后才恢复(2 / 2) | 新的不自愈模式 |
| 单分区切断一套 300 s(D8) | — | 三路零确认 369 s,失败 89.7 万,自愈 | 没有切换 |
| 计划内 HA 切换(单套 2 次 + 两套同时 2 次) | 零确认 3–4 s,最大 ≤ 6.5 s | 零确认合计 16–39 s,最坏一秒 3.9–10.3 s,自愈 | 比单 FSx 更重 |
| FSx 首选 AZ 网络分区 64 s(D6) | 120–146 s(多分区) | 全集群 71–74 s,0 失败,自愈 | 两套同时受影响(首选同 AZ) |
单分区 FSx 首选 AZ 分区 61 s + delivery.timeout.ms=30000(D10) |
2 次中 1 次永久卡死(Q28) | 两路生产者永久卡死(≥ 773 s),失败 786 万,[OUT_OF_ORDER] 34 次 |
不缓解 Q28 |
| 缩回单 FSx(2 → 1) | — | broker 1 崩溃循环 1,266 次,控制台任务挂起 ≥ 3 h(Q30,下详) | 无法回退 |
D2 / D3 中 broker 日志里没有 Q20 / Q21(5.5.6 的 kill -9 长尾)的特征,我们认为这是另一种故障模式。
Q30 细节(双 FSx 缩回单 FSx)
- 操作:
file_system_count2 → 1(terraform plan 显示 in-place、0 destroy),对应控制台 Task 99。 - 现象:step 0–11 在 10:55:34–36Z 完成;step 12
RefreshNodeForFileSystemTaskStep每 5 s 轮询,≥ 3 h 不结束,没有 WARN / ERROR。 az2 的 broker 1 自 12:17:42Z 起启动即致命退出,13:55Z 前累计 1,266 次(约 32 s 一次)。其余 2 台继续服务,0 个不可用分区。 - 日志原文:
Exiting Kafka due to fatal exception during startup … NullPointerException: Cannot invoke "java.lang.Long.longValue()" because the return value of "java.util.NavigableMap.floorKey(Object)" is null [CONFIRM_WAL-1-…] Using the old config NodeMetadata{nodeId=1, … walConfig='0@any://?walID=2,2@nfs:///mnt/nfs/2?iops=1000&iodepth=4'} for recovering 新配置:s3.wal.path = 0@any://?walID=1&walID=2,1@nfs:///mnt/nfs/1…,2@nfs:///mnt/nfs/2… - 回退:plan 显示控制台仍记为 2 套 ⇒ 改回 2 是 no-op,没有 API 回滚路径。最终只能删除实例重建(控制台在挂起状态下接受删除,40 min,实例内数据丢弃)。 扩容 1 → 2(约 9 min)正常。
我们的理解(推测):file_system_count = 2 是 WAL 的负载分摊,不是健康感知的故障切换——每台 broker 同时依赖两套 FSx(NFS hard 挂载),
其中一套不可达时,写到它上面的 WAL 被阻塞而不是被避开,故障面从 1 套变成了 2 套;两套首选节点同 AZ,也没有 AZ 冗余。
缩容时 broker 恢复阶段读到旧的 WAL 映射,与新配置不一致。
想请教:
- 双 FSx 的设计目标是什么——吞吐 / 尾延迟分摊,还是可用性?如果是后者,D1 / D2 / D8 的表现是否符合预期?
- 是否有(或计划)「WAL 自动避开不可达的 FSx」的能力?需要什么配置?
- D2 / D3 故障撤销后,为什么部分分区持续不可写、需要受控重启?对应的日志特征与修复?
- 两套 FSx 的首选节点能否由控制台分到不同 AZ?
- 双 FSx 下计划内 HA 切换为什么比单 FSx 停顿更长?
- FSx 2 → 1 缩容是否受支持?若支持,正确步骤是什么;若不支持,控制台为何接受该变更、且不报错不回滚?Q30 的修复计划?
- 在贵方的推荐架构里,撮合类场景要消除 FSx 单点,应该怎么部署?
7.2 Q28 —— FSx 首选 AZ 短暂分区后,长连接幂等生产者永久写不进去
- 现象:FSx 首选 AZ(az2)网络分区约 60–80 s 后,存活的幂等生产者被 broker 持续判为序号乱序,既不接受写入、也不返回可恢复的错误, 该生产者每条都超时,直到运行结束都没恢复。分区本身可写:同一时刻新建的生产者 0 s 就能写。
- 复现条件:客户端
delivery.timeout.ms=30000(附录 A 的 rt5)。「批次过期」是必要条件但不充分:默认超时下一次停写 124–125 s 也有批次过期,但没有卡死。 - 实测:
| 形态 · 客户端 | 复现 | 卡死 / 停写 | 失败笔数 |
|---|---|---|---|
| 5.5.6 多分区 · rt5 | 2 / 2 | 零确认 ≥ 769 s / 772 s,到运行结束未恢复;解除隔离 12 min 后仍在刷 [OUT_OF_ORDER] |
384 万 / 386 万 |
| 5.5.7 多分区 · rt5 | 2 / 4 | 两次 770–771 s 零确认到运行结束;另 2 次全集群 127 s / 146 s 后自愈 | 152.9 万–483.8 万 / run |
| 5.5.7 单分区 · rt5(单 FSx) | 1 / 2 永久 | 一次三路全部永久卡死(≥ 770 s);一次 138–139 s 后自愈 | 1,141.7 万 / 148.2 万 |
| 5.5.7 单分区 · rt5(双 FSx,D10) | 1 / 1 | 两路 773 s / 782 s 到运行结束未恢复 | 见 7.1 |
丢失全部为 0。broker 日志:对相关分区持续打印 [OUT_OF_ORDER] processing append operation(ElasticReplicaManager),单分区每次运行约 34 次。
- 我们试过的规避及代价:
delivery.timeout.ms=120000(rt5d):不再永久卡死,但 5.5.7 多分区停写约 126 s(失败 104,294);单分区停写 249 s(失败 185,154)。- 关幂等 + in-flight 1:不再永久卡死,但三路仍停写 133–139 s,「报失败但已写入」升高,且关幂等后重试理论上会产生重复。
- 双 FSx:不缓解。
- 我们的理解:此前沟通中提到 5.5.7 已修复该问题,但我们在 5.5.7 上仍能复现。
- 想请教:① 服务端为何既不接受、也不返回可让客户端恢复的错误(标准 Kafka 的
OUT_OF_ORDER_SEQUENCE_NUMBER/ epoch bump 路径)? ② 请从源码确认确切触发条件与修复版本;③ 与历史 issue #369 / #509 / #584 是否同类?④ 在修复前,是否有不降吞吐、不关幂等的推荐规避?
7.3 FSx 首选 AZ = 全集群故障域
- 现象:FSx 只有一个 HA pair。首选节点所在 AZ 网络不通时(FSx 本身健康,不触发 HA 切换),所有 broker 的 WAL 都不可达,failover 也读不到 WAL,只能等故障解除。
- 实测:
- NACL 隔离 az2 子网(名义 60 s):5.5.7 多分区停写 120–146 s,与客户端超时配置无关;rt5d 客户端 126 s、失败 104,294。双 FSx(D6,隔离 64 s)71–74 s。
- AWS FIS AZ 级组合故障(断 broker 子网 5 min + 停该 AZ broker,单分区,推荐客户端): 拿掉 az1(非 FSx 首选)× 2 ⇒ 三路零确认 77–81 s、最坏一秒 69.5–72.4 s,0 失败、0 丢,BYOC 约 1.7 min 自动拉起替换实例; 拿掉 az2(FSx 首选子网)× 2 ⇒ 三个 AZ 的生产者全部停写 369–376 s、最坏一秒 300 s、每路 29.9–33.3 万笔失败,0 丢,故障撤销后 0 s 可写。
- 我们的理解:一个 AZ 故障即全集群停写,时长 ≈ 故障时长 + 约 70 s。FSx 的 HA 切换不会因为「客户子网不可达」而触发,所以 FSx 侧不会自救。
- 想请教:是否有(或计划)在失去 FSx 首选节点所在 AZ 时,让 WAL 主动切到备用节点 / 其他 WAL 的机制?推荐的多 AZ 容灾部署是什么?
7.4 Q29 —— 无故障下 CPU 背压限制 Produce,周期性停写
- 现象:多生产者、小请求负载下,broker CPU ≈ 0.9 触发背压,RequestRate 配额被下调,Produce 请求排队超过
request.timeout.ms。 - 复现条件:12 生产者 × 2k msg/s 写 24 分区(单 broker ≈ 5.3–5.7k req/s,m7g.xlarge);单分区混合负载(3 × 5k + 9 × 1k msg/s + 1 路事务)也触发。 单生产者 20k msg/s 4 h 不触发;12 生产者写单分区约 20k msg/s 不触发。
- 实测:12 生产者 3 / 3 复现,最差一路 max 5.4–8.6 s(干净集群一次 p99 4,787 / max 8,617 ms);配额最低压到 2,205–2,388。
单分区混合负载 45 min 内 17 段零确认(3–11 s),其中 13 段与背压日志 ±1 s 对齐。0 失败 / 0 丢,应用侧只看到延迟。
linger.ms=5无效。5.5.6 未观察到。 - 日志原文:
CPUChecker: CPU usage is high … average: 0.90–0.92 DefaultBackPressureManager: The system is in a HIGH state, checkers: {CPU=HIGH} QuotaRegulator: Decrease broker quota Fetch from 536,870,912 to 1.00 QuotaRegulator: Decrease broker quota RequestRate from 20,000 to 3,981 → … to 2,388 - 想请教:① 背压能否只限 Fetch / 后台任务、豁免 Produce?② 阈值与开关(公开文档未找到)?③ m7g.xlarge 在约 5.3k req/s/broker 时 CPU 0.9 是否符合预期?推荐的机型?
7.5 S3 不可用时写路径停写(5.5.7 与 5.5.6 行为不同)
- 现象:5.5.7 上 S3 不可用约 4 min 后 broker 0 停写、约 7 min 后全集群停写;S3 恢复后还要约 1 min 才恢复。broker 日志摘录中没有错误行。
- 复现条件:broker 实例角色
Deny s3:*。 - 实测:
| 时长 · 形态 | 停写 | 失败 | 报失败但已写入 | 丢 |
|---|---|---|---|---|
| 300 s · 多分区(第 1 次) | broker 0 分区 136 s;me-orders 两路各 11–20 s | 130,372 | 22,988 | 0 |
| 300 s · 多分区(第 2 次) | 全集群 125 s | 45,754 | 9,837 | 0 |
| 300 s · 单分区 | 三路各约 106–132 s | 3 | 0 | 0 |
| 900 s · 多分区 | broker 0 分区连续 737 s;me-orders 连续约 534 s | 234.7 万 | 95.4 万 | 0 |
对照:5.5.6 同条件 300 s 内写路径不受影响(0 失败,max 1.8 s)。停写 ≈ S3 中断时长 − 220 s,S3 中断越久停写越久。
- 我们的理解(推测):5.5.7 的 WAL 上限 / 回收策略有改动,WAL 在 S3 不可用期间只增不减、触顶后停写。未验证。
- 想请教:5.5.7 在这里改了什么?WAL 容量或 cache 写满时的预期行为(背压 / 拒写 / 报错)?能否恢复 5.5.6 的行为或给出可调上限?
7.6 Q7 —— broker ↔ FSx 灰色故障无自动隔离
- 现象:broker 到 FSx 的 NFS 不通、但心跳正常时,broker 不报错、不 fence、不 failover,WAL IO 一直挂着,故障解除后才报 IO 错误并自行恢复。
同一生产者的缓冲被卡住的分区占满(
BufferExhaustedException),健康分区的写入也被拖停。 - 实测:切断 broker 0 → FSx 的 NFS 120 s:5.5.7 停写 149 s,失败 227,892;5.5.6 挂住的 IO 在
elapse=135737ms后才返回。停写 ≈ 故障时长 + 约 30 s。 - 日志原文:
Failed to execute IO operation, elapse=135737ms→WAL is fenced, reason: WRITE_FAILED,err=… Input/output error - 我们的理解:挂载参数为
nfs4 … hard, sync, timeo=30, retrans=3,FSx 不可达时 I/O 无限期阻塞。 - 想请教:是否有 WAL IO 超时自杀(watchdog)开关?推荐的运维处置(例如主动重启该 broker)是否更快?
7.7 kill -9 后的恢复时长(Q1 / Q2 / Q3 / Q23)
- 实测:5.5.7 kill -9 单 broker 16 次全部自愈:最长零确认 15–27 s,最大确认 18.4–34.2 s(其中 2 次 > 30 s);+3,000 分区 27.4 s。
- 从进程死亡到发起 failover 约 18 s,而
broker.session.timeout.ms只有 9 s;把 session 调到 4.5 s(heartbeat 1 s)没有可测收益(kill -9 21.5 s vs 22.9 s;隔离 26.6 s vs 23.5 s)。[AZ_FAILOVER] Detected AZ-level failure in 'ap-northeast-1c'. All 1 nodes require failover. [ADD_NEW_FAILOVER] nodeId=0, target=2 - 5.5.6 曾出现自动拉起与 failover 的竞态:
Node epoch expired, fenced or not exist: CommitStreamSetObjectRequestData(nodeId=1 …)→[FAILOVER] fail, retry later; failover 期间 NFS WAL IO 卡 60 s(elapse=60097ms)。5.5.7 默认客户端 kill -9 az2 为 23.5 s,该量级未复现。 - 想请教:① 18 s 中检测之外的约 9 s 花在哪里,能否缩短(推测在等 WAL 租约 / NFS 锁过期,日志中有
Forced lock deletion)? ② 检测时长在商业版中是否可调、推荐值?③ 竞态是否已在 5.5.7 处理?④ 单 broker 进程崩溃时日志写AZ-level failure(该 AZ 只有 1 个节点)是否只是措辞(Q10)?
7.8 客户端规避之间的冲突(in-flight 1 与 zone router)
- in-flight:调优配置(in-flight 5 + 256 KiB 批 + zstd)才能达到单分区 200k;而 Q28 的规避需要关幂等 + in-flight 1。 我们测了 in-flight 1 的代价:1k–200k 吞吐全部达标,但 p99 由 7.7–9.1 ms 升到 11.95–13.75 ms(约 +50 %),100k 一档有 1 秒 > 100 ms。 另外 in-flight 3 时 50k 只确认 38,252/s ⇒ 单分区上限 ≈ in-flight × 批大小 ÷ RTT。
- zone router(Q6 / Q19):开启客户端 zone router(
client.id带automq_az=)时,转发链上的节点卡住,请求要等满request.timeout.ms(30 s), leader 健康的分区也一起停;关闭后同 AZ 健康分区停写 59.8 s → 0.17 s,稳态跨 AZ 写快 0.8–5.1 ms。但服务端router_channel写入模式仍在(DEFAULT),客户端关不掉。 - 想请教:① 撮合类场景是否建议关闭 zone router?②
router_channel写入模式能否关闭,是否有direct模式、代价是什么?③ FSx WAL 的组提交间隔 / 批大小是多少、可否调(Q12)?
7.9 运维与配置
| # | 现象(实测) | 想请教 |
|---|---|---|
| Q8 | 自动均衡每 600 s 一轮迁移 leader(每次 0.97–1.87 s 不可写),并会改掉 --replica-assignment 的手工放置;经 instance_configs 设 autobalancer.controller.exclude.topics 后,40 min 浸泡 p99.99 731.5 → 42.95 ms |
频率是否预期(文档称约 1 分钟)?该键是否为受支持的排除方式(不在文档可配键列表中)?能否只关 leader 迁移? |
| Q22 | s3.wal.upload.threshold 经 instance_configs 设 67108864,读回 536870912(STATIC_BROKER_CONFIG);同批另外 3 个键生效,且不报错 |
是否被控制台模板覆盖?哪些键会被覆盖? |
| Q25 | instance_configs 不能删除已设键(At present, we don't support the removal of instance settings from the 'configs' block …),只能写回默认值 |
是否计划支持「恢复默认」?写回的值以 STATIC 固化,升级时是否跟随新默认值? |
| X7 | 经控制台换 FSx 吞吐档 = 新建 FSx + 两轮全集群滚动,约 53 min,每路 26–35 秒 > 100 ms、最大 2.7–3.1 s,期间两套 FSx 同时计费 | 是否有更平滑的换档方式? |
| X6 | 同一 FSx 上有邻居负载:3,072 IOPS 下全集群零确认 9 s,6,144 IOPS 下 0 s | 推荐的 IOPS 余量与 FSx 独占建议? |
| Q24 | 重负载尖刺(170–345 ms)的根因我们已定位为 broker 网卡带宽配额超限(bw_in_allowance_exceeded 持续增长) |
按网卡基线带宽选机型的建议?每 MiB/s 客户端写入对应的 broker 入 / 出网络倍数? |
| Q26 | 推荐配置 2 h 浸泡中孤立的 230–242 ms 尖刺,无周期性;5.5.7 尾部比 5.5.6 略差(p99.99 33.75 → 55.85 ms) | 来自哪个后台任务? |
| Q27 | 30 GB 历史回读期间,热写路径 max 32.7 → 257 ms | 读写是否共用 broker 入向带宽?推荐的读隔离做法? |
| Q5 | 恢复期间刷屏 Error while decoding link record(一次 18,077 条) |
含义?是否影响恢复时长? |
7.10 部署与文档
| # | 现象 | 建议 / 想请教 |
|---|---|---|
| Q14 | EC2 部署下 broker 子网同样需要出网(或 SSM 接口端点),文档只对 EKS 写明;无出网时 InitNodeTaskStep 一直重试 | 文档补充 |
| Q15 | FSx 浮动 IP 路由只写入「FSx 创建时 broker 子网所用的路由表」;之后更换路由表,WAL 静默绕行 NAT、不报错(我们因此作废了一段数据) | 控制台能否创建后校验,或自动 AddRouteTableIds? |
| Q16 | 「EC2 模式最小权限集」缺 s3:PutBucketPolicy、s3:GetBucketTagging、iam:GetPolicyVersion / ListPolicyVersions;建实例时还缺 s3:CreateBucket、route53:CreateHostedZone、iam:CreateRole;iam:PassRole 的 Resource 为 * |
更新最小权限集,并收紧 PassRole |
| Q17 | Terraform provider 0.4.10:① 环境变量名 AUTOMQ_BYOC_ACCESS_KEY 与 schema 属性名不一致;② FSWAL 校验把未解析的变量当成缺失;③ networks set 在子网未建时报 Duplicate List Value;④ 后端要求 SG 逐端口放行 9090 / 22 / 9102 / 9103;另 timeouts 不接受 update |
修复计划? |
| Q11 | 文档写「单分区写 4 MBps,不支持自定义」;实测 1–8 MB/s 各档 0 错误、无节流 | 限额是否已取消,或仅某些计费模式生效? |
8. 5.5.7 已不再复现的问题
如实单列。我们没有拿到修复说明,以下只是「在我们的样本中不再出现」,统计上尚未到确证,希望贵方给出修复说明以便关闭:
| 问题 | 5.5.6 | 5.5.7 |
|---|---|---|
Q20 kill -9 后自恢复启动失败(IllegalReferenceCountException: refCnt: 0, decrement: 1 at … S3Storage.startup) |
15 次 kill -9 中 3 次 | 23 次 kill -9 中日志特征 0 次 |
Q21 kill -9 后 router channel 卡死(The state(3) isn't in state(STARTED)),32–44 min 部分分区不可写、需人工重启 |
15 次中 3 次 | 同上 23 次中 0 次 |
| Q3 kill -9 az2 全集群 75–106 s | 1 次 | 默认客户端 23.5 s |
9. 问题清单汇总
「影响」只写实测事实;「我们的请求」是希望贵方回复的内容。
| 编号 | 问题 | 影响(实测) | 我们的请求 |
|---|---|---|---|
| X3 / X1 | 双 FSx 不切换;失去一套 ≈ 5 min 后不自愈 | 全集群停写 62–85 s;D2 / D3 需受控重启(2 / 2) | 设计目标说明;WAL 避开不可达 FSx;首选节点分 AZ;修复计划 |
| Q30 | 双 FSx 缩回单 FSx 后 broker 崩溃循环、控制台挂起 | 一台 broker 永久下线,只能重建实例 | 是否受支持;正确步骤;修复计划 |
| Q28 | FSx 首选 AZ 分区后长连接幂等生产者永久卡死 | 5.5.7 多分区 2 / 4、单分区 1 / 2 永久卡死 | 触发条件、修复版本、不降吞吐的规避 |
| — | FSx 首选 AZ 故障 = 全集群停写 | FIS:三个 AZ 停写 369–376 s | 多 AZ 容灾的推荐部署 / 规划 |
| Q29 | CPU 背压限 Produce | 无故障停写 5–8.6 s,3 / 3 | Produce 豁免、阈值 / 开关、机型建议 |
| Q18 | S3 不可用即停写 | 300 s ⇒ 106–136 s,3 / 3 | 5.5.7 改动说明;恢复 5.5.6 行为或可调上限 |
| Q7 | broker ↔ FSx 灰色故障不隔离 | 停写 = 故障时长 + 约 30 s | WAL IO watchdog / 运维建议 |
| Q1 / Q2 / Q23 / Q3 / Q10 | kill -9 恢复 15–27 s,调 session 无收益 | 最大确认最高 34.2 s | 时长构成、可调项 |
| Q6 / Q19 / Q12 | zone router 放大故障;router_channel 关不掉;WAL 组提交参数 | 健康分区停 ≈ 60 s(开 zone router 时) | 场景建议;服务端关闭方式 |
| Q8 / Q22 / Q25 / X7 / X6 / Q24 / Q26 / Q27 / Q5 | 运维与配置(§7.9) | 见 §7.9 | 见 §7.9 |
| Q14 / Q15 / Q16 / Q17 / Q11 | 部署与文档(§7.10) | 见 §7.10 | 文档 / 工具修复 |
| Q20 / Q21 | 5.5.7 不再复现 | — | 修复说明 |
10. 建议的交流方式与我们能提供的材料
建议议程(约 90 min):
- 我们介绍场景、方法与覆盖(15 min,§2–§5)
- 双 FSx 专章(25 min,§7.1)
- Q28 与 FSx 首选 AZ 故障域(20 min,§7.2–§7.3)
- Q29、S3 不可用、灰色故障(15 min,§7.4–§7.6)
- 其余问题按清单逐条确认(10 min,§9)
- 后续:贵方给出修复 / 规避,我们在新版本上按同一方法复测(5 min)
我们能提供的材料(按需,经内部审批后提供):
- 压测工具 Bench 与故障注入 harness 的源码,以及从零搭建环境的步骤(Terraform + 脚本);
- 每个问题对应的运行清单、每秒时间线与审计结果;
- 相关时段的 broker / controller / state-change 日志与控制台任务日志摘录(含 Q28、Q30、D2 / D3 的原始日志);
- 新版本发布后,我们可以按本文同一套方法复测并回传结果。
附录 A:客户端变体与术语
| 名称 | 含义 |
|---|---|
| 默认客户端 | acks=all、enable.idempotence=true、request.timeout.ms=30000、delivery.timeout.ms=120000、client.id=automq_az=<AZ ID>&…(开 zone router) |
| nr | client.id 不带 automq_az=(关闭客户端 zone router) |
| rt5 | request.timeout.ms=5000、delivery.timeout.ms=30000、socket.connection.setup.timeout.ms=2000、metadata.max.age.ms=60000 |
| rt5d | 同 rt5,但 delivery.timeout.ms=120000(我们的推荐客户端 = nr + rt5d) |
| ni | 关幂等 + in-flight 1(Q28 的客户端规避) |
| 调优配置 | batch.size 256 KiB · zstd(level 1) · in-flight 5 |
| 单分区 / 多分区 | me-sp-az1(1 分区,leader 在 az1)/ me-orders(24 分区) |
| D0–D11 | 双 FSx 阶段的测试编号(§7.1) |
| 停写 / 最大确认 | 最长连续零确认秒数 / 单条消息最长确认时间 |
附录 B:开源版的两个观察
我们也测了 AutoMQ 开源版 1.7.4(S3 WAL),这两点供参考:
- X8:写确认 p50 恒为约 355–373 ms,客户端调不动(调批 + zstd 后吞吐能跟上 20k / 50k / 100k,但 p50 不变)。我们理解这是 S3 WAL 组提交间隔决定的,属架构特征。
- X9(疑点,未验证):单客户端
acks=all60.1 MB/s,acks=1547.3 MB/s,相差约 9 倍;RF=1 时两者理论上应等价。按请求耗时推算,acks=1的应答早于一次 S3 WAL 写入完成。 想确认:开源版acks=1是否在 WAL 持久化之前就应答?