美文网首页
Redis哨兵

Redis哨兵

作者: 小七奇奇 | 来源:发表于2018-08-28 22:57 被阅读50次

    Redis Sentinel

    Redis哨兵为Redis提供高可用。这就意味着你用哨兵可以创建一个Redis部署,在没有人为干预的情况下抵抗某些失败。(PS:自动故障转移)

    Redis哨兵还提供其他的附件任务,比如监控,通知,以及作为客户端的配置提供者。

    • Monitoring(监视) : 哨兵会不断地检查master和slave实例是否按照预期的那样工作
    • Notification(通知) : 哨兵可以通过API的方式来通知管理员(另一台计算机程序),告诉它其中一个被监视的Redis实例出了问题
    • Automatic failover(自动故障转移) : 如果一个master没有如期望的那样工作,哨兵可以开始一个故障转移处理,处理的结果时一个slave被提升为master,其余的slave将用这个新master重新配置,使用这个Redis服务器的应用程序会被通知在连接时使用新的地址。
    • Configuration provider(配置提供者) : 哨兵充当客户端服务发现的权威来源:为了对给定的服务请求作出响应,客户端连接到哨兵以获得当前master的地址。如果发生故障转移,前哨将报告新地址。

    哨兵的分布式特性

    Redis哨兵是一个分布式系统:

    哨兵自身被设计为在一个配置中运行,其中有多个Sentinel进程协同工作。

    多个哨兵进程协同工作的优势在于:

    1. 当多个哨兵都同意且一致认为给定的master不可用时才会执行失败检测。这降低了误报的概率
    2. 即使不是所有哨兵进程都正常工作(PS:个别哨兵不能正常工作)的情况下,仍然会使得系统对故障有较强的抵抗力。

    获得哨兵

    当前版本的哨兵被叫做“Sentinel 2”。它是用更强大和更简单的预测算法重写最初的Sentinel实现。

    运行哨兵

    <pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">redis-sentinel /path/to/sentinel.conf</pre>

    或者

    <pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">redis-server /path/to/sentinel.conf --sentinel</pre>

    这两种方式是一样的

    当运行哨兵时,必须使用一个配置文件,因为系统将会使用这个文件来保存当前状态,以便在重启的时候开业重新加载。如果没有提供配置文件,或者配置文件路径不可写,哨兵将拒绝启动。

    默认情况下,哨兵会监听TCP端口26379,因此,为了让哨兵正常工作,服务器的26379端口必须是开放的,以便可以接收到来自其它哨兵实例的IP的连接。否则,哨兵就不能说话,也不能同意,故障转移也永远不会执行。(PS:意思是,哨兵之间用26379端口进行通信,如果不开放这个端口,其它哨兵就无法与它通信,它也不同同意其它哨兵)

    部署前哨之前要了解的基本知识:

    1、对于一个健壮的部署,你需要至少3个哨兵实例

    2、这三个哨兵应该被放置到相对独立的计算机或者虚拟机上(PS:独立失败,意思是一个失败了对其它的没用影响)

    3、Sentinel + Redis分布式系统不能保证在故障期间已经确认的写操作被保留,因为Redis使用异步复制。

    4、你的Redis客户端需要支持哨兵

    5、如果你在开发环境(甚至是生产环境)没用经过一次又一次严格的测试,那么没用任何HA是安全的。可能你有一个错误的配置,但是一时半会儿看不出什么问题来,有可能过来很久以后这个错误配置导致的问题才会变得明显起来。(PS:意思是,上线前要严格测试,因为你的生产环境上并不是只有redis,有可能其它的隐患因素,比如防火墙什么的。。。)

    6、哨兵、Docker,或者其它NAT或端口映射,这些混在一起要特别小心

    配置哨兵

    配置文件 sentinel.conf

    一个典型的,最小最简洁的配置如下:

    [ 复制代码

    ](javascript:void(0); "复制代码")

    <pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1 sentinel monitor resque 192.168.1.3 6380 4 sentinel down-after-milliseconds resque 10000 sentinel failover-timeout resque 180000 sentinel parallel-syncs resque 5</pre>

    [ 复制代码

    ](javascript:void(0); "复制代码")

    你只需要指定要监视的masters,并且给它们(PS:指的是被监视的master)每一个(也许它们有许多slaves)指定一个唯一的名称。不需要指定slaves,哨兵会自动发现它们。哨兵将自动更新配置,向配置文件中添加一些关于slaves的信息(为了在重启的时候保留这些信息)。每次故障转移期间一个slave被提升为master,以及每次发现一个新的哨兵时,都会重写配置文件。

    上面的配置示例中,监视两组Redis实例,每一组的都由一个master和未知数量的slaves。一个实例叫mymaster,另一个叫resque。

    sentinel monitor 语句的格式如下:

    <pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">sentinel monitor <master-group-name> <ip> <port> <quorum></pre>

    第一行是用来告诉Redis监视一个叫“mymaster”的master,它的地址是127.0.0.1,端口是6379,法定人数是2。

    关于 quorum 参数:

    1、quorum 是一个数字,代表需要有多少个哨兵同意给定的master不可达这个事实,为了真正标记这个slave失败,并且如果可能的话最终启动一个故障转移

    2、quorum 只用于检测失败。为了真的执行一个故障转移,其中一个哨兵需要被选举成为leader,然后由这个leader来执行故障转移。而且,只有在哨兵中的大多数参与投票选举才算是有效

    image

    如果你有5个哨兵,对于给定master的法定人数是2,那么将会发生:

    1、如果两个哨兵都同意并且一致认为master不可访问,那么其中一个将尝试启动一个故障转移

    2、如果至少有3个哨兵正常工作且相互可以正常通信,那么故障转移将会被授权,并真正开始执行

    也就是说,如果哨兵中的大多数相互之间都无法通信,那么故障转移便从来都不会发生。

    (画外音:上面这段话的意思是,只有当至少有法定人数个哨兵认为某个master不可到达的时候,才会尝试启动故障转移,但是最后是否真的执行要看本次投票是否有效,只有当大多数哨兵正常工作时投票才算有效。

    也就是说要执行故障转移有两个条件:第一、大多数的哨兵工作正常;第二、至少法定人数个哨兵一致认为master不可访问)

    其它哨兵选项

    其它的选项大多数都是这样的格式:

    <pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">sentinel <option_name> <master_name> <option_value></pre>

    1、down-after-milliseconds 参数是一个毫秒时间,表示多少毫秒没有回复则认为下线(要么是没有收到ping回复,要么是回复错误)

    2、parallel-syncs 参数表示在一个故障转移后新的master需要配置的slave数量。这个数值越小,故障转移完成的所需的时间越长。如果将从服务器配置为服务旧数据,您可能不希望所有从服务器同时与主服务器重新同步。对于slave来说,复制过程基本上不是阻塞的,但有时它会停止从master装载大量数据。通过将此选项设置为1,可以确保一次只能访问一个slave。

    哨兵部署示例

    image

    参考

    https://redis.io/topics/sentinel

    其它相关

    Redis集群

    相关文章

      网友评论

          本文标题:Redis哨兵

          本文链接:https://www.haomeiwen.com/subject/xiycwftx.html