DBA - NoSQL - Redis: 哨兵



Redis Sentinel(哨兵)


哨兵介绍

Redis 的主从模式下,主节点一旦发生故障不能提供服务,需要人工干预,将从节点晋升为主节点,同时还需要修改客户端配置。对于很多应用场景这种方式无法接受。

Sentinel(哨兵)架构解决了 redis 主从人工干预的问题。

Redis Sentinel 是 redis 的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的。

架构




哨兵主要功能

Redis Sentinel 是一个分布式系统, Redis Sentinel 为 Redis 提供高可用性。可以在没有人为干预的情况下阻止某种类型的故障。

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance)该系统执行以下三个任务:

1. 监控(Monitoring)

Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。

2. 提醒(Notification)

当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

3. 自动故障迁移(Automatic failover)

当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器.


搭建

主从复制是基础

目录规划


角色           IP          端口
Master  10.0.0.51   6379
Sentinel-01      26379
Master  10.0.0.52   6379
Sentinel-02      26379
Master  10.0.0.53   6379
Sentinel-03      26379


安装配置命令

哨兵是基于主从复制,所以需要先部署好主从复制

手工操作步骤如下:

  • 1.先配置和创建好 1 台服务器的节点和哨兵
  • 2.使用 rsync 传输到另外 2 台机器
  • 3.修改另外两台机器的 IP 地址

建议使用 ansible 剧本批量部署

db01 命令

mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
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 18000


配置文件解释

sentinel monitor mymaster 10.0.0.51 6379 2 
# mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个 sentinel 节点同意
sentinel down-after-milliseconds mymaster 30000 
# 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel parallel-syncs mymaster 1 
# 向新的主节点发起复制操作的从节点个数,1轮询发起复制
sentinel failover-timeout mymaster 180000 
# 故障转移超时时间


db02/db03 命令

db01

rsync -avz /opt/* db02:/opt/
rsync -avz /opt/* db03:/opt/

db02

mkdir -p /data/redis_cluster/redis_26379
cd /opt/redis_cluster/redis
make 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_26379
cd /opt/redis_cluster/redis
make 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


配置主从关系

db02 和 db03

redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
redis-cli slaveof 10.0.0.51 6379
ps -ef|grep redis


启动哨兵

3台都操作

redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf


配置文件的变化

当所有节点启动后,配置文件的内容发生了变化,体现在三个方面:

  • 1) Sentinel 节点自动发现了从节点, 其余 Sentinel 节点
  • 2) 去掉了默认配置, 例如 parallel-syncs failover-timeout 参数
  • 3) 添加了配置纪元相关参数

查看配置文件命令

[root@db01 ~]# tail -6 /opt/redis_cluster/redis_26379/conf/redis_26379.conf  
# Generated by CONFIG REWRITE
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


哨兵常用操作 API

登陆命令

[root@db01 ~]# redis-cli -h db01 -p 26379
Sentinel节点是一个特殊的Redis节点,他们有自己专属的API
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


模拟故障转移

停掉其中1个节点,然后观察其他节点的日志变化

故障转移后配置文件变化

Redis Sentinel 存在多个从节点时, 如果想将指定的从节点晋升为主节点, 可以将其他从节点的 slavepriority 配置为 0, 但是需要注意 failover 后, 将 slave-priority 调回原值.

  • 1.查询命令:CONFIG GET slave-priority
  • 2.设置命令:CONFIG SET slave-priority 0
  • 3.主动切换:sentinel failover mymaster


操作过程:

db02/db03操作

redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0


db01操作

redis-cli -h db01 -p 26379 Sentinel failover mymaster