故障排查手册
本文档提供井云服务中心后端项目的常见问题排查指南,帮助开发者和运维人员快速定位和解决问题。
🔍 问题诊断流程
1. 检查服务状态
# 检查所有服务状态
docker-compose -f deployments/docker-compose.local.yml ps
# 检查 Kubernetes Pod 状态
kubectl get pods -n jingyun
# 检查服务详情
kubectl describe pod <pod-name> -n jingyun
2. 查看服务日志
# Docker Compose 日志
docker-compose -f deployments/docker-compose.local.yml logs -f [service-name]
# Kubernetes 日志
kubectl logs -f deployment/<service-name> -n jingyun
# 查看最近的日志
kubectl logs --tail=100 deployment/<service-name> -n jingyun
3. 检查网络连通性
# 检查端口是否开放
telnet localhost 8000
curl -I http://localhost:8000/health
# 检查服务发现
curl http://localhost:8500/v1/agent/services
🚨 常见问题
服务启动问题
Q: 服务启动失败,提示端口被占用
解决方案:
# 查看端口占用
lsof -i :8000
netstat -tulpn | grep :8000
# 杀死占用进程
kill -9 <PID>
# 或者修改端口配置
vim conf/config.yaml
Q: 服务启动失败,提示无法连接数据库
解决方案:
# 1. 检查数据库服务状态
docker-compose -f deployments/docker-compose.local.yml ps postgres-jingyun
# 2. 检查数据库连接
docker exec -it postgres-jingyun psql -U akita -d akita -c "\l"
# 3. 检查网络连通性
docker exec -it gateway ping postgres-jingyun
# 4. 验证数据库配置
grep -r "database" conf/
Q: 服务启动失败,提示无法连接 Redis
解决方案:
# 1. 检查 Redis 服务状态
docker-compose -f deployments/docker-compose.local.yml ps redis-jingyun
# 2. 测试 Redis 连接
docker exec -it redis-jingyun redis-cli ping
# 3. 检查 Redis 配置
docker exec -it redis-jingyun redis-cli config get "*"
# 4. 清理 Redis 数据(如需要)
docker exec -it redis-jingyun redis-cli FLUSHALL
Q: 服务启动失败,提示无法连接 Consul
解决方案:
# 1. 检查 Consul 服务状态
docker-compose -f deployments/docker-compose.local.yml ps consul
# 2. 检查 Consul UI
open http://localhost:8500
# 3. 检查服务注册
curl http://localhost:8500/v1/agent/services
# 4. 检查 Consul 配置
curl http://localhost:8500/v1/kv/kratos/?keys
API 调用问题
Q: API 返回 401 Unauthorized
解决方案:
# 1. 检查 Token 是否有效
echo "your-token" | cut -d. -f2 | base64 -d
# 2. 生成新的 Token
curl -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"password"}'
# 3. 检查 Token 过期时间
echo "your-token" | cut -d. -f2 | base64 -d | jq '.exp'
Q: API 返回 500 Internal Server Error
解决方案:
# 1. 查看详细错误日志
docker-compose -f deployments/docker-compose.local.yml logs -f gateway
# 2. 检查数据库连接
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT 1"
# 3. 检查 Redis 连接
docker exec -it redis-jingyun redis-cli ping
# 4. 检查依赖服务状态
curl http://localhost:8500/v1/agent/services
Q: API 响应超时
解决方案:
# 1. 检查服务资源使用
docker stats
# 2. 检查网络延迟
ping localhost
curl -w "@curl-format.txt" -o /dev/null -s http://localhost:8000/health
# 3. 调整超时配置
vim conf/config.yaml
# 增加 timeout 值
数据库问题
Q: 数据库连接数过多
解决方案:
# 1. 查看当前连接数
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT count(*) FROM pg_stat_activity;"
# 2. 查看连接详情
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT * FROM pg_stat_activity;"
# 3. 杀死空闲连接
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle';"
# 4. 调整连接池配置
# 在配置文件中调整 max_connections
Q: 数据库查询慢
解决方案:
# 1. 查看慢查询日志
docker exec -it postgres-jingyun grep "slow" /var/log/postgresql/postgresql-*.log
# 2. 分析查询计划
docker exec -it postgres-jingyun psql -U akita -d akita -c "EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;"
# 3. 检查索引使用情况
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT * FROM pg_stat_user_indexes;"
# 4. 创建缺失索引
docker exec -it postgres-jingyun psql -U akita -d akita -c "CREATE INDEX CONCURRENTLY idx_users_email ON users(email);"
Q: 数据库锁表
解决方案:
# 1. 查看锁信息
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT * FROM pg_locks;"
# 2. 查看锁等待关系
docker exec -it postgres-jingyun psql -U akita -d akita -c "
SELECT
blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement,
blocking_activity.query AS current_statement_in_blocking_process
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
"
# 3. 杀死阻塞进程(谨慎操作)
docker exec -it postgres-jingyun psql -U akita -d akita -c "SELECT pg_terminate_backend(<blocking_pid>);"
缓存问题
Q: Redis 连接超时
解决方案:
# 1. 检查 Redis 状态
docker exec -it redis-jingyun redis-cli info server
# 2. 检查内存使用
docker exec -it redis-jingyun redis-cli info memory
# 3. 清理过期键
docker exec -it redis-jingyun redis-cli --scan --pattern "*" | xargs docker exec -i redis-jingyun redis-cli del
# 4. 重启 Redis 服务
docker-compose -f deployments/docker-compose.local.yml restart redis-jingyun
Q: 缓存穿透
解决方案:
# 1. 检查缓存命中率
docker exec -it redis-jingyun redis-cli info stats | grep keyspace
# 2. 设置空值缓存
# 在代码中添加对空值的缓存
# 3. 使用布隆过滤器
# 引入布隆过滤器防止恶意查询