Files
open-im-server-deploy/docs/troubleshooting.md
kim.dev.6789 e50142a3b9 复制项目
2026-01-14 22:16:44 +08:00

93 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OpenIM ACK 排障流程(标准化指南)
> **目标**:在 ACK/Kubernetes 环境下定位“消息不同步/推送缓慢”时,有一套可复用的排障步骤,避免因为主观猜测去改底层逻辑。
---
## 1. 明确现象与影响范围
- **收集信息**受影响的用户、群组、时间段、终端类型iOS/Android/H5
- **区分场景**:登录拉取历史 vs. 实时推送,是否所有人都不行、还是个别用户/群。
- **保存日志与报错**:客户端/服务端的时间点,便于与服务端日志对应。
> 不要在未复现/未收集信息的情况下就进行代码改动。
---
## 2. 逐层排查流程
### 2.1 API 层openim-api
1. 查看 `kubectl logs deploy/openim-api`,确认登录/发消息请求是否返回 200。
2. 如出现 `token invalid``rpc timeout` 等明确错误,先排除配置、网络等问题。
### 2.2 RPC 层openim-rpc-xxx
1. 针对消息问题,重点查看 `openim-rpc-msg``openim-rpc-group` 等服务日志。
2. 出现 `MsgToMongoMQ error``redis set failed` 等,说明生产端异常,需要先修复 RPC/存储配置。
### 2.3 Kafka & 消费端
1. 使用 `kubectl logs deploy/openim-msgtransfer``deploy/push-rpc-server`,查看是否有:
- `xxxConsumer err, will retry in 5 seconds`(真正的连不上 Kafka
- `Subscribe returned normally...`**正常现象**,新版 SDK 每条消息都会返回一次)。
2. 如怀疑 Kafka 累计延迟,可登录 Kafka 集群或使用 `kafka-consumer-groups.sh --describe` 查看 Lag。
### 2.4 持久化Mongo / Redis
1. 抽取异常消息的 conversationId & seq直接在 Mongo/Redis 中查询是否存在。
2. 若 Redis 缺失最新 seq说明 msgtransfer 未写入;继续回头查消费日志。
### 2.5 推送服务push与网关msggateway
1. `kubectl logs deploy/push-rpc-server`:关注推送 RPC 的失败/超时日志;
2. `kubectl logs deploy/messagegateway-rpc-server`:观察是否大量 `write: broken pipe`(通常是客户端断线,非服务异常);
3. 确认 `openim-push` 是否因为配置(厂商证书、推送速率限制)导致卡住。
### 2.6 客户端侧验证
- 使用不同终端iOS/Android/H5交叉验证
- 检查客户端本地缓存/seq 是否有延迟;必要时抓包或查看客户端日志。
---
## 3. 变更前的对照与验证
- **先查证**:如果怀疑配置/逻辑问题,先在官方仓库(`upstream/main`)对比差异,确认是否确实存在 bug。
- **最小化修改**:优先通过配置/运维手段解决(如重启 Pod、更新镜像、修复 Kafka 集群);代码层改动需:
1. 写清楚“问题现象 → 复现步骤 → 根因分析 → 预期影响”;
2. 在测试环境复盘,多人同行评审;
3. 修改后 `mage build` + `kubectl rollout` 验证,确保上下游联调通过。
- **禁止“先改再说”**:避免仅凭几行日志或猜测就改动核心组件(如 discovery、在线推送、MQ 消费),否则容易引入新的系统风险。
---
## 4. 常见误区与经验
- **“Subscribe returned normally” ≠ 错误**:新版本 `NewMConsumerGroupV2` 每处理一条消息就会返回,外层循环需要继续 `Subscribe`
- **ACK Pod 重建是常态**:官方推荐使用 Service DNS/Headless Service + readiness/liveness不要擅自关闭连接。
- **推送失败不等于刷新连接**:先确认网关/客户端状态,只有在明确连接池崩溃时才考虑 `ForceRefresh`
- **go mod tidy 的影响**:在本地执行 `go mod tidy` 可能引入上游依赖CI/build 失败时先恢复 `go.mod/go.sum`
---
## 5. 工具清单
- `kubectl logs/get/describe`:查看 Pod/Deployment 状态;
- `kubectl top pods -n <ns>`:实时查看 Pod CPU / MEM
- `kubectl top nodes`:评估集群整体资源是否紧张;
- `kubectl top node <name>`:关注某台节点是否 CPU / MEM / LOAD 异常;
- `kubectl rollout status deployment/<name>`:确认升级完成;
- `mage build`:本地编译检查;
- Kafka CLI 或监控平台:定位消费滞后;
- Prometheus/Grafana查看服务 CPU、内存、QPS、错误率、延迟等指标
- 日志聚合ELK / Loki 等):快速检索关键字;
- SSH 到节点(需要权限):
- `top` / `htop`:查看 CPU、内存占用
- `free -h`:系统整体内存状况;
- `df -h`:磁盘容量,防止磁盘打满影响容器;
- `du -sh /var/lib/docker`, `/var/log` 等目录,确认是否存在异常增长。
---
## 6. 复盘与持续改进
1. 每次重大故障后,输出“故障记录 + 根因 + 修复方案 + 预防措施”。
2. 同步更新此文档或内部 Wiki确保新同学也能快速掌握流程。
3. 定期与官方版本对齐,避免长期“漂移”导致的隐藏问题。
---
> 若有新的场景/问题,请在这里补充,保持流程可演进。