发布时间:2025-12-09 17:42:02 浏览次数:4
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
网络层(layer 3):Keepalived 通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(layer 4):Keepalived 在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived 一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(layer 5):Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
健康检查和失败切换是keepalived的两大核心功能。
KeepAlived官网提供可编译源码包,可直接下载。
官网 https://www.keepalived.org/
高可用实现支持多种集群配置模式:主备模式,主主模式,N+1模式,N+M模式;另外支持资源及节点故障检测。
硬件准备
要实现KeepAlived的多种模式,因此这里准备了3台虚拟机进行测试,设备IP分别为:
192.168.71.183
192.168.71.253
192.168.70.183
软件准备
本次高可用实现以nginx进行效果展示,nginx未进行任何配置,仅修改了对应index.html文件以展示对应情况的高可用实现效果。
为了方便辨别实现效果,此处修改nginx的主页。
在各节点执行
[root@node1 ~]# echo '<h2><strong>The IP is 192.168.71.183</strong></h2>' >> /usr/share/nginx/html/index.html本次使用yum安装
在各节点执行
[root@node1 ~]# yum install keepalived -y...Total download size: 1.8 MInstalled size: 6.0 M...Installed:keepalived.x86_64 0:1.3.5-19.el7Dependency Installed:lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2Complete!查看版本
[root@node1 ~]# keepalived -vKeepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2Copyright(C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>Build options: PIPE2 LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_PREF RTA_VIA FRA_OIFNAME FRA_SUPPRESS_PREFIXLEN FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK LIBIPTC LIBIPSET_DYNAMIC LVS LIBIPVS_NETLINK VRRP VRRP_AUTH VRRP_VMAC SOCK_NONBLOCK SOCK_CLOEXEC FIB_ROUTING INET6_ADDR_GEN_MODE SNMP_V3_FOR_V2 SNMP SNMP_KEEPALIVED SNMP_CHECKER SNMP_RFC SNMP_RFCV2 SNMP_RFCV3 SO_MARK查询对应的配置文件:
[root@node1 ~]# rpm -ql keepalived/etc/keepalived/etc/keepalived/keepalived.conf/etc/sysconfig/keepalived/usr/bin/genhash/usr/lib/systemd/system/keepalived.service/usr/libexec/keepalived/usr/sbin/keepalived.../usr/share/man/man1/genhash.1.gz/usr/share/man/man5/keepalived.conf.5.gz/usr/share/man/man8/keepalived.8.gz/usr/share/snmp/mibs/KEEPALIVED-MIB.txt/usr/share/snmp/mibs/VRRP-MIB.txt/usr/share/snmp/mibs/VRRPv3-MIB.txt文件说明:
Keepalived主要通过修改/etc/keepalived/keepalived.conf配置文件进行配置高可用集群
主备模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,热备服务器永远处于浪费状态,对于服务器不多的网站,该方案并不经济实惠。
此模式下使用两台虚拟机和一个VIP进行:
主节点:192.168.71.183
备节点:192.168.71.253
VIP:192.168.71.254
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为主节点提供服务。
② 故障
停止主节点keepalived服务,主节点执行;
[root@node1 ~]# systemctl stop keepalived浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.253,当前由于主节点故障,备用节点启用,接管VIP流量。
重新启动主节点keepalived服务;
[root@node1 ~]# systemctl start keepalived浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.183,主节点恢复,接管VIP流量。
此模式下使用三台虚拟机(备用节点)进行:
主节点:192.168.71.183
备节点1:192.168.71.253
备节点2:192.168.70.183
VIP:192.168.71.254
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为主节点提供服务。
图片可参考上例
② 故障-1
停止主节点keepalived服务,主节点执行;
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.70.183,当前由于主节点故障,备用节点启用,接管VIP流量。
笔者这里无法访问,可能是因为不是一个网段的原因。理由是直接访问70.183,可以正常访问到nginx网页,而访问虚拟IP确不行。另外70.183的ens33网卡设备,确实增加了71.254这个IP,但在其他机器无法ping通71.254。
③ 故障-2
停止备节点1 keepalived服务,主节点执行;
浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.253,当前由于主节点故障,备用节1故障,备节点2启用,接管VIP流量。
④ 故障恢复
重新启动主节点keepalived服务;
[root@node1 ~]# systemctl start keepalived浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.183,主节点恢复,接管VIP流量。
此模式下两台机器两个虚拟IP,每台机器对应一个虚拟IP的主节点,对应另一个虚拟IP的备节点,两台机器互为主备。
此模式下使用两台虚拟机进行:
节点1:192.168.71.183
节点2:192.168.71.253
虚拟IP1:192.168.71.254
虚拟IP2:192.168.71.252
① 正常状态
浏览器访问虚拟IP1:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
浏览器访问虚拟IP2:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
② 故障-1
停止节点1 keepalived服务,节点1执行;
[root@node1 ~]# systemctl stop keepalived浏览器访问虚拟IP1:192.168.71.254
页面显示实际访问地址为192.168.71.253,当前由于节点1故障,备用节点启用,所以作为节点1的备用节点,节点2接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
③ 故障-1 恢复
恢复节点1keepalived服务,节点1执行;
systemctl restart keepalived浏览器访问虚拟IP1:192.168.71.254
页面显示实际访问地址为192.168.71.183,由于节点1已恢复,作为VIP1的主节点-节点1,节点1恢复接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
④ 故障-2
停止节点2keepalived服务,节点2执行;
systemctl stop keepalived浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.183,当前由于节点2故障,备用节点启用,所以作为节点2的备用节点,节点1接管VIP2流量。
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-节点1提供服务。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
② 故障-1
停止主节点1 keepalived服务,主节点1执行;
systemctl stop keepalived浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.70.183,当前由于主节点1故障,备用节点启用,所以作为节点1的备用节点,备节点接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.71.253,当前为正常状态,无论刷新多少次均显示为VIP2的主节点-节点2提供服务。
③ 故障-2
停止主节点2 keepalived服务,主节点2执行;
systemctl stop keepalived浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为VIP1的主节点-主节点1提供服务。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.70.183,当前由于主节点2故障,备用节点启用,所以作为主节点2的备用节点,备节点接管VIP2流量。
④ 故障-3
停止主节点1keepalived服务,主节点1执行;
systemctl stop keepalived停止主节点2keepalived服务,主节点2执行;
systemctl stop keepalived浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.70.183,当前由于主节点1故障,备用节点启用,所以作为节点1的备用节点,备节点接管VIP1流量。
浏览器访问虚拟IP:192.168.71.252
页面显示实际访问地址为192.168.70.183,当前由于主节点2故障,备用节点启用,所以作为主节点2的备用节点,备节点接管VIP2流量。
N+M模式的配置参考N+1模式,复制备节点即可
说明:
Keepalived通过在配置文件中添加script来实现对服务状态的检测和故障切换
在global配置段外定义脚本或者shell命令,然后再virtual_server配置段中调用脚本,最后根据脚本的执行结果(成功或失败) 来增加或减少当前的节点的优先级,因为keepalived是根据优先级来判断是否为主节点 所以当优先级低时则就成为备份节点 从而将VIP飘动到优先级高的主节点上 实现了对其他服务的高可用
script配置及调用说明:
vrrp_script chk_nginx { # chk_nginx为自定义的vrrp脚本名称 后续调用需要此名称script "killall -0 sshd" # 执行的脚本或命令interval 2 # 监测的时间间隔 单位:秒 默认:1秒weight -4 # 此值默认为0 范围:-253~253 ,# 如果此值为负数 则代表当上面的脚本或命令执行失败时($?结果为非0) 则将本节点的优先级减去定义的值;# 如果此值为正数 则代表当上面的脚本或命令执行成功时($?结果为0) 则将本节点的优先级加上定义的值fall 2 # 脚本或命令执行几次失败后 将本节点标记为失败(进而进行减优先级操作)rise 2 # 脚本或命令执行几次成功后 将本节点标记为成功(进而恢复节点)user USERNAME # 以什么用户身份执行脚本}vrrp_instance VI_1 {...track_script {script_name}}本次使用两台虚拟机和一个虚拟IP进行配置:
主节点:192.168.71.183
备节点:192.168.71.253
虚拟IP:192.168.71.254
分别在主节点和备节点编辑脚本,编辑/etc/keepalived/check_nginx.sh
脚本内容为:
[root@node2 keepalived]# pwd/etc/keepalived[root@node2 keepalived]# cat check_nginx.sh#!/bin/shA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then# nginx # 此处为展示效果,在nginx出现故障后,注释不重启nginx。sleep 2if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfifi为脚本添加执行权限:
chmod +x /etc/keepalived/check_nginx.sh重启keepalived
① 正常状态
浏览器访问虚拟IP:192.168.71.254
页面显示实际访问地址为192.168.71.183,当前为正常状态,无论刷新多少次均显示为主节点提供服务。
② nginx服务故障
停止主节点nginx服务,主节点执行;
[root@node1 keepalived]# systemctl stop nginx浏览器访问虚拟IP:192.168.71.254
页面实际访问地址为192.168.71.253,当前由于主节点资源故障,权重-30,优先级低于备用节点,备用节点启用,接管VIP流量。
③ nginx服务恢复
故障恢复
重新启动主节点nginx服务;
[root@node1 keepalived]# systemctl start nginx浏览器访问虚拟IP:192.168.71.254;
页面实际访问地址为192.168.71.183,主节点nginx恢复,权重恢复,优先级高于备用节点,重新接管VIP流量。
keepalived只有一个配置文件keepalived.conf,主要由global_defs、vrrp_instance和virtual_server三个模块构成。
global_defs模块为keepalived全局配置模块,它包括以下内容:
① notification_email:可添加keepalived发生切换故障时发送邮件所对应的邮箱,可以分行添加多个邮箱;
② notification_email_from:可添加发送邮件的地址;
③ smtp_server:可添加邮件服务器地址;
④ smtp_connect_timeout:可设置邮件服务器连接超时时长;
⑤ router_id:每个keepalived节点的唯一标识,建议设置为当前主机名,并且多个节点重名时是不受影响的;
⑥ vrrp_skip_check_adv_addr:keepalived会以对所有通告报文都进行检查,进而比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器则跳过检查,默认值为全检查;
⑦ vrrp_strict:表示严格遵守VRRP协议,启用此项后以下状况将无法启动服务——
⑧ vrrp_garp_interval:可设置ARP接口之间发送免费报文的延迟时间,可以精确到毫秒,默认是0;
⑨ vrrp_gna_interval:设置非请求消息的发送延迟时间,默认为0;
⑩ vrrp_mcast_group4:可指定组播IP范围,可选择224.0.0.0到239.255.255.255之间的地址,默认为224.0.0.18;
⑪ vrrp_iptables:与vrrp_strict同时设置时可禁止iptables规则的生成,注释或者无vrrp_strict时可不加此项。
vrrp_instance模块可配置虚拟路由器,它包含以下内容:
① vrrp_instance模块后面的STRING为VRRP的实例名,一般设置为业务名称;
② state:可设置此虚拟路由器的初始状态,可选择MASTER或者BACKUP;
③ interface:可以绑定当前虚拟路由器所使用的物理接口,如eth0、bond0和br0等,可以和VIP地址不在同一张网卡上;
④ virtual_router_id:可设置每个虚拟路由器的唯一标识,取值范围为0-255,每个虚拟路由器的该项值必须是唯一的,否则无法启动服务,并且同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一;
⑤ priority:可设置当前物理节点在此虚拟路由器中的优先级,优先级取值范围为1-254,值越大优先级越高,每个keepalived节点取值不同;
⑥ advert_int:可设置VRRP通告的时间间隔,默认为1秒;
⑦ authentication:可设置认证机制,由以下两部分构成——
⑧ virtual_ipaddress:可添加虚拟路由器的VIP,并可设置VIP对应的子网掩码、网卡和标签等,生产中可能会在同一个虚拟路由器上添加上百个VIP,不同的VIP分行隔开,不指定网卡时默认添加在eth0上,不设置子网掩码时默认为32位。在添加VIP地址时,需确保将要使用的VIP不存在,即还没被使用。
virtual_server模块用于虚拟服务器配置,将虚拟路由器中添加的VIP与后端real server对应起来,该模块包括以下内容:
①virtual_server后面需要跟上VIP地址和端口,即客户端是通过哪一个VIP和哪个端口向后端服务器发起访问;
② delay_loop:检查后端服务器的时间间隔;
③ lb_algo:可定义调度算法,如rr、wrr、lc、wlc、lblc、sh和dh等;
④ lb_kind:可定义集群的类型,如NAT、DR和TUN,注意要使用大写;
⑤ persistence_timeout:可设置持久连接时长;
⑥ protocol:可指定服务协议,如TCP、UDP和SCTP,一般使用TCP;
⑦ sorry_server:可设置当所有后端服务器都不可用时的备用服务器地址;
⑧ real_server:设置VIP所对应的后端服务器IP和端口,包括以下构成部分——
网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤为重要。在网络里面有个协议就是来做这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的发生。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
虚拟路由器:虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个一样,可以理解为在一个组中:主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
主路由器(MASTER):虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP 请求,ICMP数据转发等。
备份路由器(BACKUP):虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色, 继续提供对外服务,整个切换对用户来说是完全透明的。
VRRP路由器在运行过程中有三种状态:
一般主路由器处于Master状态,备份路由器处于Backup状态。
VRRP使用选举机制来确定路由器的状态,优先级选举:
1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
3.比较IP地址。在没有IP地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。
路由器使用VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master路由器,优先级低的成为Backup路由器。Master拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP报文,通知备份组内的其他设备自己工作正常;Backup路由器只接收Master发来的报文信息,用来监控Master的运行状态。当Master失效时,Backup 路由器进行选举,优先级高的Backup将成为新的Master 。
在抢占方式下,当Backup路由器收到VRRP报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master路由器;否则将保持Backup状态;
在非抢占方式下,只要Master路由器没有出现故障,备份组中的路由器始终保持Master或Backup状态,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器;
如果Backup路由器的定时器超时后仍未收到Master路由器发送来的VRRP报文,则认为Master路由器已经无法正常工作,此时Backup路由器会认为自己是Master路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master路由器,承担报文的转发功能。
VRRP是用来实现路由器冗余的协议。
VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设计设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。
VRRP协议需要具有IP备份,优先路由选择,减少不必要的路由器通信等功能。
VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是 BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当主级失效时,BACKUP将接管原先MASTER的网络功能。
VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整数;同一个组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0-255 的正整数。
heartbeat和keepalived有很多相同之处,但是也有区别:
Keepalived使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单
Heartbeat功能更强大:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能;
协议不同:Keepalived使用VRRP协议即虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP,l思科交换就是使用这个协议做双机)进行通信和选举。Heartbeat使用心跳(IBM POWER小型机就是用心跳线做双机)进行通信和选举;Heartbeat通过网络或串口通信