Redis主从复制--哨兵机制(二)

Redis主从复制--哨兵机制(二)


主从复制的问题

Redis 复制有一个缺点,当主机 Master 宕机以后,我们需要人工解决切换,比如使用slaveof no one 。实际上
主从复制并没有实现,高可用,  高可用侧重备份机器, 利用集群中系统的冗余,当系统中某台机器发生损坏的时
候,其他后备的机器可以迅速的接替它来启动服务

哨兵机制的原理及实现

Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点
会对数据节点和其余 Sentinel 节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识
的是主节点,它还会和其他 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,
它们会选举出一个 Sentinel 节点来完成自动故障转移的工作,同时会将这个变化实时通知给 Redis 应用
方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。
如图:

file

基本的故障转移流程:

    1)主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。

file

2)每个 Sentinel 节点通过定期监控发现主节点出现了故障

file

3)多个 Sentinel 节点对主节点的故障达成一致会选举出其中一个节点作为领导者负责故障转移。

file

    4)Sentinel 领导者节点执行了故障转移,整个过程基本是跟我们手动调整一致的,只不过是自动化完成的。

file

    5)故障转移后整个 Redis Sentinel 的结构,重新选举了新的主节点,并且

file

Redis Sentinel 具有以下几个功能:

监控:Sentinel 节点会定期检测 Redis 数据节点、其余 Sentinel 节点是否可达。

通知:Sentinel 节点会将故障转移的结果通知给应用方。

主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。

配置提供者:在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合,从中获取主节点信息。

同时Redis Sentinel 包含了若个 Sentinel 节点,这样做也带来了两个好处:

对于节点的故障判断是由多个 Sentinel 节点共同完成,这样可以有效地防止误判。

Sentinel 节点集合是由若干个 Sentinel 节点组成的,这样即使个别 Sentinel 节点不可用,整个 Sentinel 节点集合依然是健壮的。

但是 Sentinel 节点本身就是独立的 Redis 节点,只不过它们有一些特殊,它们不存储数据,只支持部分命令

Sentinel 的核心配置:

sentinel monitor mymaster 127.0.0.1 7000 2   监控的主节点的名字、IP 和端口,最后一个2的意思是有几台 Sentinel 发现有问题,就会发生故障转移,例如 配置为2,代表至少有2个 Sentinel 节点认为主节点不可达,那么这个不可达的判定才是客观的。对于设置的越小,那么达到下线的条件越宽松,反之越严格。一般建议将其设置为 Sentinel 节点的一半加1 注意:最后的参数不得大于conut(sentinel)

sentinel down-after-millseconds mymaster 30000   这个是超时的时间(单位为毫秒)

sentinel parallel-syncs mymaster 1   当 Sentinel 节点集合对主节点故障判定达成一致时,Sentinel 领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs 就是用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数,指出 Sentinel 属于并发还是串行。1代表每次只能复制一个,可以减轻 Master 的压力;

file

sentinel auth-pass <master-name> <password>  如果 Sentinel 监控的主节点配置了密码,sentinel auth-pass 配置通过添加主节点的密码,防止 Sentinel 节点对主节点无法监控。

sentinel failover-timeout mymaster 180000  表示故障转移的时间。

Sentinel命令

SENTINEL masters 显示被监控的所有master以及它们的状态.

SENTINEL master <master name> 显示指定master的信息和状态;

SENTINEL slaves <master name> 显示指定master的所有slave以及它们的状态;

SENTINEL get-master-addr-by-name <master name> 返回指定master的ip和端口,如果正在进行failover或者failover已经完成,将会显示被提升为master的slave的ip和端口。

SENTINEL failover <master name> 强制sentinel执行failover,并且不需要得到其他sentinel的同意。但是failover后会将最新的配置发送给其他sentinel。

修改配置

sentinel monitor test  127.0.0.1 6379 2   添加新的监听

SENTINEL  REMOVE test     放弃对某个master监听

SENTINEL   set  failover-timeout mymaster 180000  设置配置选项

应用端调用

Master可能会因为某些情况宕机了,如果在客户端是固定一个地址去访问,肯定是不合理的,所以客户端请求是请求哨兵,从哨兵获取主机地址的信息,或者是从机的信息。

Sentinel 实现原理

1.检测问题,三个定时任务,这三个内部的执行任务可以保证出现问题马上让 Sentinel 知道。

(1)每10秒每个 Sentinel 对 Master 和 Slave 执行一次 Info Replication。
第一个定时任务,指的是 Redis Sentinel 可以对 Redis 节点做失败判断和故障转移,在 Redis 内部有三个定时任务作为基础,来 Info Replication 发现 Slave 节点,这个命令可以确定主从关系。

(2)每2秒每个 Sentinel 通过 Master 节点的 channel 交换信息(pub/sub)。
    第两个定时任务,类似于发布订阅,Sentinel 会对主从关系进行判定,通过 _sentinel_:hello 频道交互。了解主从关系可以帮助更好的自动化操作 Redis。然后 Sentinel 会告知系统消息给其它 Sentinel 节点,最终达到共识,同时 Sentinel 节点能够互相感知到对方.

(3)每1秒每个 Sentinel 对其他 Sentinel 和 Redis 执行 ping。
    第三个定时任务,指的是对每个节点和其它 Sentinel 进行心跳检测,它是失败判定的依据。

2.发现问题,主要讲的是主观下线和客观下线。当有一台 Sentinel 机器发现问题时,它就会主观对它主观下线,但是当多个 Sentinel 都发现有问题的时候,才会出现客观下线。

Sentinel 的配置:sentinel monitor mymaster 127.0.0.1 6379 2  
sentinel down-after-milliseconds mymaster 30000
Sentinel 会 ping 每个节点,如果超过30秒,依然没有回复的话,做下线的判断。

3.找到解决问题的人,主要讲的是领导者选举,如何在 Sentinel 内部多台节点做领导者选举,选出一个领导者。

(1)每个做主观下线的sentinel节点,会向其他的sentinel节点发送命令,要求将它设置成为领导者
(2)到命令sentinel节点,如果没有同意通过其它节点发送的命令,那么就会同意请求,否则就会拒绝
(3) ntinel节点发现自己票数超过半数,同时也超过了sentinel monitor mymaster 127.0.0.1 6379 2  超过2个的时候,就会成为领导者

4.进行故障转移操作

    Redis 内部其实是有一个优先级配置的,在配置文件中 slave-priority,这个参数是 Salve 节点的优先级配置,如果存在则返回,如果不存在则继续。当上面这个优先级不满足的时候,Redis 还会选择复制偏移量最大的 Slave节点,如果存在则返回,如果不存在则继续。之所以选择偏移量最大,这是因为偏移量越小,和 Master 的数据越不接近,现在 Master挂掉了,说明这个偏移量小的机器数据也可能存在问题,这就是为什么要选偏移量最大的 Slave 的原因。如果发现偏移量都一样,这个时候 Redis 会默认选择 runid 最小的节点。

生产环境中部署技巧

1)Sentinel 节点不应该部署在一台物理“机器”上。
       现今比较流行的容器,它们虽然有不同的 IP 地址,但实际上它们都是同一台物理机,同一台物理机意味着如果这台机器有什么硬件故障,所有的虚拟机都会受到影响,为了实现 Sentinel 节点集合真正的高可用,请勿将 Sentinel 节点部署在同一台物理机器上。

2)部署至少三个且奇数个的 Sentinel 节点。
        3个以上是通过增加 Sentinel 节点的个数提高对于故障判定的准确性,因为领导者选举需要至少一半加1个节点,奇数个节点可以在满足该条件的基础上节省一个节点。
猜你喜欢