范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Redis哨兵机制原理浅析

  一、前言
  上一篇文章Redis主从复制原理中简要地说明了主从复制的一个基本原理,包含全量复制、复制积压缓冲区与增量复制等内容,有兴趣的同学可以先看下。
  利用主从复制,可以实现读写分离、数据备份等功能。但如果主库宕机后,需要运维人员手动地将一个从库提升为新主库,并将其他从库slaveof新主库,以此来实现故障恢复。
  因此,   主从模式的一个缺点,就在于无法实现自动化地故障恢复   。Redis后来引入了哨兵机制,哨兵机制大大提升了系统的高可用性。  二、什么是哨兵
  哨兵,就是站岗放哨的,时刻监控周围的一举一动,在第一时间发现敌情并发出及时的警报。
  Redis中的哨兵(Sentinel),   则是一个特殊的Redis实例   ,不过它并不存储数据。也就是说,哨兵在启动时,不会去加载RDB文件。
  关于Redis的持久化,可以参考我的另外一篇文章 谈谈Redis的持久化——AOF日志与RDB快照
  上图就是一个典型的哨兵架构,由数据节点与哨兵节点构成,通常会部署多个哨兵节点。
  哨兵主要具有三个作用,   监控、选主与通知   。
  监控:哨兵会利用心跳机制,周期性不断地检测主库与从库的存活性
  选主:哨兵检测到主库宕机后,选择一个从库将之切换为新主库
  通知:哨兵会将新主库的地址通知到所有从库,使得所有从库与旧主库slaveof新主库,也会将新主库的地址通知到客户端上
  我会在下文详细讲一下监控与选主的过程  三、监控
  哨兵系统是通过3个定时任务,来完成对主库、从库与哨兵之间的探活。  哨兵如何拿到从库地址
  首先我们会在配置文件中配置主库地址,这样哨兵在启动后,会以   每隔10秒   的频率向主库发送info命令,从而获得当前的主从拓扑关系,这样就拿到了所有从库的地址。  哨兵如何感知到其他哨兵的存在
  接着   每隔2秒   ,会使用pub/sub(发布订阅)机制,在主库上的_sentinel_:hello的频道上发布消息,消息内容包括哨兵自己的ip、port、runid与主库的配置。
  每个哨兵都会订阅该频道,在该频道上发布与消费消息,从而实现哨兵之间的互相感知。  哨兵是如何实现对节点的监控
  利用启动配置与info命令可以获取到主从库地址,利用发布订阅可以感知到其余的哨兵节点。
  在此基础上,哨兵会   每隔1秒   向主库、从库与其他哨兵节点发送PING命令,因此来进行互相探活。  主观下线与客观下线
  当某个哨兵在   down-after-milliseconds(默认是30秒)   配置的连续时间内,仍然没有收到主库的正确响应,则当前哨兵会认为主库   主观下线   ,并将其标记为sdown(subjective down)
  为了避免当前哨兵对主库的误判,因此这个时候还需要参考其他哨兵的意见。
  接着当前哨兵会向其他哨兵发送   sentinel is-master-down-by-addr   命令, 如果有半数以上(由quorum参数决定)的哨兵认为主库确实处于主观下线状态,则当前哨兵认为主库客观下线 ,标记为odown(objective down)  四、选主
  一旦某个主库被认定为客观下线时,这个时候需要进行哨兵选举,选举出一个领导者哨兵,来完成主从切换的过程。  哨兵选举
  哨兵A在向其他哨兵发送   sentinel is-master-down-by-addr   命令时,同时要求其他哨兵同意将其设置为Leader,也就是想获得其他哨兵的投票。
  在每一轮选举中,每个哨兵仅有一票。投票遵循先来先到的原则,如果某个哨兵没有投给别人,就会投给哨兵A。
  首先获得半数以上投票的哨兵,将被选举称为Leader。
  这里的哨兵选举,采用的是Raft算法。这里不对Raft做详细的探讨,有兴趣的同学,可以参考我的另外一篇文章 22张图,带你入门分布式一致性算法Raft
  该文章采用大量的图例,相信你可以从中学习到全新的知识,从而打开分布式一致性算法的大门,大伙们记得等我搞完Paxos与Zab。
  过半投票机制也常用于很多算法中,例如RedLock,在半数以上的节点上加锁成功,才代表申请到了分布式锁,具体可参考这篇文章的最后 我用了上万字,走了一遍Redis实现分布式锁的坎坷之路,从单机到主从再到多实例,原来会发生这么多的问题
  在Zookeeper选举中,同样也用到了过半投票机制,在这篇文章中 面试官:能给我画个Zookeeper选举的图吗? 我从源码角度分析了Zookeeper选举的过程。  故障恢复
  在选举到领导者哨兵后,将由该哨兵完成故障恢复工作。
  故障恢复分为以下两步:  首先需要在各个从库中,选出一个健康的且数据最新的从库出来。  将该从库提升为新主库,即执行slaveof no one,其他从节点slaveof新主库。
  详细说一下第一步,挑选是有条件的。首先要过滤出不健康的节点,再按某种规则排序,最后取第一个从库,我们直接从源码入手:  sentinelRedisInstance *sentinelSelectSlave(sentinelRedisInstance *master) {     sentinelRedisInstance **instance =         zmalloc(sizeof(instance[0])*dictSize(master->slaves));     sentinelRedisInstance *selected = NULL;     int instances = 0;     mstime_t max_master_down_time = 0;      if (master->flags & SRI_S_DOWN)         max_master_down_time += mstime() - master->s_down_since_time;     max_master_down_time += master->down_after_period * 10;      di = dictGetIterator(master->slaves);     while((de = dictNext(di)) != NULL) {         sentinelRedisInstance *slave = dictGetVal(de);         mstime_t info_validity_time;         //处于主观下线与客观下线的状态         if (slave->flags & (SRI_S_DOWN|SRI_O_DOWN)) continue;         //断开连接         if (slave->link->disconnected) continue;         //5秒内没有回应哨兵的ping命令         if (mstime() - slave->link->last_avail_time > SENTINEL_PING_PERIOD*5) continue;         //优先级为0         if (slave->slave_priority == 0) continue;         //没在3秒或5秒(依据主库状态)内完成对info命令的回应         if (mstime() - slave->info_refresh > info_validity_time) continue;         //与主库的断开时间,超过max_master_down_time         if (slave->master_link_down_time > max_master_down_time) continue;         //健康的节点加入到instance数组中         instance[instances++] = slave;     }     //按照某种规则进行快速排序     qsort(instance,instances,sizeof(sentinelRedisInstance*),compareSlavesForPromotion);     //选取第一个     selected = instance[0];     return selected; }  int compareSlavesForPromotion(const void *a, const void *b) {     sentinelRedisInstance **sa = (sentinelRedisInstance **)a,                           **sb = (sentinelRedisInstance **)b;     char *sa_runid, *sb_runid;     //首先比较优先级,谁的优先级越小(除了0),就选谁     if ((*sa)->slave_priority != (*sb)->slave_priority)         return (*sa)->slave_priority - (*sb)->slave_priority;     //当优先级一样时,比较复制偏移量。谁的偏移量大,就选谁     if ((*sa)->slave_repl_offset > (*sb)->slave_repl_offset) {         return -1; /* a < b */     } else if ((*sa)->slave_repl_offset < (*sb)->slave_repl_offset) {         return 1; /* a > b */     }     //优先级与复制偏移量一致时,比较runid     sa_runid = (*sa)->runid;     sb_runid = (*sb)->runid;     //低版本的Redis,在info命令中不存在runid,因此可能为null     //为null的runid,认为它比任何runid都大     if (sa_runid == NULL && sb_runid == NULL) return 0;     else if (sa_runid == NULL) return 1;  /* a > b */     else if (sb_runid == NULL) return -1; /* a < b */     //按照字母顺序排序,谁靠前,则选谁     return strcasecmp(sa_runid, sb_runid); }
  因此,以下从库会被过滤出:  主观下线、客观下线或断线  没在5秒内完成对哨兵ping命令的回应  priority=0  没在3秒或5秒内(由主库状态决定)内完成对info命令的回应  与主库的断开时间,超过max_master_down_time
  剩下的节点,就是健康的节点,此时再执行一次快速排序,排序的规则如下:  比较优先级(priority),谁的优先级越小(除了0),就选谁  比较复制偏移量。谁的偏移量大,就选谁  比较runid,按照字母顺序排序。谁靠前,则选谁  五、总结
  本文算是Redis哨兵的一个入门文章,主要讲了哨兵的作用,例如监控、选主和通知。
  在Redis读写分离的情况下,使用哨兵可以很轻松地做到故障恢复,提升了整体的可用性。
  但哨兵无法解决Redis单机写的瓶颈,这就需要引入集群模式,相应的文章也被列为明年的写作计划中。

法国宣布投资8亿欧元发展机器人产业新华社巴黎10月25日电(记者徐永春)法国总统马克龙25日说,法国将投资8亿欧元发展机器人产业,旨在通过尖端科技助力法国实现再工业化。马克龙当天视察位于法国圣艾蒂安市的一家智能机器做拼多多无货源店群不要进坑无货源店群便是收集上架,有人拍单发个货就好了,但无货源真的好做吗?这两年的拼多多无货源的确是很火,处处能看到一些诱人标题我靠拼多多,20家店铺一月净赚10000元!我30岁,做拼多300748金力永磁300748金力永磁关键点位支撑位33。6压力位40。5基本面公司是全球领先的风电领域稀土永磁材料(磁钢)供应商,同时也是比亚迪联合汽车电子有限公司等新能源汽车驱动电机的磁钢供应商苹果推送watchOS更新,体能训练期间可开启摔倒检测别忘了,今天的苹果全家桶更新还有watchOS。watchOS8。1为AppleWatchSeries4及后续机型增强了体能训练期间摔倒检测的算法,并新增了仅在体能训练期间启用摔倒币圈那些事加密货币基金上周资金流入量达到创纪录的14。7亿美元金色财经报道,CoinShares周一的一份报告显示,在加密货币上涨和首只比特币期货ETF推出的推动下,投资者上周向数字资产投资说一说英特尔的主板分类H410系列H410主板出现的原因主要是因为入门款CPU那里出现了赛扬G5905,所以必须得跟着出一些主板的推荐。其实G5905这种处理器对主板要求偏低,基本上是个H410都能跑满DDR5太贵,12代CPU配阿斯加特女武神DDR4灯条怎么样?临近双11,显卡离谱依然,内存条标准已经从DDR4更新到DDR5标准。不管你用不用得上,抢先入手的DDR5的朋友必定多金,MSI前几天已经宣布DDR5套件起始价格将远超DDR4,目Macbookpro14是否值得采购最近,头条上关于MBP14或16这台电脑的内容可谓多如牛毛!各种评测的都有,说好的,说坏的都有,你说MBP14的配置强么?强!!虽然真机我也还没见过,但性能上大家从这么多的评测视频特斯拉市值破万亿美元,马斯克身价近3000亿美元稳坐全球首富来源网络编辑小咸鱼好困新智元导读周一收盘,特斯拉股价大涨12。66,报1024。86美元,特斯拉市值首次突破1万亿美元,特斯拉股价年内已累涨超40。什么?一周前还是2300亿美元身报告人工智能行业人才需求翻番来源北京日报人工智能行业人才需求翻番本报讯(记者孙奇茹)随着数字经济和实体经济加速融合发展,作为数字经济重要技术模块的人工智能价值不断凸显。拉勾招聘数据研究院昨天发布2021人工智亚马逊上调工资会令投资者付出多少成本?要点亚马逊提高了新员工和现有员工的工资和福利。成本很高,但在劳动力短缺的情况下,亚马逊正在争夺人才。从长远来看,提高劳动力支出将使亚马逊更有效率和利润。亚马逊确实在为新员工提供激励
自驾红叶谷看枫,有e2的生活多的是惬意有一辆能说走就走的爱车,生活出行肯定不一样。平日里浪费在路上的时间会较少,出行安排也会更自由,总之生活多的是惬意。其实我也没想到第一辆车会是辆新能源比亚迪e2,本来考虑买燃油车的,比亚迪e2妥妥动力小钢炮一枚定位紧凑型2厢车的比亚迪e2,不仅外观上有轿跑的风范,因其搭载的永磁同步电机最大功率为70kW,峰值扭矩为180Nm,在动力上也有不错的表现。山东的王先生对e2的动力表现就很满意,10万预算买车不发愁,这款比亚迪e2就很香对于大多数刚需用户来说,10万元左右会是比较主流的预算区间。因为如果价格太过便宜,车辆的级别尺寸配置可能会有所欠缺如果价格太贵,则会带来较大的经济负担,所以10万元左右刚刚好。10最具岭南特色的自驾游,跟e2岭南印象园打卡每个地方都有每个地方的文化旅游地,我们这儿,比较有特色的当属岭南印象园。上大学的时候就想逛来着,只是一直没找到合适的机会,因学校离这边比较远,坐车也不方便。前段时间工作压力大,好像还在为油价而焦虑?新能源汽车正在强势兴起虽然现在油价下跌了,不过笔者相信,油价迟早回涨回来的。其一,汽车的保有量在增加,对汽油的需求在日益增长其二,我国是石油进口大国,一致依赖海外的石油供给其三,节能环保是大势所趋,而且低碳出行,我绿牌e2,上牌容易还不限号随着汽车保量有的增多,各个城市正在变得越来越拥堵,而解决城市拥有问题,办法之一就是限号。小编亲身体验过摇号的感觉,怎么说呢,就跟平时买彩票一样,时刻关注着,但每期的结果都没中。这个一张图,带你看清大盘行情是否结束近几个交易日大盘自前高附近连续遇阻回落,市场上又逐渐出现了看空和悲观的声音。本人对大盘的后市还是极度看好的,大的理由有三方面一是去年高估的权重白马通过今年的杀估值行情目前普遍已经接零跑C11正式进入交付阶段,向首批车主交付新车10月23日消息,昨日,零跑汽车在浙江金华AI工厂向首批10位零跑C11车主交付新车,这也标志着零跑C11正式进入交付阶段。零跑C11于2021年初开启预售,豪华版售价15。98万零跑c11引领纯电SUV新市场零跑C11的三款在售车型,配置差异主要体现在了动力和续航表现上,其余的配置都完全相同。我们先来看看它们的不同之处动力方面,零跑C11豪华版和尊享版都配备的是最大功率200千瓦最大扭顶配不超20万零跑第三款车型C11来了零跑汽车旗下第三款车型C11车型正式上市。新车售价区间为15。9819。98万元。相比预售时发布的配置内容,又新增加了前排双层静音玻璃(全系标配)副驾手机投屏棕色内饰选择等配置,选两日连续大跌近百点,A股短期行情结束了?今日是7月的第二个交易日,A股市场并未跟随百年庆起飞,连续两个交易日下跌近百点,着实给投资者浇了一头凉水。军工板块带头领跌,两日下杀超5,时间窗口利好兑现后主力短期卖出意愿明显,券