GitLab项目Redis故障排查指南
前言
Redis作为GitLab的核心组件之一,负责缓存、会话存储和后台任务队列等重要功能。当Redis出现问题时,整个GitLab系统都可能受到影响。本文将深入讲解GitLab环境中Redis常见问题的排查方法,帮助管理员快速定位和解决问题。
基础环境检查
在开始深入排查前,首先需要确认基础网络环境是否正常:
-
Redis服务器:
- 确保6379端口TCP连接正常
- 各Redis节点间能通过6379端口互相通信
-
Sentinel服务器:
- 确保26379端口TCP连接正常
- Sentinel节点间能通过26379端口互相通信
- Sentinel能连接到Redis的6379端口
Redis基础功能检查
活动状态监控
使用以下命令实时监控Redis活动状态:
gitlab-redis-cli --stat
在GitLab界面浏览几个页面后,观察以下指标是否增长:
keys
:键数量clients
:客户端连接数requests
:请求数connections
:连接数
如果这些数值随着页面浏览而增加,说明Redis基础功能正常。
Redis复制问题排查
主从复制状态检查
使用info replication
命令检查复制状态:
/opt/gitlab/embedded/bin/redis-cli -h <redis-host-or-ip> -a '<redis-password>' info replication
主节点(Master)输出示例
# Replication
role:master
connected_replicas:1 # 已连接的从节点数量
replica0:ip=10.133.5.21,port=6379,state=online,offset=208037514,lag=1 # 从节点详情
从节点(Replica)输出示例
# Replication
role:replica
master_host:10.133.1.58 # 主节点地址
master_port:6379 # 主节点端口
master_link_status:up # 连接状态(up/down)
关键指标说明:
master_link_status
:主从连接状态,应为"up"lag
:复制延迟,数值越小越好offset
:复制偏移量,主从应接近
Redis高CPU使用率问题
问题原因
GitLab默认使用600多个Sidekiq队列,每个队列都是Redis中的一个列表。每个Sidekiq线程都会发出包含所有队列的BRPOP
命令,导致Redis CPU使用率随队列数量和BRPOP
调用频率增加而上升。
解决方案
-
减少Sidekiq队列数量:
- 使用路由规则合并相关队列
-
调整超时参数:
- GitLab 16.6及之前版本:增加
SIDEKIQ_SEMI_RELIABLE_FETCH_TIMEOUT
环境变量值 - GitLab 16.7及之后版本:默认值5已优化
- GitLab 16.6及之前版本:增加
注意:增加超时时间会减少连接开销,但会延长Sidekiq关闭延迟。
Sentinel哨兵问题排查
常见错误
当出现Redis::CannotConnectError: No sentinels available
错误时,可能原因包括:
- 配置文件中
redis['master_name']
和redis['master_password']
与sentinel节点定义不一致 - Redis连接器配置问题
验证步骤
- 进入Rails控制台:
sudo gitlab-rails console
- 执行Redis连接测试:
redis = Gitlab::Redis::SharedState.redis
redis.info
- 在主Redis上触发故障转移测试:
redis-cli -h localhost -p 6379 DEBUG sleep 20
警告:此操作会使实例下线约20秒,测试环境谨慎操作。
- 返回Rails控制台再次检查:
redis.info
成功时,应能看到连接端口已变更。
非捆绑式Redis问题
对于自行编译安装的Redis,特别注意:
resque.yml
和sentinel.conf
必须配置正确sentinel.conf
中定义的master-group-name
必须与GitLab配置中的主机名一致
配置示例
sentinel.conf:
sentinel monitor gitlab-redis 10.0.0.1 6379 2
resque.yaml:
production:
url: redis://:myredispassword@gitlab-redis/
sentinels:
- host: 10.0.0.1
port: 26379 # 注意指向sentinel端口
总结
Redis在GitLab中扮演着关键角色,其稳定性直接影响整个系统的性能。通过本文介绍的方法,管理员可以系统地排查Redis相关问题,确保GitLab服务的高可用性。定期检查Redis状态、监控关键指标,并在变更后进行验证测试,是维护Redis健康运行的最佳实践。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考