Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)

一、获取主服务器信息

  • Sentinel默认会以每十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息
  • 举个例子,假设如下图所示,主服务器master有三个从服务器slave0、slave1和 slave2,并且一个Sentinel正在连接主服务器,那么Sentinel将持续地向主服务器发送INFO命令,并获得类似于第2张图所以内容的回复:

Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)_第1张图片

Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)_第2张图片

INFO命令回复的信息内容:

  • 通过分析主服务器返回的INFO命令回复,Sentinel可以获取以下两方面的信息:
    • 一方面是关于主服务器本身的信息,包括run_id域记录的服务器运行ID,以及role域记录的服务器角色
    • 另一方面是关于主服务器属下所有从服务器的信息,每个从服务器都由一个"slave"字符 串开头的行记录,每行的ip=域记录了从服务器的IP地址,而port=域则记录了从服务器的端 口号。根据这些IP地址和端口号,Sentinel无须用户提供从服务器的地址信息,就可以自动发现从服务器
  • 根据run_id域和role域记录的信息,Sentinel将对主服务器的实例结构进行更新例如, 主服务器重启之后,它的运行ID就会和实例结构之前保存的运行ID不同,Sentinel检测到这 一情况之后,就会对实例结构的运行ID进行更新

主服务器的slaves属性(struct sentinelRedisIInstance.slaves)

  • 至于主服务器返回的从服务器信息,则会被用于更新主服务器实例结构的slaves字典, 这个字典记录了主服务器属下从服务器的名单:
    • 字典的键是由Sentinel自动设置的从服务器名字,格式为ip:port:如对于IP地址为 127.0.0.1,端口号为11111的从服务器来说,Sentinel为它设置的名字就是127.0.0.1:11111
    • 至于字典的值则是从服务器对应的实例结构:比如说,如果键是127.0.0.1:11111,那么 这个键的值就是IP地址为127.0.0.1,端口号为11111的从服务器的实例结构
  • Sentinel在分析INFO命令中包含的从服务器信息时,会检查从服务器对应的实例结构是否已经存在于slaves字典:
    • 如果从服务器对应的实例结构已经存在,那么Sentinel对从服务器的实例结构进行更新
    • 如果从服务器对应的实例结构不存在,那么说明这个从服务器是新发现的从服务器, Sentinel会在slaves字典中为这个从服务器新创建一个实例结构
  • 对于我们之前列举的主服务器master和三个从服务器slave0、slave1和slave2的例子来说,Sentinel将分别为三个从服务器创建它们各自的实例结构,并将这些结构保存到主服务器实例结构的slaves字典里面,如下图所示:

Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)_第3张图片

  • 注意对比图中主服务器实例结构和从服务器实例结构之间的区别:
    • 主服务器实例结构的flags属性的值为SRI_MASTER,而从服务器实例结构的flags属性的 值为SRI_SLAVE。
    • 主服务器实例结构的name属性的值是用户使用Sentinel配置文件设置的,而从服务器实 例结构的name属性的值则是Sentinel根据从服务器的IP地址和端口号自动设置的

二、获取从服务器信息

  • 当Sentinel发现主服务器有新的从服务器出现时,Sentinel除了会为这个新的从服务器创建相应的实例结构之外,Sentinel还会创建连接到从服务器的命令连接和订阅连接
  • 举个例子,对于上面那张图所示的主从服务器关系来说,Sentinel将对slave0、slave1和 slave2三个从服务器分别创建命令连接和订阅连接,如下图所示:

Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)_第4张图片

  • 在创建命令连接之后,Sentinel在默认情况下,会以每十秒一次的频率通过命令连接向从服务器发送INFO命令,并获得类似于以下内容的回复:

Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)_第5张图片

  • 根据INFO命令的回复,Sentinel会提取出以下信息:
    • 从服务器的运行ID run_id
    • 从服务器的角色role
    • 主服务器的IP地址master_host,以及主服务器的端口号master_port
    • 主从服务器的连接状态master_link_status
    • 从服务器的优先级slave_priority
    • 从服务器的复制偏移量slave_repl_offset
  • 根据这些信息,Sentinel会对从服务器的实例结构进行更新,下图展示了Sentinel根据 上面的INFO命令回复对从服务器的实例结构进行更新之后,实例结构的样子:

Redis(设计与实现):43---Sentinel之获取主服务器/从服务器信息(INFO命令、slaves属性)_第6张图片

你可能感兴趣的:(Redis(设计与实现))