Redis 官方的高可用解决方案!请收藏

Redis主从复制的问题

Redis 主从复制可将主节点数据同步给从节点,从节点此时有两个做用:程序员

  • 一旦主节点宕机,从节点做为主节点的备份能够随时顶上来。
  • 扩展主节点的读能力,分担主节点读压力。

图片

主从复制同时存在如下几个问题:redis

  • 一旦主节点宕机,从节点晋升成主节点,同时须要修改应用方的主节点地址,还须要命令全部 从节点去复制新的主节点,整个过程须要人工干预。
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。
  • 原生复制的弊端在早期的版本中也会比较突出,好比:Redis 复制中断后,从节点会发起 psync。此时若是同步不成功,则会进行全量同步,主库执行全量备份的同时,可能会形成毫秒或秒级的卡顿。
  • 在民工哥技术之路公众号后台回复关键字  Redis手册  免费获取一份redis最佳实践与实战指南电子书

Redis 的 哨兵(Sentinel)深刻探究

Redis Sentinel的架构

图片

Redis的哨兵机制就是解决咱们以上主从复制存在缺陷(选举问题),保证咱们的Redis高可用,实现自动化故障发现与故障转移。服务器

该系统执行如下三个任务:架构

  • 监控:哨兵会不断检查你的主服务器和从服务器是否运做正常。
  • 提醒:当被监控的某个Redis服务器出现问题时,哨兵能够经过API给程序员发送通知
  • 自动故障转移:主服务器宕机,哨兵会开始一次自动故障转移操做,升级一个从服务器为主服务器,并让其余从服务器改成复制新的主服务器.

配置 Sentinel

Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。spa

运行一个 Sentinel 所需的最少配置以下所示:.net

1)sentinel monitor mymaster 192.168.10.202 6379 2

Sentine监听的maste地址,第一个参数是给master起的名字,第二个参数为master IP,第三个为master端口,第四个为当该master挂了的时候,若想将该master判为失效,

在Sentine集群中必须至少2个Sentine赞成才行,只要该数量不达标,则就不会发生故障迁移。

2)sentinel down-after-milliseconds mymaster 30000

表示master被当前sentinel实例认定为失效的间隔时间,在这段时间内一直没有给Sentine返回有效信息,则认定该master主观下线。

只有在足够数量的 Sentinel 都将一个服务器标记为主观下线以后, 服务器才会被标记为客观下线,将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。

3)sentinel parallel-syncs mymaster 2

当在执行故障转移时,设置几个slave同时进行切换master,该值越大,则可能就有越多的slave在切换master时不可用,能够将该值设置为1,即一个一个来,这样在某个

slave进行切换master同步数据时,其他的slave还能正常工做,以此保证每次只有一个从服务器处于不能处理命令请求的状态。

4)sentinel can-failover mymaster yes

在sentinel检测到O_DOWN后,是否对这台redis启动failover机制

5)sentinel auth-pass mymaster 20180408

设置sentinel链接的master和slave的密码,这个须要和redis.conf文件中设置的密码同样

6)sentinel failover-timeout mymaster 180000

failover过时时间,当failover开始后,在此时间内仍然没有触发任何failover操做,当前sentinel将会认为这次failoer失败。 

执行故障迁移超时时间,即在指定时间内没有大多数的sentinel 反馈master下线,该故障迁移计划则失效

7)sentinel config-epoch mymaster 0

选项指定了在执行故障转移时, 最多能够有多少个从服务器同时对新的主服务器进行同步。这个数字越小, 完成故障转移所需的时间就越长。

8)sentinel notification-script mymaster /var/redis/notify.sh

当failover时,能够指定一个"通知"脚本用来告知当前集群的状况。

脚本被容许执行的最大时间为60秒,若是超时,脚本将会被终止(KILL)


9)sentinel leader-epoch mymaster 0

