WuKongIM Docs

故障排查

按六类现象选择检查路径,核对证据与结果,完整命令和进阶工具按需展开。

编辑此页报告文档问题

先记录时间、影响与最近变更,再选择故障现象。

状态不清楚,先暂停变更

节点、Controller、Slot、Channel 或任务状态缺失、过期、矛盾时,暂停发布和拓扑变更。保存证据,避免批量重启、迁移 Leader 或删除数据。

故障发生后的前十分钟

完整收集顺序与只读命令
  1. 暂停其他变化:暂停发布、扩缩容、恢复和同时进行的集群操作,记录当前正在运行的任务。
  2. 记录影响:记下开始时间、受影响的用户、频道、节点和入口(TCP、WebSocket 或 HTTP)。
  3. 检查存活与就绪:保存 /healthz 和 /readyz 的状态码与完整响应;/readyz 的失败原因最重要。
  4. 打开 Manager:查看节点、Controller、Slot、Channel 和任务,标出异常或长时间不更新的状态。
  5. 对齐时间:只比较同一时间段的指标、错误日志和最近发布或配置变更。
curl -sS -i http://127.0.0.1:5001/healthz
curl -sS -i http://127.0.0.1:5001/readyz
wkcli top --server http://127.0.0.1:5001 --once --json

把地址换成实际 API 地址。0.0.0.0 是监听配置,不是客户端可以访问的服务器地址。

指标名称、可复制的 PromQL 和结果解释见健康检查与监控。先检查采集是否正常,再比较同一节点、同一时间段的数据。

根据现象继续检查

/healthz 成功,但 /readyz 返回 503

保存 /readyz 完整响应与 reason,在 Manager 检查维护、Controller、Slot 和运行中任务,再比较其他节点。

核对: 找到就绪失败的具体原因;恢复、扩缩容或升级的停止条件未解除前,不接回流量。

就绪失败:完整核对清单
  1. 保存 /readyz 的完整响应和 reason。
  2. 在 Manager 检查维护状态、Controller、Slot 和正在运行的恢复或控制任务。
  3. 比较其他节点的时间、版本、配置和就绪状态。

不要把流量接回这个节点,也不要绕过恢复、扩缩容或升级流程里的安全检查。

客户端连不上,或者反复重连

确认客户端实际使用的协议与发布地址,再检查 DNS、负载均衡、TLS、防火墙和同一时间段网关日志。

核对: 缩小到具体入口、节点或连接步骤,保留失败证据;不要在证据不足时批量断开或重启。

连接故障:完整核对清单
  1. 确认用户使用的是 TCP、WebSocket 还是 HTTP 入口,不要把 Manager 地址当作客户端地址。
  2. 检查发布地址、DNS、负载均衡、TLS 和防火墙。
  3. 按节点比较连接数、连接错误、文件句柄、内存和网络,并查看同一用户、同一时间段的网关日志。

不要在证据不足时批量断开连接或同时重启所有节点。

消息发送失败、变慢或出现积压

先看发送错误与高分位延迟,再按节点比较队列,已知频道 ID 时做精确查询。

核对: 定位具体节点或频道热点;消息提交、对端接收与历史恢复分别检查,平均值不能代替高分位。

消息故障:完整核对清单
  1. 先看发送错误率和高分位延迟,再看 Channel、投递和推送队列是否持续增长。
  2. 比较每个节点,确认是否只有一台机器或一个大群形成热点。
  3. 已知频道 ID 时做精确查询,不要为了找问题枚举所有频道。
  4. 指标和日志已经指向 CPU、内存或 Goroutine 时,才在短时间内使用 pprof。

完整消息路径见消息发送链路。大群和高消息率下,平均值可能看起来正常,最大值和高分位却已经异常。

Controller、Slot 或节点状态异常

保存状态更新时间、控制版本、blocked_reasons、任务和 Slot 证据;缺失、过期或矛盾时暂停变更。

核对: 诊断建议不是写操作授权;移除节点仍必须等待 safe_to_remove=true。

集群异常:只读诊断命令
wkcli node ls --context production
wkcli node diagnose 4 --context production --json

保存命令输出里的状态更新时间、控制版本、blocked_reasons、任务和 Slot 证据。诊断建议不是执行写操作的授权;移除节点仍必须等待 safe_to_remove=true。处理步骤见扩容与缩容。

磁盘不足或数据看起来不一致

记录磁盘空间、IO、错误、节点 ID 与数据路径,不通过删除数据文件或未知日志腾空间。

核对: wkcli db 只读查看已停止节点、快照或复制目录;import 写入必须指向明确离线目标,不能替代备份恢复。

磁盘与数据:离线检查边界

先记录磁盘空间、IO 延迟、错误、节点 ID、数据路径和配置。不要通过删除数据文件或未知日志来腾空间。

wkcli db 只能查看已停止节点、文件系统快照或复制出的数据目录。先使用只读的 query、diff 或 export。import 会写入数据,只能指向明确离线的目标,也不能替代 Manager 的备份恢复。

备份、恢复或升级失败

保存 Manager 任务与审计、归档清单、物理 Slot 验证结果,以及版本与摘要,回到对应任务的停止条件。

核对: 恢复期间 /healthz 成功不代表能接流量;版本混合运行必须有发布说明依据。

维护任务失败:归档与停止条件

保存 Manager 任务与审计、归档清单、256 个物理 Slot 的验证结果、程序版本与摘要。不要因为恢复时 /healthz 成功就接回流量,也不要假设升级失败后任意版本都能混合运行。回到备份与恢复或升级与迁移的停止条件处理。

工具应该按什么顺序使用

先用 /readyz、Manager、同一时段指标与日志,再定位一个节点或精确 Slot、Channel、任务。pprof 限时限目标,结束后关闭 Debug;wkcli bench 只在隔离测试集群使用。

完整工具顺序与使用边界
  1. 先看 /readyz 和 Manager,它们成本最低。
  2. 再看同一时间段的 Prometheus 指标和错误日志。
  3. 用 Top 或 wkcli top 查看一个节点的当前资源和短期历史。
  4. 只有问题已经缩小到精确节点、Slot、Channel 或任务时,才使用诊断能力。
  5. pprof 必须限时、限目标,完成后关闭 Debug 能力。
  6. wkcli bench 会产生真实流量和数据,只能在隔离的测试集群复现问题,不能对生产环境做无界压测。

前一步已经能解释问题时,就不要继续使用成本更高的工具。

请求他人协助时提供什么

提供时间、影响、版本与脱敏配置、完整就绪响应、同一时段指标与少量日志。分享前去除密码、完整 Token 和用户消息正文。

协助排查:完整证据清单
  • 故障开始时间、影响范围和最近的变更;
  • 节点清单、版本、集群身份和脱敏后的相关配置;
  • /healthz、/readyz 完整响应和 Manager 状态;
  • 同一时间段的指标截图或导出,以及少量相关日志;
  • 相关节点、Slot、频道、任务或追踪 ID;
  • 已做过的检查、检查结果和故意没有执行的高风险操作。

不要发送密码、完整 Token、用户消息正文或未经检查的完整配置文件。

只有业务恢复、队列受控、节点重新通过 /readyz、监控恢复,并且临时 Debug、采样和测试流量都已关闭后,排障才算结束。

结束条件: 业务恢复、队列受控、各节点通过 /readyz、监控恢复,并关闭临时 Debug、采样和测试流量。

本页内容