暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

redis高可用方案之Sentinel(哨兵)

小璇坨坨 2019-07-05
272

 Redis Cluster Sentinel 工作原理



Sentinel(哨兵)是Redis的高可用性(high availability)解决方案:


由一个或多个Sentinel实例组成的sentinel系统可以监视任何多个主服务器以及这些主服务器下的从服务器,并在被监视的主服务器下线状态时,自动将下线主服务器下的某个从服务器升级为主服务器,然后由新的主服务器代替已下线的主服务器处理命令请求。



以下用双环图表示:


图1  服务器与Sentinel系统


图2 主服务器下线


图3 故障转移

图4 原理的主服务器降级为从服务器



接下来对Sentinel原理进行详细的说明


一、启动初始化Sentinel

    redis-sentinel path/sentinel.conf
    命令效果一样
    redis-server path/sentinel.conf --sentinel


    当一个Sentinel启动的时候,它需要执行以下步骤:

    1、初始化服务器

    Sentinel本质上是一个运行在特殊模式下的redis服务器,不同的是启动过程中,普通redis服务器初始化时会加载RDB文件或AOF文件来还原数据库状态,而Sentinel不会加载文件。


    2、将普通redis使用的代码替换成Sentinel专用代码

    由于代码的替换,sentinel肯定不能跟普通的redis执行的操作一致,也就是说限制了sentinel执行命令,其实是未加载。所以sentinel不能执行SET,DBSIZE,EVALD等命令,只有7个命令可以执行:PING,SENTINEL, INFO,SUBSCRIBE,UNSUBSCRIBE,PSUBSCRIBE.


    3、初始化Sentinel状态


    4、根据指定的配置文件,初始化Sentinel的监视主服务器列表

    Sentinel状态中的masters字典记录了所有被sentinel监视的主服务器的相关信息,其中:

    • - 字典的键是被监视的主服务器的名字

    • - 字典的值是被监视的主服务器对应的RedisInstrance结构,这个结构可以包含redis的master,slave,或者一个sentinel



    实例的属性非常多,图示:



    5、创建联向主服务器的网络连接

    初始化最后一步:创建连向被监视主服务器的网络连接,Sentinel将成为主服务器的客户端,它可以向主服务器发送命令,并从回复命令中获取信息

    对于每个被监视的主服务器来说,sentinel会创建两个连向主服务器的异步网络连接:

    • - 一个是命令连接,专门发送命令并接受命令

    • - 一个是订阅连接,用于订阅主服务器的__sentinel__:hello频道。


    为什么是两个连接?


    redis目前的发布订阅功能中,被发送的信息不回保存在redis服务器里,如果信息发送时,客户端不在线或断线,那么客户端就会丢失这条信息。因此sentinel必须用一个订阅连接来接受该频道信息

    另一方面,除了订阅频道外,sentinel必须向主服务器发送命令,进行通信,所以sentinel必须创建命令连接

    因为sentinel需要与多个实例创建多个网络连接,所以sentinel使用的异步连接


    小结

    • - redis是运行在特殊模式下redis服务器,它使用了与普通模式下不同的命令表,所有sentinel模式能够使用的命令与普通redis服务器能够使用的命令不同。

    • - Sentinel会读入用户指定的配置,为每个要被监视的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,订阅连接则会接受指定频道的信息。

    • - Sentinel通过向主服务器发送INFO命令来获得主服务器下所有从服务器的地址信息,并未这些从服务器创建相应的实例结构,以及连向这些从服务器的命令连接和订阅连接。

    • - 在一般情况下,sentinel以每10s一次的频率想被监视的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者sentinel正在对主服务器进行故障转移操作时,sentinel会向从服务器发送INFO命令的频率为1s一次。

    • - 对于监视同一个主服务器和从服务器对的多个sentinel来说,他们会以每2s的频率,通过向被监视的服务器的__sentinel__:hello频道发送消息来向其他sentinel宣告自己的存在。

    • - 每个sentinel也会从__sentinel__:hello频道中接受其他sentinel发来的消息,并根据这些消息为其他的sentinel创建相应的实例结构。以及命令连接。

    • - sentinel只会与主服务器和从服务器创建命令连接和订阅连接,sentinel与sentinel之间则只创建命令连接

    • - sentinel以每秒一次的频率想实例(master,slave,其他sentinel)发送PING命令,并根据实例对PING命令的回复来判断实例是否在线,当一个实例在指定的时长中连续向sentinel发送无效回复时,sentinel会将这个实例判断为主观下线。

    • - 当sentinel将一个主服务器判断为主观下线时,他会向同样监视这个主服务器的其他sentinel进行询问,看他们是否同意这个主服务器已经进入主观下线状态。

    • - 当sentinel收集到足够多的主观下线投票之后,它会将主服务器判断为客观下线,并发起一次针对主服务器的故障转移操。

    • sentinel系统选举领头sentinel的方式是对Raft算法的领头选举方法的实现。






    欢迎长按下图关注公众号小璇坨坨

    十年积累倾囊相授



    文章转载自小璇坨坨,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论