同时一时间最多0个slave可同时更新配置,建议数字不要太大,以避免影响正常对外提供服务。
主观下线和客观下线
  • 主观下线:指的是单个 Sentinel 实例对服务器作出的下线判断。
  • 客观下线:指的是多个 Sentinel 实例在对同一个服务器作出SDOWN主观下线判断。

Redis Sentinel的工做原理

1.每一个 Sentinel 以每秒一次的频率向它所知的主服务器、从服务器以及其余 Sentinel 实例发送一个 PING 命令。3d

图片

2.若是一个实例距离最后一次有效回复 PING 命令的时间超过指定的值, 那么这个实例会被 Sentinel 标记为主观下线。code

图片

3.正在监视这个主服务器的全部 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。blog

图片

4.有足够数量的 Sentinel 在指定的时间范围内赞成这一判断, 那么这个主服务器被标记为客观下线。图片

图片

5.每一个 Sentinel 会以每 10 秒一次的频率向它已知的全部主服务器和从服务器发送 INFO 命令。当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的全部从服务器发送 INFO 命令的频率会从 10 秒一次改成每秒一次。在民工哥技术之路公众号后台回复关键字  Redis手册  免费获取一份redis最佳实践与实战指南电子书。

图片

6.Sentinel 和其余 Sentinel 协商主节点的状态,若是主节点处于 SDOWN 状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点进行数据复制。

图片

7.当没有足够数量的 Sentinel 赞成主服务器 下线时, 主服务器的客观下线状态就会被移除。当主服务器从新向 Sentinel 的 PING 命令返回有效回复时,主服务器的主观下线状态就会被移除。

图片

自动发现 Sentinel 和从服务器

一个 Sentinel 能够与其余多个 Sentinel 进行链接, 各个 Sentinel 之间能够互相检查对方的可用性,并进行信息交换。

你无须为运行的每一个 Sentinel 分别设置其余 Sentinel 的地址,由于 Sentinel 能够经过发布与订阅功能来自动发现正在监视相同主服务器的其余 Sentinel。

  • 每一个 Sentinel 会以每两秒一次的频率,经过发布与订阅功能,向被它监视的全部主服务器和从服务器的频道发送一条信息,信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)。
  • 每一个 Sentinel 都订阅了被它监视的全部主服务器和从服务器的频道, 查找以前未出现过的 sentinel 。当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中。
  • Sentinel 发送的信息中还包括完整的主服务器当前配置。若是一个 Sentinel 包含的主服务器配置比另外一个 Sentinel 发送的配置要旧, 那么这个 Sentinel 会当即升级到新配置上。
  • 在将一个新 Sentinel 添加到监视主服务器的列表上面以前, Sentinel 会先检查列表中是否已经包含了和要添加的 Sentinel 拥有相同运行 ID 或者相同地址(包括 IP 地址和端口号)的 Sentinel , 若是是的话, Sentinel 会先移除列表中已有的那些拥有相同运行 ID 或者相同地址的 Sentinel , 而后再添加新 Sentinel

故障转移

一次故障转移操做由如下步骤组成:

  • 发现主服务器已经进入客观下线状态。
  • 对咱们的当前纪元进行自增, 并尝试在这个纪元中当选。
  • 若是当选失败, 那么在设定的故障迁移超时时间的两倍以后, 从新尝试当选。若是当选成功, 那么执行如下步骤。
  • 选出一个从服务器,并将它升级为主服务器。
  • 向被选中的从服务器发送 SLAVEOF NO ONE 命令,让它转变为主服务器。
  • 经过发布与订阅功能, 将更新后的配置传播给全部其余 Sentinel , 其余 Sentinel 对它们本身的配置进行更新。
  • 向已下线主服务器的从服务器发送 SLAVEOF 命令, 让它们去复制新的主服务器。
  • 当全部从服务器都已经开始复制新的主服务器时, 领头 Sentinel 终止此次故障迁移操做。

做者:须臾之余
https://my.oschina.net/u/3995...

相关文章
相关标签/搜索