美文网首页
Redis哨兵架构

Redis哨兵架构

作者: 逍遥白亦 | 来源:发表于2020-11-25 23:15 被阅读0次

    Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

    1. 启动并初始化Sentinel

    启动一个Sentinel可以使用命令:

    redis-sentinel /path/to/your/sentinel.comf
    

    或者命令:

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

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

    • 初始化服务器。
    • 将普通Redis服务器使用的代码替换成Sentinel专用代码。
    • 初始化Sentinel状态。
    • 根据给定的配置文件,初始化Sentinel的监视主服务器列表
    • 创建连向主服务器的网络连接。

    1.1 初始化服务器

    初始化Sentinel本质上也是一个Redis服务,但是Sentinel模式功能与普通Redis服务功能不同。


    image

    1.2 使用Sentinel专用代码

    与普通Redis服务器的端口号以及服务器命令表不同。

    1.3 初始化Sentinel状态

    初始化一个sentinel.c/sentinelState结构。

    struct sentinelState {
    
        // 当前纪元
        uint64_t current_epoch;     /* Current epoch. */
    
        // 保存了所有被这个 sentinel 监视的主服务器
        // 字典的键是主服务器的名字
        // 字典的值则是一个指向 sentinelRedisInstance 结构的指针
        dict *masters;      /* Dictionary of master sentinelRedisInstances.
                               Key is the instance name, value is the
                               sentinelRedisInstance structure pointer. */
    
        // 是否进入了 TILT 模式?
        int tilt;           /* Are we in TILT mode? */
    
        // 目前正在执行的脚本的数量
        int running_scripts;    /* Number of scripts in execution right now. */
    
        // 进入 TILT 模式的时间
        mstime_t tilt_start_time;   /* When TITL started. */
    
        // 最后一次执行时间处理器的时间
        mstime_t previous_time;     /* Last time we ran the time handler. */
    
        // 一个 FIFO 队列,包含了所有需要执行的用户脚本
        list *scripts_queue;    /* Queue of user scripts to execute. */
    
    } sentinel;
    

    1.4 初始化Sentinel状态的masters属性

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

    • 字典的键是被监视主服务器的名字。
    • 而字典的值则是被监视主服务器对应的sentinel.c/sentinelRedisInstance结构。

    1.5 创建连向主服务器的网络连接

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

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

    • 一个是命令连接,这个连接专门用于向主服务器发送命令,并接收命令回复。
    • 另一个是订阅连接,这个连接专门用于订阅主服务器的sentine1∶hello频道。

    2. 获取主服务器信息

    Sentinel 默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送 INFO命令,并通过分析 INFO命令的回复来获取主服务器的当前信息。

    通过分析主服务器返回的INFO命令回复,Sentinel可以获取以下两方面的信息:

    • 一方面是关于主服务器本身的信息,包括run_id域记录的服务器运行 ID,以及role 域记录的服务器角色;
    • 另一方面是关于主服务器属下所有从服务器的信息,每个从服务器都由一个"slave"字符串开头的行记录,每行的 ip=域记录了从服务器的IP地址,而port=域则记录了从服务器的端口号。根据这些IP地址和端口号,Sentinel无须用户提供从服务器的地址信息,就可以自动发现从服务器。

    3. 获取从服务器信息

    当 Sentinel发现主服务器有新的从服务器出现时,Sentinel除了会为这个新的从服务器创建相应的实例结构之外,Sentinel还会创建连接到从服务器的命令连接和订阅连接。

    4. 向主服务器和从服务器发送信息

    在默认情况下,Sentinel会以每两秒一次的频率,通过命令连接向所有被监视的主服务器和从服务器发送信息,包括Sentinel的IP地址、端口号、运行ID以及主服务器的名字、IP地址和端口号。

    5. 接收来自主服务器和从服务器的频道信息

    接收信息主要做以下两件事:

    • 更新sentinels字典中的主、从服务器信息以及实例。
    • 创建连向其他Sentinel的命令连接

    6. 检测主观下线状态

    在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他 Sentinel在内)发送PING命令,并通过实例返回的 PING命令回复来判断实例是否在线。

    7. 检查客观下线状态

    当Sentinel将一个主服务器判断为主观下线之后,为了确认这个主服务器是否真的下线了,它会向同样监视这一主服务器的其他Sentinel进行询问,看它们是否也认为主服务器已经进入了下线状态(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel那里接收到足够数量的已下线判断之后,Sentinel就会将从服务器判定为客观下线,并对主服务器执行故障转移操作。

    8. 选举领头Sentinel

    当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel 会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。

    9. 故障转移

    在选举产生出领头Sentinel之后,领头 Sentinel将对已下线的主服务器执行故障转移操作,该操作包含以下三个步骤∶

    • 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。
    • 让已下线主服务器属下的所有从服务器改为复制新的主服务器。
    • 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。

    相关文章

      网友评论

          本文标题:Redis哨兵架构

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