redis学习6--redis-Sentinel哨兵

  1 主从复制的问题:一旦主节点出现了故障,那么需要人工手动进行故障转移,这很不方便。应用方也无法及时感知到主节点的变化,造成数据丢失。

  Redis Sentinel 架构包含若干Sentinel 和若干 Redis 数据节点,Sentinel其实也算 普通Redis节点 但是Sentinel节点是不存储数据的,每个Sentinel 会的对其他的Sentinel节点及Redis节点进行监控,当发现节点不可达时,会对节点进行下线标识, 然后它会与其他Sentinel节点进行协商, 大家一起来判断故障节点是不是真的不可用了,当判断为true时 这些Sentinel节点会推选出一个Sentinel节点来执行故障自动转移的工作。 这整个过程都是自动的。

  Redis Sentinel 能自动完成故障转移,并通知应用方,实现高可用

  

  2 部署redis节点, 一个主节点,两个从节点,具体如下

  

  分别启动 主节点和从节点  ,并且查看节点信息

  

  3 部署 Sentinel节点,

  进入redis目录,根据标准redis-Sentinel文件 生成新的文件,去掉注释和空格 并且从定向到 redis-sentinel-26379.conf文件

  cat sentinel.conf  | grep -v "#" | grep -v "^$" > redis-sentinel-26379.conf

   将  redis-sentinel-26379.conf 移动到 config目录下,编辑  其余两个节点与这个基本一致,处理端口和日志文件

  

 

  启动节点

  

   查看节点信息

  

   启动后配置文件增加了下面几行,找到了两个redis从节点,找到了两个Sentinel节点

  在redis主节点 执行set 操作,同时在从节点能get 数据,同时从节点只读,实现主从复制,读写分离,同时将master节点杀掉,Sentinel会推选出新的master节点

,同时Sentinel会继续监听老的master节点,一旦其恢复,就将它加入主从复制中,置为新master节点的从节点,并且这些变化都会通知到应用方,这一切都是全自动的。

  Redis Sentinel  ,java客户端实现(后面再写),实现原理是 遍历所有Sentinel节点集合 ,获取一个可用的Sentinel节点(Sentinel之间的的信息是共享的 所以这里任意获取一个就可以了),然后通过Sentinel 的get-master-addr-by-namer获取主节点的信息

4 实现原理

  Redis Sentinel 通过以下三个定时任务实现节点的监控和发现

  1 每隔10秒,Sentinel节点向Redis主节点发送info replication命令,达到获取主节点信息,从节点信息,感知到新加入的从节点和更新故障转移后的主从节点关系的目标。

  

  2 :每隔2秒 每个Sentinel节点会向Redis数据节点的_sentinel_:hello频道上发送该Sentinel节点对于redis主节点的判断及当前Sentinel节点的信息(其他Sentinel节点也会订阅该频道)。达到 1:交换其他Sentinel节点对于redis主节点信息的判断,为下一步的客观下线提供依据,2:发现新的Sentinel节点,如果是新加入的节点,保存相关Sentinel信息,并与Sentinel节点创建连接。这两个目标。

  3: 每隔1秒每个Sentinel节点会向redis主节点,从节点,其余Sentinel节点发送一条ping命令做一次心跳检查,从而提供判断节点是否存活的依据。

    主观下线与客观下线

  主观下线:上面的第三个定时任务就是主观下线,当ping命令在超过一定时间没得到回复,Sentinel节点对该节点做失败判定,这就是主观下线。

  客观下线:当Sentinel节点主观下线的对象是redis 主节点,该Sentinel节点会与其他Sentinel节点交换对主节点的判断,当超过<quorum>(这个配置就是前面Sentinel的配置文件里面设定的)个数也对其做成主观下线的判断时,那么所有Sentinel节点将对其作出下线的判断,也就是大家现在真正的认为他已经下线了,后面将进行Sentinel领导者选举,故障转移等工作,如果不是redis主节点那么后续的操作不会存在。

  领导者选举,故障转移工作得由一个Sentinel节点来执行,所以Sentinel节点之间会做一个选举工作,Redis选举使用Raft算法实现选举,其主要步骤是

  1 每个在线的Sentinel节点,都有资格成为领导者,当它主观确认redis主节点下线时,将会向其他Sentinel节点发送"我要成为领导者"的命令。

  2 收到命令的Sentinel节点,如果没有同意其他Sentinel节点的该命令。将同意该请求,否则拒绝(也就是说每个Sentinel节点只有一次同意机会,类似于卵子受精,接受了一个不可能再接受一个,)。

  3 如果该节点发现自己通过的次数>=(max(quorum,num(sentinel)/2+1)),那么它将成为领导者。  

  4 如果这个过程没选出领导者 ,那么将进行下一轮选举。

  故障转移

  1 过滤掉不健康的节点(主观下线,断线的)

  2 选择 slave-priority的节点

  3 选择复制偏移量最大的节点

  4 选择runid最小的节点

  

 

posted on 2018-09-12 16:43  Advance_Man  阅读(240)  评论(0编辑  收藏  举报

导航