sentinel

sentinel的概述

  • 1.是解决redis高可用的方案:由一个或多个sentinel实例组成的sentinel系统
    1. 可以监视任意多个主服务器以及这些主服务器属下的所有从服务器。
  • 3.可以在被监视的主服务器下线时候,自动将下线主服务器属下的某个从服务器升级为新的主服务器


    image.png
如何进行故障转移

当server1下线时长超过用户设定的下线时长上限,sentinel系统就会对server1进行故障转移

  • 1.首先从slaves里面挑选一个升级为主服务器
  • 2.sentinel系统会向server1属下的所有从服务器发送新的复制指令,让他们成为新的服务器从服务器,当所有从服务器都开始复制新的主服务器时候,故障转移操作执行完毕
    1. sentinel 还会继续监视已下线的server1,在他从新上线(上线后只能变为从服务器)


      image.png
启动Sentinel
  • 命令redis-sentinel /path/to/your/sentinel.conf或者命令redis-server /path/to/your/sentinel.conf --sentinel。这两个命令都可以启动sentinel
初始化Sentinel
  • 1.初始化服务器
  • 2.将普通redis服务器使用的代码替换成sentinel专用代码
  • 3.初始化sentinel状态
  • 4.根据给定的配置文件,初始化sentinel的监视主服务器列表
  • 5.创建连向主服务器的网络连接
初始化服务器
  • 首先sentinel本质上是一个运行在特殊模式下的redis服务器
  • sentinel模式下的redis服务器主要功能如下:


    image.png
使用sentinel专用代码
  • 1.使用redis.h/REDIS_SERVERPORT的常量值作为服务器端口
  • 2.使用redis.c/redisCommandTable作为服务器的命令表
初始化sentinel状态
  • 1.在使用sentinel专用代码后,接下来服务器会初始化一个sentinel.c/sentinelState结构。
  • 2.sentinelState保存了服务器中所有和sentinel有关的状态


    image.png
初始化sentinel状态的master属性

sentinel状态中的masters字典记录了所有被sentinel监控的主服务器相关属性

  • 1.其key是被监视服务器的名字
  • 2.而字典的值则是被监视主服务器对应的sentinel.c/sentinelRedisInstance结构。
  • 3.一个sentinelRedisInstance代表一个呗sentinel监视的redis服务器实例,该实例可能是主服务器,从服务器或者另外一个sentinel


    image.png
  • 4.addr属性保存着ip和port


    image.png
  • 5.对sentinel状态的初始化将引发对masters字典的初始化,而对masters字典的初始化是根据被载入的sentinel配置文件来进行的,具体如下:


    image.png
  • 6.具体的数据结构如下


    image.png
image.png
创建连向主服务器的网络连接
  • 1.sentinel将成为主服务器的客户端
  • 2.对于每个被sentinel监视的主服务器来说,sentinel唬创建两个连向主服务器的异步网络连接
  • 3.一个是命令连接,这个专门用于向主服务器发送命令并接受命令回复
  • 4.一个是订阅连接,这个连接是专门用于订阅主服务器的sentinel:hello频道
  • 5.采用两个连接是因为万一客户端不在线后者断线 那么客户端就会丢失这条信息,采用订阅消息可以不丢失。


    image.png

获取主服务器信息

image.png
  • 1.sentinel默认每十秒一次通过命令连接向被监视的主服务器发送INFO命令。


    image.png
  • 2.sentinel通过解析INFO命令返回可以得到该主服务器自身的关键信息,run_id,以及role域

  • 3.根据得到该主服务器的从服务器的相关信息

  • 4.sentinel根据检测到的主服务器id不同 会更新实例结构(sentinel持有这个结构)

  • 5.至于从服务器会被用于更新主服务器实例结构(sentinel持有这个结构)的slaves字典,字典的键是sentinel设置以ip:port形式,值则对应服务器的实例结构


    image.png
  • 6.主服务器和从服务器的在sentinel中的实例结构的区别是1.主服务器的flags的属性值为SRI_MASTER,而从服务器的属性为SRI_SLAVE。2.主服务器实例结构的name属性是用于使用sentinel文件设置的而从服务器的实例结构的name属性则是根据ip+port设置的

获取从服务器信息
  • 1.sentinel除了会为新的从服务器建立相应的实例结构之外。还会建立到从服务器的命令连接和订阅连接。
    1. 命令连接info到从服务器的指令回复如下:


      image.png
  • 3.根据上述回复进行更新
