当前位置: 首页 > 科技观察

Redissentinelprinciple,我忍你好久了!

时间:2023-03-16 19:33:19 科技观察

【.com原稿】在Redis主从复制的作用中,有这么一句话“主从复制是高可用的基石”,那么什么是高可用呢?高可用就是减少系统不能提供的时间,也就是经常听到的是基于六个九。哨兵和集群对于实现高可用性至关重要。图片来自Pexels。本文主要围绕以下几个方面介绍哨兵机制:什么是哨兵?如何配置哨兵?什么是哨兵?我们在配置主从复制的时候简单说几句。当主节点宕机时,谁来提供服务?当主节点宕机时,主从复制就没有意义了。数据为王。没有数据的时代,何谈高可用。这时,诞生了一个叫哨兵的大哥。大哥说我帮你处理这个问题。由于主节点大师作为老大,不会带你去玩。我会在你们四个人中挑一个boss,然后你们一起玩。不带你玩的老大回来了,他的身份就失效了,他就不再是你的老大了。他只能和我挑的boss玩。上面的对话过程就是我们配置哨兵的意义所在。谁玩谁就给谁数据。当我们知道哨兵的作用时,我们将继续。最后,我们用专业术语来解释一下什么是哨兵:哨兵,英文名称Sentinel,是一种分布式系统,用于监控主从结构中的每台服务器。当主节点出现故障时,通过投票机制选出新的服务器。主节点,并将所有从节点连接到新的主节点。哨兵的作用上面我们讲的对话过程就是哨兵的功能之一:自动故障转移。说到作用,肯定是哨兵在工作中干的事情。先用一个比较干巴巴的概念来描述一下,下面再说说工作原理。哨兵的三大功能:监控:监控谁?要支持主从结构的工作,一个是主节点,一个是从节点,所以必须要监控这两个。监控主节点和从节点是否正常运行;检测主节点是否存活,主节点和从节点是否在运行。Notification:当Sentinel检测到服务器有问题时,会向其他Sentinel发送通知。Sentinel相当于一个微信群,每个Sentinel发现的问题都会发布在这个群里。自动故障转移:当检测到主节点宕机时,断开与宕机主节点相连的所有从节点,选择其中一个从节点作为主节点,然后将其他从节点连接到最新的主节点上。并通知客户端最新的服务器地址。这里需要注意一点,Sentinel也是一个Redis服务器,但是它不对外提供任何服务。配置Sentinel时配置为单数。那么为什么要配置哨兵服务器的数量为单数呢?带着这个问题,你会在下面看到你想要的答案。如何配置哨兵准备工作我们开始配置哨兵,开启8个客户端,3个哨兵,1个主节点,2个从节点,1个主节点客户端,1个从节点客户端。Sentinel.conf配置解读Sentinel使用的配置文件是sentinel.conf,如下图:下面我们来解读一下sentinel.conf的配置信息:不过大部分都是注释。下面是一个过滤这些无用信息的命令:catsentinel。conf|grep-v'#'|grep-v'^$'①端口26379:对外服务端口号。②dir/tmp:存放Sentry的工作信息。③sentinelmonitormymaster127.0.0.163792:监听谁,名字可以自定义,后面的2表示如果两个sentinel判断master节点down了,那么master节点down了,一般设置为sentinel中的Count一半加一。④sentineldown-after-millisecondsmymaster30000:sentinel连接master节点多长时间没有响应就死掉了。接下来的30000是毫秒,也就是30秒。⑤sentinelparallel-syncsmymaster1:该配置项是指故障转移时同步新主节点的从节点的最大数量。该值越小,完成故障转移所需的时间越长,值越大,则无法同步数据的从节点越多。⑥sentinelfailover-timeoutmymaster180000:同步过程中,多久完成才算有效。系统默认值为3分钟。开始配置,使用命令catsentinel.conf|grep-v'#'|grep-v'^$'>./data/sentinel-26379.conf将sentinel.conf过滤后的信息移动到/usr/local/redis/conf下。然后打开sentinel-26379.conf修改信息存放目录:快速复制两个sentinel配置文件,端口为26380和26381:sed's/26379/26381/g'sentinel-26379.conf>sentinel-26381.conftestmaster-slave复制处于正常工作状态,启动三台redis服务器,端口分别为6379、6380、6381:查看master节点信息,连接了两个slave节点,端口分别为6380、6381。这里有一个小问题。为什么一个lag为1,另一个为0?lag是延迟时间。我在本地测试所以会是0。很少用到云服务器。滞后值为0和1是正常的。给测试主节点添加一个hash值,hsetkakanamekaka:分别从slave1和slave2中获取kaka的值,检查主从复制是否正常运行。经过测试,我们的主从结构运行正常,如下图所示:启动一个sentinelredis-sentinel26379-sentinel.conf:connectto26379sentinel,主要是最后一行,监控的master节点名为mymaster,status正常,slave节点有2个,哨兵个数1。我们查看26379的sentinel配置信息,此时已经改了:启动一个26380哨兵后,redis-sentinel26380-sentinel.conf,请注意最后一行有一条额外的消息。这个id就是我们在26379配置文件中新增的id。然后我们来到了Sentinel26379的client,也就是新添加的Sentinel26380的id:这个时候我们查看一下Sentinel26379的配置文件,第一次查看配置文件的时候没有配置Sentinel26380.26380Sentinel配置后添加的信息。最后,我们需要启动端口号为26381的SentinelClient3,启动后我们的配置信息和服务器信息也会发生变化。加上Sentinel26380有的信息,Sentinel26381也会有。到这里我们对sentinel的配置就结束了,接下来我们将主节点Master关闭。等了30秒,我们来到了26379Sentinel的客户端,里面新增了一些信息,那么这些信息是做什么的呢?让我们详细解释一下。这里我们需要知道几个信息:①+sdown:这个信息之后,表示三个sentinel中的一个认为master节点宕机了。②+odown:这个信息表示另外两个哨兵去连接master节点,发现master节点确实down了,然后发起一轮投票。这里使用的是Redis4.0,这个信息在各个版本之间略有不同。③+switch-mastermymaster127.0.0.16379127.0.0.16380:至此是哨兵发起的投票结果,选择6380端口的redis为主节点。④+slaveslave127.0.0.1:6381127.0.0.16381@mymaster127.0.0.16380:这里连接6381、6379端口和新的master节点6380。⑤+sdownslave127.0.0.1:6379127.0.0.16379@mymaster127.0.0.16380:最后一句是6379端口还没上线,所以被踢下线了。当我们把6379的redis服务器重新上线,可以看到sentinel服务器响应了两句。一句话是去掉6379的下线,最后一句是把6379重新连接到新的主节点上。此时master节点为6380,在redis客户端设置6380的值,查看主从复制是否正常。为新的主节点6380添加列表类型:在6379和6381处获取这个值,至此,我们的哨兵模式配置完成。Sentinel的工作原理配置好Sentinel之后,就要分析一下它的工作原理了。只有了解了它的工作流程,才能对Sentinel有更好的了解。这篇文章讲解的原理就不那么干了!它允许您将技术文章作为故事来阅读。进入正题,哨兵的作用是监控、通知、故障转移。那么工作原理也是围绕这三点展开的。监控工作流程监控工作流程如下:①哨兵发送info命令,保存所有哨兵状态、主从节点信息。②主节点会记录redis实例的信息。master节点记录的信息和sentinel记录的信息看起来是一样的,其实还是有一些区别的。③sentinel也会根据从master节点获取到的slave节点信息,向相应的slave节点发送info命令。④然后Sentinel2来了,它也会向master节点发送info命令,建立cmd连接。⑤此时Sentinel2也会保存和Sentinel1一样的信息,只不过保存了2条Sentinel信息。⑥此时为了各个sentinel信息的一致性,它们之间建立了一个发布-订阅。为了Sentinels之间的信息长期对称,它们也会互相发送ping命令。⑦当另一个Sentinel3到来时,它会做同样的事情并向主节点和从节点发送信息。并与Sentinel1和Sentinel2建立连接。NotificationworkflowSentinel会向master和slave的所有节点发送命令获取它们的状态,并将信息发布到Sentinel的订阅中。failover的原理sentinel会一直向master节点发送publishsentinel:hello,直到sentinel报告sdown为止。这个词是不是很熟悉?没错,就是上面我们断开master节点后sentinel服务器上报的信息。哨兵报告主节点宕机后,还没有结束,哨兵还会在内网发布消息,表示主节点宕机。发送的命令是sentinelis-master-down-by-address-port。其余哨兵收到命令后,主节点挂掉了吗?让我看看它是否挂断了。发来的信息也是你好。其余的哨兵也会把收到的信息发送给自己的内网命令sentinelis-master-down-by-address-port,确认第一个发送的sentinelis-master-down-by-address-port哨兵说你是对的,那家伙确实挂了。当大家认为主节点宕机时,就会修改自己的状态为odown。当一个sentinel认为master节点挂了flag就sdown了,当一半的sentinel认为flag挂了就odown了。这就是哨兵配置为单数的原因。一个sentinel认为master节点挂了,就叫主观下线,半数哨兵认为master节点挂了,就叫guest下线。一旦认为主节点的客官下线,哨兵就会进行下一步:此时哨兵已经检测到问题,那么由哪个哨兵负责选举新的主节点!不可能是张三,李斯也去了,王舞也去了,乱七八糟的,还得在所有哨兵中选出首领,那怎么选!请看下图。这时候5个哨兵会一起开会,所有的哨兵都在同一个内网,然后他们会做一件事情,就是5个哨兵会发送命令sentinelis-master-down-by-address-同时移植并带上您的活动时间和runid。每个哨兵既是候选人又是选民。每个哨兵有一票,信封代表自己的投票权。当sentinel1和sentinel4同时向组发送指令准备选举时,sentinel2此时说谁先收到指令我就投票给谁。如果sentinel1发送早,那么sentinel2的票会投给sentinel1。根据这个规则,直到有一个哨兵的票数达到哨兵总数的一半时,才会发起投票。假设Sentinel1的选票数量符合Sentinel的一半,则将选出Sentinel1。现在是下一阶段的时候了。sentinel已经选择了sentinel1作为代表去所有的slave节点中寻找一个作为master节点。主节点的选择并不是随机的,是有一定规则的。先干掉离线的:干掉反应慢的,sentinel会发信息给所有的redis,反应慢的干掉。杀死与原主节点断开时间最长的那个。由于这里演示不够,新加了一个slave5,没有意义!以上三点判断完之后,还有salve4和slave5,会根据优先级的原则进行筛选:首先根据优先级,如果优先级相同,则进行其他判断。判断偏移量,判断数据同步。假设slave4的offset是90,slave5的offset是100,那么sentinel会认为是不是slave4的网络有问题,所以会选择slave5作为新的master节点。如果slave4和slave5的偏移量相同怎么办!还有最后一个审判。最后一步是判断runid,也就是职场资历,也就是说根据runid的创建时间来判断,时间早者优先。选择新的主节点后,将向所有节点发送指令。关于Sentinels的所有知识点我都总结完了。这篇文章最重要的是Sentinels的工作原理。我们简单回顾一下它的工作原理:首先,监听,所有哨兵同步信息。哨兵将信息发布到订阅。Failover:Sentinel发现master节点下线→sentinel开始为负责人投票→负责人选举新的master节点→新的master节点断开原master节点,其他slave节点连接到新的master节点,原主节点上线后作为从节点连接。以上是笔者对sentinel的理解。如有错误,请指出,以便及时更正。作者:Kaka简介:工作三年,从平淡无奇的生活变成了现在的“单身”生活。当然,这个订单不是单单!虽然技术学习要求极高,但远远不能满足客户千奇百怪的要求。进入朝九晚六的我,虽然躲过了风吹日晒,但还是很享受那些只剩下黑眼圈的日子。坚持学习、博客、分享,是卡卡从业以来一直坚持的信念。希望卡卡在诺大网的文章能给大家带来一点帮助。【原创稿件,合作网站转载请注明原作者和出处为.com】