7.1 哨兵介绍 Redis 的主从模式下 ,主节点一旦发生故障不能提供服务,需要人工干预 ,将从节点晋升为主节点, 同时还需要修改客户端配置。 对于很多应用场景这种方式无法接受。
Sentinel(哨兵)架构解决了 redis 主从人工干预的问题。 Redis Sentinel 是 redis 的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的。
7.2 哨兵主要功能 Redis Sentinel 是一个分布式系统, Redis Sentinel 为 Redis 提供高可用性。可以在没有人为干预的 情况下阻止某种类型的故障。 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance)该系统执行以下三个任务:
1.监控(Monitoring):
1 Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。
2.提醒(Notification):
1 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
3.自动故障迁移(Automatic failover) :
1 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器
架构图:
7.3 目录规划
**角色 **
IP
端口
Master
10.0.0.51
6379
Sentinel-01
26379
slave01
10.0.0.52
6379
Sentinel-02
26379
slave02
10.0.0.53
26379
Sentinel-03
26379
7.4 安装配置命令 哨兵是基于主从复制,所以需要先部署好主从复制
手工操作步骤如下:
1 2 3 4 1. 先配置和创建好 1 台服务器的节点和哨兵2. 使用 rsync 传输到另外 2 台机器3. 修改另外两台机器的 IP 地址 ps : 建议使用 ansible 剧本批量部署
7.4.1 db01 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 mkdir -p /data/redis_cluster/redis_26379 mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs} cat > /opt/ redis_cluster/redis_26379/conf/redis_26379.conf <<EOF bind 10.0 .0 .51 port 26379 daemonize yes logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log dir /data/redis_cluster/redis_26379 sentinel monitor mymaster 10.0 .0 .51 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 1800 EOF
7.4.2 db02 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 mkdir -p /data/redis_cluster/redis_26379 mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs} cat > /opt/ redis_cluster/redis_26379/conf/redis_26379.conf <<EOF bind 10.0 .0 .52 port 26379 daemonize yes logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log dir /data/redis_cluster/redis_26379 sentinel monitor mymaster 10.0 .0 .51 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 1800 EOF
7.4.3 db03 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 mkdir -p /data/redis_cluster/redis_26379 mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs} cat > /opt/ redis_cluster/redis_26379/conf/redis_26379.conf <<EOF bind 10.0 .0 .53 port 26379 daemonize yes logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log dir /data/redis_cluster/redis_26379 sentinel monitor mymaster 10.0 .0 .51 6379 2 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 1800 EOF
7.4.4 配置文件解释 1 2 3 4 5 6 7 8 sentinel monitor mymaster 10.0 .0 .51 6379 2 #mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个 sentinel 节点同意 sentinel down-after-milliseconds mymaster 3000 #选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。 sentinel parallel-syncs mymaster 1 #向新的主节点发起复制操作的从节点个数,1 轮询发起复制 sentinel failover-timeout mymaster 18000 #故障转移超时时间
7.4.5 db02/db03 命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -db01 rsync -avz /opt/* db02:/opt/ rsync -avz /opt/* db03:/opt/ -db02 mkdir -p /data/redis_cluster/redis_26379cd /opt/redis_cluster/redismake install sed -i 's#bind 10.0.0.51#bind 10.0.0.52#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf sed -i 's#bind 10.0.0.51#bind 10.0.0.52#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf -db03 mkdir -p /data/redis_cluster/redis_26379cd /opt/redis_cluster/redismake install sed -i 's#bind 10.0.0.51#bind 10.0.0.53#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf sed -i 's#bind 10.0.0.51#bind 10.0.0.53#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf
7.4.6 配置主从关系 db02 和 db03
1 2 3 redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf redis-cli slaveof 10.0.0.51 6379 ps -ef|grep redis
7.4.7 启动哨兵 3 台都操作
1 redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
7.5 配置文件的变化 1 2 3 4 当所有节点启动后,配置文件的内容发生了变化,体现在三个方面: 1)Sentinel 节点自动发现了从节点,其余 Sentinel 节点 2)去掉了默认配置,例如 parallel-syncs failover-timeout 参数 3)添加了配置纪元相关参数
查看配置文件命令
1 2 3 4 5 6 7 [root@db01 ~] sentinel known-slave mymaster 10.0.0.52 6379 sentinel known-slave mymaster 10.0.0.53 6379 sentinel known-sentinel mymaster 10.0.0.53 26379 7794fbbb9dfb62f4d2d7f06ddef06bacb62e4c97 sentinel known-sentinel mymaster 10.0.0.52 26379 17bfab23bc53a531571790b9b31558dddeaeca40 sentinel current-epoch 0
7.6 哨兵常用操作 API 登陆命令
Sentinel 节点是一个特殊的 Redis 节点,他们有自己专属的 API
1 2 3 4 5 6 7 8 Info Sentinel Sentinel masters Sentinel master <master name> Sentinel slaves <master name> Sentinel sentinels <master name> Sentinel get-master-addr-by-name <master name> Sentinel failover <master name> Sentinel flushconfig
7.7 模拟故障转移
停掉其中 1 个节点,然后观察其他节点的日志变化 故障转移后配置文件变化
1 2 3 4 5 Redis Sentinel 存在多个从节点时,如果想将指定的从节点晋升为主节点,可以将其他从节点的 slavepriority 配置为 0,但是需要注意 failover 后,将 slave-priority 调回原值. 1.查询命令:CONFIG GET slave-priority 2.设置命令:CONFIG SET slave-priority 0 3.主动切换:sentinel failover mymaster
操作过程: db02/db03 操作
1 2 redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0 redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0
db01 操作
1 redis-cli -h db01 -p 26379 Sentinel failover mymaster