向主从服务器发送信息
  • 1.默认以2秒一次向所有被监视的主服务器
  • 2.命令是发往订阅连接,具体如下图:


    image.png
image.png
接受来自主从服务器的频道信息
  • 1.所以我们会发送订阅消息也会接受订阅消息
  • 2.多个sentinel监视一个服务器,当有sentinel发送命令,其他sentinel(自己本身也会接收到)会接收到这个消息
  • 3.接受到信息的sentinel会更新其他sentinel对该sentinel和其监视服务器的认知


    image.png
  • 4.接收到信息的sentinel 会对sentinel运行id进行判断如果与自己一致,说明是自己发送的直接抛弃
  • 5.否则sentinel将对信息中的各个参数和主服务器的实例结构进行更新
  • 6.在sentinel给主服务器创建的实例结构中的sentinels字典除了保持自身之外,还保存了其他监视该主服务器的资料
  • 7.sentinels字典的key就是sentinel的ip+port,value就是sentinel的实例结构(也就是sentinelRedisInstances)


    image.png
创建连向其他sentinel的命令连接
  • 当sentinel发现一个其他sentinel(即都监控同一个sentinel)不仅会在该sentinel内部会创建一个对应的实例,还会创建一个连向该sentinel的命令连接


    image.png
  • sentinel之间不会创建订阅连接,因为sentinel需要从主服务器获取其他监视的sentinel才创建的订阅频道
检测主观下线
  • 1.默认情况下sentinel会以每秒一次的频率向所有与他创建了命令连接发送PING命令。包括主从和sentinel


    image.png
  • 2.有效回复包括:+PONG,-LOADING,-MASTERDOWN,除了这三个回复都不是有效回复
  • 3.down-after-milliseconds选项指定了sentinel判断实例进入主观下线所需要的时间长度,如果一个实例在指定毫秒内连续返回无效回复,那么sentinel会修改这个实例所对应的实例结构,在结构的flags属性中打开SRI_S_DOWN标识,以此来表示实例进入主观下线状态。
  • 4.down-after-milliseconds 不仅仅是用来标识master下线,其从服务器和其他监控这个sentinel的时长也是采用这个down-after-milliseconds
  • 5.会存在两个sentinel加载不同的down-after-milliseconds 导致主观下线标准不同
检测客户下线状态
  • 1.当sentinel判断为主观下线后,该sentinel会收集其他监控该实例的sentinel的是否下线信息。
  • 2.当收集的数量超过一定的阈值之后 sentinel就会将从服务器切换为主服务器。
  • 3.sentinel使用SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <run_id>询问其他sentinel是否同意主服务器是否已经下线


    image.png
  • 4.当接收到该命令的sentinel 会根据传递的参数去寻找对应的实例信息并返回给请求者


    image.png
  • 5.当sentinel收集到主观下线数量(可以通过quorum参数配置)超过一定的数量后该sentinel会打开实例结构SRI_O_DOWN标识,标识已经进入主观下线


    image.png
  • 6.同理不同的sentinel判断客户下线的标准不同
选举领头Sentinel

当一个主服务器下线时候,监视这个下线主服务器的各个sentinel会进行协商,选举出一个领头sentinel,并由领头sentinel对下线主服务器进行故障转移


image.png
故障转移

选出新的服务器

  • 选择一个状态好,数据完整的从服务器,然后像这个从服务器发送SLAVEOF no one 将其转换为主服务器


    image.png

    image.png

修改从服务器的复制目标

  • 领头sentinel,让剩余的从服务器去赋值新的服务器,通过SLAVEOF命令


    image.png

将已经下线的主服务器设置为新的主服务器的从服务器,当其从新上线就是从服务器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 1.概述 Sentinel(哨岗、哨兵)是Redis高可用性的解决方案:由一个或多个Sentinel实例组成的Se...
    孤尘F阅读 818评论 0 0
  • Sentinel是Redis的高可用性解决方案,本文主要介绍Sentinel的初始化过程及其与一般Redis服务器...
    wenmingxing阅读 3,089评论 1 5
  • [toc]Sentinel是Redis的高可用解决方案,由一个或多个Sentinel实例组成的Sentinel系统...
    涵仔睡觉阅读 258评论 0 0
  • Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progre...
    你是妖怪吧阅读 897评论 0 0
  • Redis 的 sentinel模式 启动并初始化Sentinel 初始化服务器 将普通reids服务器使用的代码...
    有何不可12317阅读 406评论 0 0