5. Redis Sentinel

一. 主从复制中出现的问题

    1)需要手动故障转移

    2)写能力和存储能力受限

 

二. Redis sentinel 架构和故障转移

 1)Redis sentinel架构

 

 

   a. redis sentinel采用多节点保证其高可用性

   b. redis sentinel负责监控每一个节点的状态

   c. redis sentinel负责连接客户端,并将客户端的请求转给redis或将redis结果返回给客户端

 2 )redis故障转移

  故障转移总共有6步:

  1.多个sentinel发现并确认master有问题

  2.选举出一个sentinel作为领导

  3.选举出一个slave作为master

  4.通知其余slave成为新的master的slave

  5.通知客户端主从变化

  6.等待老的master复活成为新的master的slave

 

三. Redis Sentinel 安装。

 1)服务列表:3个Redis Sentinel + 3个redis服务器(1个master + 2个slave)

 2)配置3个redis服务器并启动

  a.master配置

port 6380
daemonize yes pidfile /var/run/redis_6380.pid logfile "6380.log" dbfilename dump-6380.rdb dir /opt/soft/redis/test/redis-6380/data

  b.slave1配置

port 6381
daemonize yes pidfile /var/run/redis_6381.pid logfile "6381.log" dbfilename dump-6381.rdb dir /opt/soft/redis/test/redis-6381/data slaveof 127.0.0.1 6380

  c.slave2配置

port 6382
daemonize yes pidfile /var/run/redis_6382.pid logfile "6382.log" dbfilename dump-6382.rdb dir /opt/soft/redis/test/redis-6382/data slaveof 127.0.0.1 6380

  d.启动redis服务器

./bin/redis-server ./conf/redis-6380.conf
./bin/redis-server ./conf/redis-6381.conf
./bin/redis-server ./conf/redis-6382.conf

 3)配置3个redis sentinel服务器并启动

  a.sentinel1配置

daemonize yes
port 26379
dir /opt/soft/redis/test/sentinal-26379/data
logfile "26379.log"
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 30000  #设置故障down机30秒之后执行故障自动转移
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

  b.sentinel2配置

daemonize yes
port 26380
dir /opt/soft/redis/test/sentinal-26380/data
logfile "26380.log"
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

  c.sentinel3配置

daemonize yes
port 26381
dir /opt/soft/redis/test/sentinal-26381/data
logfile "26381.log"
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

  d.启动redis-sentinel服务器

./bin/redis-sentinel ./conf/sentinel-26379.conf
./bin/redis-sentinel ./conf/sentinel-26380.conf
./bin/redis-sentinel ./conf/sentinel-26381.conf

 

四. Java客户端连接redis sentinel

  a.客户端借入redis sentinel流程

    1.获取Sentinel地址集合

    2.根据masterName获取master信息

    3.注意这个不是代理模式,因为它不是每次都要先跟Sentinel请求才能获得master

  b.使用Jedis连接redis sentinel方法

 

 

五. 故障转移

  故障转移时间:down-after-milliseconds

    down-after-milliseconds 用来配置用来设置故障转移时间,如果主节点 master down机,sentinel 会在 down-after-milliseconds 时间内一直尝试重连,若 down-after-milliseconds 时间后后仍未连接成功,则 sentinel 会自动进行故障转移,但在 down-after-milliseconds 时间内redis服务是 down掉的,无法提供服务

 

六. Redis Sentinel 故障转移原理:三个定时任务

 1. 每 10 秒每个 sentinel 对 master 和 slave 执行 info,这样可以发现 slave 节点和确认主从关系

 2. 每 2 秒每个 sentinel 通过 master 节点的 channel 交换信息(publish/subscribe),主要通过 _sentinel_:hello 频道交互,达到交互对节点“看法”和自身信息

 3. 每 1 秒每个 sentinel 对其他 sentinel 和 redis 执行 ping 心跳检测,用作失败判定依据

  

七. Redis Sentinel 故障转移原理:主观下线和客观下线

 监视命令:monitor <masterName> <ip> <port> <quorum>

 主观下线:每个sentinel节点对Redis节点失败的“偏见“

 客观下线:所有sentinel节点对Redis节点失败“达成共识”(超过quorum个统一) 

 

八. Redis Sentinel 故障转移原理:sentinel 领导者选举过程

  1. 每个做主管下线的 sentinel 节点向其他 sentinel 节点发送命令,要求将它设置为领导者
  2. 收到命令的 sentinel 节点如果没有同意通过其他 sentinel 节点发送的命令,那么将同意该请求,否则拒绝
  3. 如果该 sentinel 节点发现自己的票数已经超过 sentinel 集合半数且超过 quorum,那么它将称为 leader
  4. 如果此过程中有多个 sentinel 节点成为了领导者,那么将等待一段时间重新选举

 

九. Redis Sentinel 故障转移原理:故障转移过程

  1. 从 slave 节点中选出一个“合适的”节点作为新的 master 节点,合适标准如下
    1. 选择 slave-priority (slave 节点优先级)最高的 slave 节点
    2. 第一步不通过,再选择复制偏移量最大的 slave 节点(复制最完整)
    3. 第二步不通过,再选择 runId最小(启动时间最早)的节点
  2. 对上面的 slave 节点执行 slaveof on one 命令让其成为 master 节点。
  3. 向剩余的 slave 节点发送命令,让它们成为新的master 节点的 slave 节点,复制规则和 parallel-syncs 参数有关
  4. 更新对原来 master 节点配置为 slave,并保持对其关注,当其恢复后命令它去复制新的 master 节点

 

posted @ 2021-08-14 23:48  programmLover  阅读(39)  评论(0编辑  收藏  举报