Redis 主从在线切换

精神小伙 在线背锅redis

Redis 主从在线切换记录bash

背景

Redis master 所在实例主机须要下线维护. 如何切换主从对线上影响最小. 当前架构以下图 架构

切换前

技术方案

方案1

引入 redis sentinel.ui

步骤:

  1. 部署redis sentinel
  2. 修改业务配置, 修改业务代码.
  3. kill master.
  4. check
  5. 创建新主从逻辑

优势:

  1. 切换简单, kill 主库便可, sentinel 可自动提高 slave -> master.

缺点:

  1. 须要部署 redis sentinel, 新的中间件.
  2. 须要改动业务代码.

方案2

直接切换spa

步骤:

  1. 使从库可写, redis-cli -h redis-slave -p 6379 CONFIG set slave-read-only no
  2. 修改业务侧配置, redis 地址指向可写的 slave 实例, 重启业务应用
  3. 确保主从同步完成, 中止主从同步. redis-cli -h redis-slave -p 6379 slaveof no one
  4. 创建新主从逻辑.

优势:

  1. 符合直觉
  2. 没有代码改动

缺点:

  1. 若是切换过程当中有问题, 须要及时回滚配置和业务项目发布. 耗时较长, 会致使数据丢失.

方案3

引入4层代理, haproxy3d

步骤:

  1. 部署 haproxy, 做为现 master 的代理.
  2. 修改业务侧配置, redis 地址指向 haproxy 代理地址, 重启业务应用.
  3. 使从库可写
  4. 修改 haproxy 配置, 指向可写的从库, 并 reload 配置.
  5. 确保主从同步完成, 中止主从同步.
  6. 创建新主从逻辑.

优势

  1. 引入中间层haproxy, 由于 haproxy 支持动态reload配置, 并保证优雅关闭以前的链接, 业务侧可无感知 redis 主从切换.
  2. 主从切换时间短

缺点

  1. 引入了新的中间件

肯定方案

稳妥起见, 使用方案3.代理

实施

  1. 引入 haproxy 后架构 code

    haproxy

  2. 执行主从切换cdn

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

# 结束
复制代码
  1. 切换后架构
    end

小结

简单记录了 Redis 主从切换的取舍和操做.中间件

相关文章
相关标签/搜索