前言 上次我们遇到了一个MySQL故障的事故,这次我又遇到了另外一个奇葩的问题: Keepalived高可用组件的虚拟IP持续漂移,导致MySQL主从不断切换,进而导致MySQL主从数据同步失败。 虽然没能重现Keepalived的这个问题,但是我深入研究了下Keepalived的原理以及针对核心配置参数做了大量实验。悟空带着大家一起看下Keepalived到底是如何运转的,以及为什么它能做到高可用。 原理讲解分为上、中、下三篇: 上篇涉及以下知识点:Keepalived如何提供数据流量转发。Keepalived选举的原理。Keepalived的负载均衡算法。 中篇涉及以下知识点:Keepalived的路由规则。Keepalived如何监控服务的。Keepalived如何进行故障切换。Keepalived的架构剖析。 下篇设计以下知识点:Keepalived配置详解Keepalived实战部署一、Keepalived和LVS概述1。1Keepalived概述 谈到Keepalived,给人的印象就是用在高可用架构中,保证某个服务不故障,其实它还有很多其他的功能。Keepalived是Linux系统下的一个比较轻量级的高可用解决方案,这个轻量级是相对于Heartbeat等组件的。虽然Heartbeat功能完善、专业性强,但是安装部署就没有Keepalived简单,Keepalived只需要一个配置文件即可。企业中大多选择Keepalived作为高可用组件。1。2LVS概述 Keepalived最开始是由AlexandreCassen使用C语言编写的开源软件项目,项目的目的主要是简化LVS项目的配置并增强LVS的稳定性。简单来说,Keepalived就是对LVS的扩展增强。 LVS(LinuxVirtualServer)翻译过来就是Linux虚拟服务器,由章文嵩博士主导开发的开源负载项目,目前LVS已经被集成到Linux内核模块中。 LVS主要用在负载均衡方面,比如Web客户端想要访问后端服务,Web请求会先经过LVS调度器,调度器根据预设的算法决定如何分发给后端的所有服务器。1。3LVS基本原理 LVS的基本原理如下图所示: LVS基本原理 LVS的核心功能就是提供负载均衡,负载均衡技术有多种:基于DNS域名轮流解析方案。基于客户端调度访问方案。基于应用层系统的调度方案。基于IP地址的调度方案。 而效率最高的是基于IP地址的调度方案。其实就是将请求转发给对应的IP地址端口号,它的效率是非常高的,LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件。 LVS负载均衡器会虚拟化一个IP(VIP),对于客户端来说,它事先只知道这个VIP的,客户端就将请求发送给VIP,然后LVS负载均衡器会将请求转发给后端服务器中的一个,这些服务器都称为RealServer(真实服务器)。转发的规则是通过设置LVS的负载均衡算法来的,比如随机分配、按照权重分配等。 后端服务器的提供的功能要求是一致的,不论转发到哪台服务器,最终得到的结果是一致的,所以对于客户端来说,它并不关心有多少个后端服务器在提供服务,它只关心访问的VIP是多少。 那么后端服务处理完请求后,如何将数据返回给客户端呢?根据LVS的不同模式,会选择不同的方式将数据返回给客户端。LVS的工作模式有三种:NAT模式、TUN模式、DR模式。这个后面讲到路由机制再来细说。二、Keepalived流量转发原理 Keepalived为Linux系统提供了负载均衡和高可用能力。负载均衡的能力来自Linux内核中的LVS项目模块IPVS(IPVirtualServer)。 Keepalived运行在Linux系统中,它会启动内核中的LVS服务来创建虚拟服务器。比如我们在两台服务器上都启动了一个Keepalived服务,然后LVS会虚拟化出来一个IP(VIP),但是只有一个Keepalived会接管这个VIP,就是说客户端的请求只会到MasterKeepalived节点上。这样流量就只会到一台keepalived上了,然后keepalived可以配置几台真实的服务IP地址和端口,通过负载调度算法将流量分摊到这些服务上。对于另外一台BackupKeepalived节点,它是待机状态,没有流量接入的。 三、Keepalived如何进行选主的 那么上面的两个Keepalived服务是如何选出其中一个作为Master节点的呢? 我们一般都是运行在两台主备服务器或一主多备的服务器上。而这多台服务器都是遵循VRRP的。3。1VRRP协议 VRRP的全称为VirtualRouterRedundancyProtoco,虚拟路由冗余协议。它是一种容错协议,为了解决局域网中单点路由故障的问题。比如之前我们都是一个路由器进行路由转发,如果这个路由器故障了,那么整个路由转发的链路就断了,服务就不可用了。 VRRP协议主要的功能:虚拟路由器和虚拟IP。Master广播ARP报文。Backup选举新的Master。 现在我们配置多台路由器(一主多备),每台路由器都有一个自己的IP地址,它们组成一个路由器组,其中有一个作为Master,其他作为Backup。然后这些路由器会虚拟出单个路由,拥有自己的IP地址,也就是VirtualIP,简称VIP。 客户端访问这个虚拟的IP地址就可以了,当主路由器故障了,备份路由器通过选举机制选出一个新的主路由器,继续向客户端提供路由服务,实现了路由功能的高可用。 路由器开启VRRP功能后,根据优先级配置进行选举,优先级高的会成为主(Master)路由器,另外的则会成为备(Backup)路由器。 Master路由器定期发送VRRP通知报文给Backup路由器,告诉它们我是在正常工作的,你们不用竞选新的Master路由器。 关于Master和Backup通信的原理其实很简单,就是一个心跳机制,不过这个和Eureka的心跳机制不一样,Eureka是客户端定期向Eureka注册中心发送心跳,而Keepalived则是Master定期向Backup发送心跳机制,而Backup路由器它有一个定时监测通知的任务,如果在这个时间段内未收到通知,则认为Mater故障了,然后通过优先级进行选举,选举出新的Master后,就定期发送VRRP通知报文给Backup路由器。(Eureka心跳机制:唐太宗把微服务的心跳机制玩到了极致!) 通过这个VRRP协议,可以提高系统的可用性,避免因单点故障导致的服务不可用问题,同时在路由器故障时,无需手动修改网络连接信息以访问新的Master路由器。如下图所示,Backup切换为了Master。 关于选举的配置主要依赖vrrpinstance和vrrpscript字段。3。2vrrpinstance配置 对于Keepalived的选主有三个重要参数:state:可选值为MASTER、BACKUP。priority:节点的优先级,可选值为〔1255〕。nopreempt:不抢占模式,如果配置,则当优先级高时,会将自己设置为Master。vrrpinstanceVI1{节点为BACKUPstateBACKUP优先级为100priority100不抢占模式nopreempt} 当一台设置为master,另外一台设置为BACKUP,当MASTER故障后,BACKUP会成为新的MASTER,而当老的MASTER恢复后,又会抢占成为新的MASTER,接管VIP的流量,导致不必要的主备切换。为了避免这种主备切换,我们可以将两台Keepalived都设置为BACKUP,且高优先级的那台Keepalived设置为不抢占nopreempt。3。2vrrpscript配置 而优先级priority它是可以增减的,通过vrrpscript来配置:vrrpscriptrestartmysql{监测和重启mysql容器,如果MySQL服务正常或MySQL失败scriptusrlocalkeepalivedrestartmysql。shinterval5weight20} 这个是定时执行脚本的配置,script配置会监测mysql服务是否不正常。这是一个自定义的脚本,可以自己写返回值。这里我写的逻辑是如果MySQL服务正常则返回0,不正常则返回1。当weight为正数 当脚本返回0时(服务正常),则增加优先级否则,保持设置的priority值。 切换策略:如果MASTER节点的vrrpscript脚本检测失败时,如果MASTER节点的priority值小于BACKUP节点weightpriority,则发生主备切换。如果MASTER节点的vrrpscript脚本检测成功时,如果MASTER节点的priority值大于BACKUP节点weightpriority,则不发生主备切换。当weight为负数 当脚本返回非0时(服务异常),则优先级否则,保持设置的priority值。 切换策略:如果MASTER节点的vrrpscript脚本检测失败时,如果MASTER节点的priorityweight值小于BACKUP节点priority值,则发生主备切换。如果MASTER节点的vrrpscript脚本检测成功时,如果MASTER节点的priority值大于BACKUP节点priority值,则不发生主备切换。 注意:增加或减少优先级的范围为〔1,254〕。 举例说明: 两台Keepalived的state都配置成BACKUP,其中一台服务器node1的Keepalived的优先级设置为100,不抢占模式,另外一台node2的优先级设置为90,抢占模式。 node1节点配置的优先级高,它成为Master节点,当Master节点监控的MySQL服务发生故障后,会降低优先级,从100降低到80。另外一台优先级为90,收到优先级比自己低的ARP广播时,就会变成新的Master节点。而node1节点会成为BACKUP节点,当node1监控到MySQL服务恢复后,优先级变为配置的priority100,但是也不会抢占。 如下图所示:虽然node1上的keepalived重启mysql成功了,优先级也恢复成了100,但是并没有变为master,还是维持backup状态。 而node2还是master节点,定时向node1发送vrrp通知,如下图所示: 如果node2的mysql宕机了,那么它的优先级会从90降低到70,即使这样,也不会出现主备切换,因为我们配置的策略就是node1不会抢占。如果要在这种情况下切换到node1,就只能将node2的keepalived主动停掉,故障转移中篇会讲到。四、Keepalived的负载均衡机制4。1转发机制 要理解Keepalived的负载均衡机制,必须了解IPVS,也就是IPVirtualServer,IP虚拟服务器。 IPVS模块是Keepalived引入的一个第三方模块,目的是解决单IP多服务器的工作环境,通过IPVS可以实现基于IP的负载均衡集群。IPVS默认包含在LVS软件中,而LVS又是包含在Linux系统中。所以Keepalived在Linux系统上可以直接利用LVS的功能。LVS的作用就是虚拟出一个IP,也就是VIP,客户端请求先到达VIP,然后从服务器集群中选择一个服务器节点,将流量转发给这个节点,由这个节点处理请求。 如图所示:Keepalived是运行在用户空间的LVS路由(LVSRouter)进程,作为MASTER角色Keepalived称为ActiveRouter,BACKUP角色的Keepalived称为SLAVERouter。只有ActiveRouter是工作的,其他Router是StandBy(待机状态)。ActiveRouter和BackupRouter之间是通过VRRP协议进行主备切换的。ActiveRouter会启动内核中LVS服务以创建虚拟服务器,虚拟服务器有一个虚拟IP(VIP),比如下图中的VIP为192。168。56。88。ActiveRouter还会设置IPVSTABLES(服务器列表),记录了后端服务器的地址及服务运行状态。负载均衡就从服务器列表选择一个可用的服务进行转发。这些后端服务是配置在Keepalived的virtualserver配置项里面的,如下所示,配置了三个realserver,分别对应了三台后端服务器。virtualserver192。168。56。8880{delayloop6lbalgorrlbkindNATprotocoltcp服务器1realserver192。168。56。1180{TCPCHECK{connecttimeout10}服务器2realserver192。168。56。1280{TCPCHECK{connecttimeout10}服务器3realserver192。168。56。1380{TCPCHECK{connecttimeout10}4。2负载调度算法 配置中有一个字段lbalgo,这个就是负载调度算法,可以配置成rr、wrr、lc、wlc、sh、dh等。常用的是rr和wrr。rr,就是RoundRobin,轮询算法,每个服务器平等的,依次被调度。wrr,就是WeightedRoundRobin,加权轮询调度算法,加权值较大的,会被转发更多的请求。比如有的服务器硬件能力较弱,则可以将加权值配置得低一点。lc,就是LeastConnection,最少连接算法。请求被转发到活动连接较少的服务器上。连接数是通过IPVSTable来动态跟踪的。wlc,加权最少连接。根据权重连接数分配请求。sh,目标地址哈希算法,通过在静态Hash表中查询目的IP地址来确定请求要转发的服务器,这类算法主要用于缓存代理服务器中。dh,源地址哈希算法,通过在静态Hash表中查询源IP地址来确定请求要转发的服务器,这类算法主要用于防火墙的LVSRouter中。五、总结 Keepalived作为高可用、高性能组件,在集群环境中用得还是挺多的,所以去理解Keepalived的底层原理,也可以学到很多高可用和负载均衡的通用原理。 本篇介绍了Keepalived的IPVS功能,启动了一个虚拟服务器,虚拟化了一个VIP,用来接收客户端的请求,然后通过负载调度算法将流量转发给真实服务器。 Keepalived一般用在都是一主一备或一主多备的场景,而对于主的选举是通过配置state、privority、nopreemt、weight字段来达到的。 下篇我们再来看下真实服务器处理完请求后,如何将数据返回给客户端,这个涉及到LVS的路由规则。以及监控和故障切换也是Keepalived的核心功能,这个很有必要深入探索下。 原文链接:https:mp。weixin。qq。comsLgqSqxBiK25wmwrsmPa83w