Redis——Sentinel

Redis Sentinel(哨兵)是 Redis 高可用的解决方案,本身是一个独立运行的进程,它可以监视多个 Master-Slave 集群,发现 Master 宕机之后,能进行自动切换,将该 Master 下的某个 Slave 晋升为 Master,继续处理请求。

Redis Sentinel 主要功能:

  • 监控:检查主从服务器是否运行正常;
  • 自动故障迁移:主从切换。
架构说明

Redis Sentinel 架构:
在这里插入图片描述
Redis Sentinel 故障转移:

  1. 如果 master 宕机了,连接出现中断,多个 Sentinel 发现并确认 master 有问题;
  2. 选举出一个 Sentinel 作为领导;
  3. 选举一个 slave 作为新的 master;
  4. 通知其余 slave 成为新的 master 的 slave;
  5. 通知客户端主从变化;
  6. Sentinel 等待老的 master 复活成为新 master 的 slave。
安装配置

安装与配置大致过程如下:

1、配置开启主从节点;
2、配置开启 Sentinel 监控主节点(Sentinel 是特殊的 Redis,Sentinel 本身是不存储数据的,而且支持的命令非常有限,主要作用就是监控、完成故障转移、通知);
3、实际应该多机器部署 Sentinel,保证 Sentinel 高可用;
4、详细配置

Redis 主节点 redis/config/redis-7000.conf 配置(redis.conf 模板文件在 redis/redis.conf):

# 关闭保护模式
protected-mode no
# 配置启动端口
port 7000
# 配置后台启动
daemonize yes
# 修改pidfile指向路径 redis-${port}.pid
pidfile /var/run/redis-7000.pid
# 日志记录方式 redis-${port}.log
logfile "redis-7000.log"
# 配置dump数据存放目录
dir "/opt/soft/redis/data/"
# 配置dump数据文件名 redis-${port}.rdb
dbfilename dump-7000.rdb

启动命令:

redis-server redis-7000.conf

Redis 从节点 redis/config/redis-7001.conf 配置(redis-7002.conf 只是端口号不同):

# 关闭保护模式
protected-mode no
# 配置启动端口
port 7001
# 配置后台启动
daemonize yes
# 修改pidfile指向路径 redis-${port}.pid
pidfile /var/run/redis-7001.pid
# 日志记录方式 redis-${port}.log
logfile "redis-7001.log"
# 配置dump数据存放目录
dir "/opt/soft/redis/data/"
# 配置dump数据文件名 redis-${port}.rdb
dbfilename dump-7001.rdb
# 配置master的ip地址、端口,在Redis启动时会自动从master进行数据同步
slaveof 127.0.0.1 7000

启动命令:

redis-server redis-7001.conf
redis-server redis-7002.conf

Sentinel 节点 redis/config/redis-sentinel-26379.conf 配置(这里只给出其中一个配置,另外两个只是端口号不同,sentinel.conf 模板文件在 redis/sentinel.conf):

# 配置启动端口
port 26379
# 配置后台启动
daemonize yes
# 配置工作目录
dir "/opt/soft/redis/data/"
# 日志记录方式 redis-sentinel-${port}.log
logfile "redis-sentinel-26379.log"
# sentinel监听master的名字、ip、端口、几个sentinel认为master有问题就发生故障转移(最好配置sentinel节点的二分之一加一)
sentinel monitor mymaster 127.0.0.1 7000 2
# 每一个sentinel节点都会向master节点、slave节点和其他sentinel节点1秒钟ping一次。在down-after-milliseconds毫秒内没有进行回复,则判定该节点失败
sentinel down-after-milliseconds mymaster 30000
# slave复制时可以并行的个数,建议1,减轻master的压力
sentinel parallel-syncs mymaster 1
# 故障转移时间
sentinel failover-timeout mymaster 180000

启动命令:

redis-sentinel redis-sentinel-26379.conf
redis-sentinel redis-sentinel-26380.conf
redis-sentinel redis-sentinel-26381.conf
故障转移实现原理

Redis Sentinel 通过三个定时任务实现了 Sentinel 节点对于主节点、从节点、其余 Sentinel 节点的监控。
Sentinel 在对节点做失败判定时分为主观下线和客观下线。
Sentinel 实现读写分离高可用依赖 Sentinel 节点的消息通知,获取 Redis 数据节点的状态变化。

三个定时任务

为了保证 Redis Sentinel 可以对 Redis 节点做失败判定以及做故障转移,在 Redis Sentinel 内部是有三个定时任务作为基础的:

  • 每 10 秒每个 sentinel 对 master 和 slave 执行 info 操作;
    • 发现 slave 节点;
    • 确认主从关系;
  • 每 2 秒每个 sentinel 通过 master 节点的 channel(频道)交换信息(pub/sub);
    • 通过__sentinel__:hello频道交互;
    • 交互对节点的 “看法” 和自身信息;
  • 每 1 秒每个 sentinel 对其他 sentinel 和 redis 执行 ping
三个消息
  • +switch-master:切换主节点(从节点晋升为主节点);
  • +convert-to-slave:切换从节点(原主节点降为从节点);
  • +sdown:主观下线。
主观下线和客观下线

主观下线:单个 sentinel 节点对 Redis 节点做出的下线判断;

客观下线:超过 quorum(sentinel monitor < masterName> < ip> < port> < quorum> 配置)个 sentinel 节点对 Redis 节点做出的下线判断;

只有当 master 被认定为客观下线时,才会发生故障迁移。

领导者选举

完成故障转移的过程只需要一个 sentinel 来完成。

sentinel 领导者选举使用的是 raft 算法,大致过程:

  1. 每一个做主观下线的 sentinel 节点向其他 sentinel 节点发送命令,要求将它设置为领导者;
  2. 收到命令的 sentinel 节点,如果在发生故障周期内没有同意其他 sentinel 节点发送的命令,那么将同意该请求,否则拒绝;
  3. 如果该 sentinel 节点发现自己的票数已经超过 sentinel 集合半数且超过 quorum(sentinel monitor 配置),那么它将称为领导者;
  4. 如果此过程有多个 sentinel 节点成为了领导者,那么将等待一段时间重新进行选举。
故障转移(sentinel 领导者节点完成)
  1. 从 slave 节点中选出一个 “合适的” 节点作为新的 master 节点;
  2. 对步骤 1 的 slave 节点执行 slaveof no one 命令让其成为 master 节点;
  3. 向剩余的 slave 节点发送命令,让它们成为新 master 节点的 slave 节点,复制规则和 parallel-syncs 参数有关;
  4. 对原来的 master 节点配置为 slave,并保持对其 “关注”,当其恢复后命令它去复制新的 master 节点。

选择 “合适的” slave 节点:

  1. 选择 slave-priority(slave 节点优先级)最高的 slave 节点,如果存在则返回,不存在则继续;
  2. 选择复制偏移量最大的 slave 节点(复制的最完整),如果存在则返回,不存在则继续;
  3. 选择 runid 最小的 slave 节点(启动最早的节点)。

猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/107869538