高可用(一):Redis Sentinel 系统

一、介绍

Redis 通过 Sentinel系统保证自身的高可用性。Sentinel系统是由一个或者多个Sentinel实例组成,如图1和图2所示:它会实现的监视Redis 服务器主机机器及其从机的运行状态,当某个服务器主机被Sentinel系统认为客观下线的时候,Sentienel 系统的是从其可用的从机中选取一个升级为新的主机,下线主机则会成为新主机的从机,重新上线会从新的主机中同步数据。

图1:服务器和sentinel系统

图2:主机服务器下线

二、Sentienl 实例

Sentienl实质也是一个redis的服务器的,但是但不承担数据的读写任务只负责监视起的其他redis服务器。作为sentienl 运行的服务器和普通服务器在启动时加载的指令集也是不一样的,只加载用通信和监视的几个指令(ping, sentinel, subscribe, unsubscribe, psubscribe, punsubscribe, info,其中info 是专有的)。

三、Sentinel 相关源码解析

相关数据结构示意图.png
  1. struct sentinelState
    sentinelState 包含sentinel 运行时的所有状态和监视服务主机状态信息。
struct sentinelState {
    //sentinel 实例ID
    char myid[CONFIG_RUN_ID_SIZE+1]; 
    uint64_t current_epoch;       
    // 所监视redis 服务主机实例及信息
    dict *masters;      
    int tilt;           
    int running_scripts;    
    mstime_t tilt_start_time;      
    mstime_t previous_time;        
    list *scripts_queue;            
    char *announce_ip;  
    int announce_port;  
    unsigned long simfailure_flags; 
    int deny_scripts_reconfig; 
} sentinel;
  1. struct sentinelRedisInstance
    sentinelRedisInstance 表示一个被监视的Redis服务器的状态和相关信息。
typedef struct sentinelRedisInstance {
    //标识主机状态
    int flags;      
    //服务器名
    char *name;
    // 服务器运行实例    
    char *runid;    
    uint64_t config_epoch;
    //服务器地址  
    sentinelAddr *addr; 
    ...
     //其他的sentinel服务器信息
    dict *sentinels;   
     // 服务器从机
    dict *slaves;       
     // 主机客观下线标准
    unsigned int quorum;
    ...
    // 主机主观下线标准
    mstime_t master_link_down_time; 
    ...
   
    
} sentinelRedisInstance;

四、Sentinel如何监视主机服务器

  1. Sentinel 会和每个被监视的Redis服务器创建两个异步网络链接。
    • 命令链接:向服务器发送命令,并接受回复
    • 订阅链接:订阅服务器的 __sentinel__:hello 频道
  2. Sentinel 默认以每10秒一次的频率向被监视服务器,发送INFO指令,服务器收INFO指令后,会返回自身信息和从机信息等。Sentinel 接受之后会解析主机的信息和从机的信息(运行id, ip, port等等),然后更新sentienlRedisInstance中保存的主机信息(name, runid等等)和从机信息(slaves). 保存从机的信息的是一个键为地址(ip:port),值为sentinelRedisInstance字典类型,主机和从机都是通过sentinelRedisInstance保存信息, 通过设置flags 参数(SRI_MASTER,SRI_SLAVE) 可以区分主机和从机。
  3. 获取到从机地址后,Sentinel 也会和从机创建命令链接订阅链接,通过INFO,实时的获取从机信息,并更新保存

五、Sentinel 间如何相互协调

  1. Sentienl 在主从服务器建立好链接,会通过命令链接,订阅服务器的__sentinel__:hello频道
  2. Sentinel 会通过命令链接 以默认2秒一次的频率去向所有被监视的主服务器的__sentinel__:hello频道发送订阅信息。这个订阅信息包含sentinel 自身信息和接收命令的服务器信息(ip, port, id等)。所有订阅__sentinel__:hello的sentinel均可以收到信息。
  3. 通过订阅频道Sentinel之间可以获取对方的信息和其监视主机的信息,然后更新自身保存的服务器主机的信息,也将其他sentinel的信息进行保存。
  4. 通过从订阅频道获取到其他sentinel信息,sentinel之前也会建立命令链接进行通信和协调。

六、故障转移

  1. 主观下线:Sentinel 会以固定频率和和其建立命令链接的redis实例(主机,从机,sentinel)发送PING指令,根据回复判断其是否下线。若其在一定时间内无法进行有效回复,sentinel则认为该实例进入主观下线状态。其实主观下线可以理解某个sentinel基于自己的认知(网络时延,超时设置)对于某个实例是否下线的判断,所以不同的sentinel对于同一的redis实例的主观下线的判断可能时不一致的。
  2. 客观下线:当一个sentinel 认为某个实例主观下线了,他就和其他的sentinel进行沟通(命令链接),看看其他的sentinel 对于这个实例的判断,若一个sentinel 系统超过半数认为这个实例已经下线,则认为这个实例客观下线状态。
  3. 选取领头的Sentinel
    通过Raft 算法sentinel 之间投票选举出来Leader(详情见后文
  4. 故障转移
    • Leader 从下线主机服务器的从机服务器中选出最合适的从机服务器,将其升级为新的主机服务器
    • 让其他从机服务器复制新的主机服务器
    • 让下线的主机服务器成为新的主机服务器的从机,当其重新上线的时候,复制主机服务器。

七、Sentinel Leader选举

1. 规则
  • 每个sentinel 节点都可以成为Leader
  • sentinel 记录着选举回合数,每次选取无论是否成功回合数+1.
  • 每个回合每个sentinel只有一次投票的机会。
2. 方法
  • 每个发现服务器客观下线的sentinel,开始选举的时候,如果没有投票,就会投票给自己,并通过is-master-down-by-addr命令要求其他的sentinel 给自己投票, 其余sentinel收到指令会把自己投票结果返回给该sentinel.
  • 投票是遵守选到先得的原则,sentinel 在没投票的情况下先收到的谁的指令就投给谁票。
  • 每个sentinel 统计获得票数,如果超过半数就自动成为leader, 进行故障转移操作,并不需要通知其他的sentinel, 但他们观察的新的主机产生,自动结束选举。
  • 或没有sentinel 获得过半票数,进行新一轮选举。每个sentinel 开新选举的时间不一(会有固定延时+一个1s以内的随机时间)。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 一.sentinel介绍 1.什么是sentinel? Redis-Sentinel是Redis官方推荐的高可用性...
    唯爱熊阅读 308评论 1 3
  •   当主机宕机后出现故障无法及时恢复,可以在从机执行slave no one命令使其上位变为主机,其他主机会自动跟...
    纸中圆阅读 896评论 0 3
  • Sentinel是Redis的高可用性解决方案,本文主要介绍Sentinel的初始化过程及其与一般Redis服务器...
    wenmingxing阅读 3,091评论 1 5
  • 1.概述 Sentinel(哨岗、哨兵)是Redis高可用性的解决方案:由一个或多个Sentinel实例组成的Se...
    孤尘F阅读 818评论 0 0
  • 前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器。楼主是...
    liangzzz阅读 4,257评论 9 152