Redis 主从在线切换记录
背景
Redis master 所在实例主机需要下线维护. 如何切换主从对线上影响最小. 当前架构如下图
技术方案
方案1
引入 redis sentinel.
步骤:
- 部署redis sentinel
- 修改业务配置, 修改业务代码.
- kill master.
- check
- 建立新主从逻辑
优点:
- 切换简单, kill 主库即可, sentinel 可自动提升 slave -> master.
缺点:
- 需要部署 redis sentinel, 新的中间件.
- 需要改动业务代码.
方案2
直接切换
步骤:
- 使从库可写,
redis-cli -h redis-slave -p 6379 CONFIG set slave-read-only no
- 修改业务侧配置, redis 地址指向可写的 slave 实例, 重启业务应用
- 确保主从同步完成, 停止主从同步.
redis-cli -h redis-slave -p 6379 slaveof no one
- 建立新主从逻辑.
优点:
- 符合直觉
- 没有代码改动
缺点:
- 如果切换过程中有问题, 需要及时回滚配置和业务项目发布. 耗时较长, 会导致数据丢失.
方案3
引入4层代理, haproxy
步骤:
- 部署 haproxy, 作为现 master 的代理.
- 修改业务侧配置, redis 地址指向 haproxy 代理地址, 重启业务应用.
- 使从库可写
- 修改 haproxy 配置, 指向可写的从库, 并 reload 配置.
- 确保主从同步完成, 停止主从同步.
- 建立新主从逻辑.
优点
- 引入中间层haproxy, 因为 haproxy 支持动态reload配置, 并保证优雅关闭之前的连接, 业务侧可无感知 redis 主从切换.
- 主从切换时间短
缺点
- 引入了新的中间件
确定方案
稳妥起见, 使用方案3.
实施
- 引入 haproxy 后架构
- 执行主从切换
export redis-slave=REDIS_SLAVE_IP
export redis-master=REDIS_MASTER_IP
# 从库可写
redis-cli -h redis-slave -p 6379 CONFIG set slave-read-only no
# 修改 haproxy 配置
sed -i 's/redis-master/redis-slave/g' haproxy.cfg
# reload haproxy
haproxy -f haproxy.cfg -p /tmp/haproxy.pid -sf `cat /tmp/haproxy.pid`
# 确定主从同步结束
redis-cli -h redis-slave -p 6379 info | grep master_sync_in_progress
# 值需为0
# 停止主从同步
redis-cli -h redis-slave -p 6379 slaveof no one
# 建立新主从
redis-cli -h redis-master -p 6379 slaveof redis-slave 6379
# 确定新主从同步结束
redis-cli -h redis-master -p 6379 info | grep master_sync_in_progress
# 值需为0
# 结束
复制代码
- 切换后架构
小结
简单记录了 Redis 主从切换的取舍和操作.