• Redis(十)——哨兵模式


    在主从复制的模式中,Sentinel(哨兵,也是一个Redis服务器)对所有主从服务器进行监视,如果主服务器断线挂掉(太长时间),从服务器复制中止,Sentinel系统让某个从服务器上位,成为主服务器,其他从服务器依旧是从服务器,原来的主服务器再次上线时就变成从服务器了,提高Redis的可用性。

    一、启动并初始化Sentinel

    redis-sentinel /path/to/your/sentinel.conf
    redis-server /path/to/your/sentinel.conf --sentinel

    1.初始化服务器

    Sentinel本质上只是一个运行在特殊模式下的Redis服务器,所以启动Sentinel的第一步就是初始化服务器,步骤和普通服务器类似,过程略有不同,不载入AOF或RDB文件。功能上也有所差异,内部指自己,外部指客户端。不能使用键值对命令、事务命令、脚本命令、持久化命令;复制命令只允许内部使用;发布与订阅命令中publish只能内部使用等

    2.使用Sentinel专用代码,与普通服务器有差别,例如端口号是26379

    3.初始化Sentinel状态,保存在结构体sentinelState里,保存服务器所有和Sentinel功能有关的状态

    4.初始化Sentinel状态的masters属性

    5.创建连向主服务器的网络连接,有两个,命令连接和订阅连接。因为发布与订阅功能中,发送的信息不会保存在redis服务器里,万一客户端掉线,则丢失信息,所以另开一个连接专门接收该频道消息。异步连接。

    二、获取主服务器信息

    Sentinel默认以十秒一次的频率向监视的主服务器发送INFO命令,主服务器的回复中蕴含了运行ID,从服务器的套接字。

    三、获取从服务器信息

    通过向主服务器发送INFO命令发现从服务器后,对那些从服务器创建命令和订阅连接,并默认以十秒一次的频率向从服务器发送INFO命令,得到回复后提取这些信息:运行ID、角色role、主服务器套接字、主从连接状态master_link_status、优先级、复制偏移量。(这些信息和操作在后续选新主服务器时用上)

    四、Sentinel默认以每两秒一次向主从服务器发送信息,包含自己和对方的 套接字、运行ID、当前配置纪元。

    五、接收主从服务器的频道信息

    通过订阅连接接收,发现其他监视该服务器的Sentinel并记录,并与其他Sentinel建立命令连接,但不建立订阅连接。

    六、主观下线

    Sentinel默认每秒一次向所监视的主从服务器发送ping命令,如果在一定时间(主观下线时常,down-after-milliseconds毫秒)内,连续得到无效回复,则该Sentinel修改该实例所对应的实例结构,主观认为该实例挂了。

    主观下线时常作用于:监视的主服务器及该服务器下的从服务器、同样监视该主服务器的Sentinel。不同的Sentinel根据各自的主观下线时常判断。

    #监视主服务器,自动发现从服务器和其他Sentinel,后面的2表示两个Sentinel认为主观下线就 判定为客观下线
    sentinel monitor master 127.0.0.1 6379 2  
    #设置主观下线时常50000毫秒
    senetinel down-after-milliseconds master 50000 

    七、客观下线

    当一个主服务器被所有监视它的Sentinel都认为主观下线,就判定为客观下线,这些Sentinel里选一个领头羊对下线服务器进行故障转移。选领头羊Sentinel规则如下:

    • 所有Sentinel都有机会,得票超过半数的被选上;
    • 设定客观下线的Sentinel(源)对其他Sentinel(目标)发送命令,要目标把自己设为局部领头羊,局部领头羊先到先得,后续的拒绝,每次选举只能设一次,目标Sentinel对源Sentinel回复命令包含了【局部领头羊运行ID和配置纪元】;
    • 如果没有Sentinel得票超过半数,一直选举,每次选举配置纪元都会自增1; 

    八、故障转移

    领头Sentinel在已下线的主服务器的从服务器里选一个当主服务器,已下线的主服务器再上线会变成从服务器。

    1.选主服务器

    • 要在线;
    • 最近5秒内回复过领头Sentinel的INFO命令;
    • 与主服务器连接断开时间不长(不超过down-after-milliseconds*10毫秒);
    • 通过上述三点第一维度根据优先级高的排序,第二维度根据复制偏移量大的排序,第三维度根据运行ID小的排序;

    2.修改从服务器

    领头Sentinel让从服务器去复制新老大

    3.旧主服务器重新上线后变从服务器

    领头Sentinel改实例结构,对其发送slaveof命令


     参考&引用

    《redis设计与实现》

  • 相关阅读:
    简介.Net对象序列化.txt
    如何在Web页面退出前提示用户保存数据?
    如何将图片存储到数据库中
    页面回车键响应,onkeydown事件
    用C#创建Windows服务(Windows Services)
    解决“Visual Studio 要求设计器使用文件中的第一个类。移动类代码使之成为文件中的第一个类,然后尝试重新加载设计器。”方法
    动态创建htm元素并添加到document中
    如何在Asp.net的Header中添加/title/Meta tages/CSS
    无法打开项目文件,“d:\web\webapp.csproj”,此安装不支持该项目类型
    用Intelligencia.UrlRewriter实现URL重写
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/13929610.html
Copyright © 2020-2023  润新知