目录
[一、Keepalived 概述](#一、Keepalived 概述)
[2.3、Keepalived 体系及其模块主要作用](#2.3、Keepalived 体系及其模块主要作用)
[四、部署LVS+Keepalived 高可用群集](#四、部署LVS+Keepalived 高可用群集)
一、Keepalived 概述
1、VRRP
1.1、VRRP协议概念
VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种用于提高网络可靠性的协议。它通过在一组路由器之间创建一个虚拟路由器,实现了网关的冗余。这个虚拟路由器拥有一个虚拟IP地址和虚拟MAC地址,主路由器负责处理发送到这个虚拟IP地址的流量,而备份路由器在主路由器失效时自动接管,以确保网络的连续性。
在VRRP中,路由器被分为主路由器(Master)和备份路由器(Backup)。主路由器定期发送VRRP通告消息,如果备份路由器检测到一定时间内没有收到通告消息,就会自动接管,成为新的主路由器,并继续提供服务。
1.2、VRRP工作原理
VRRP(虚拟路由冗余协议)的工作原理通过协调多台路由器来创建一个虚拟路由器,实现网关的冗余和故障切换。
虚拟路由器的概念
- 在VRRP中,多个实际的物理路由器被配置成一个虚拟路由器组,这个虚拟路由器拥有一个虚拟IP地址和虚拟MAC地址。
- 虚拟IP地址通常配置为网络中的网关地址,网络中的主机将其配置为默认网关。
角色分配
- 在一个VRRP组中,路由器被分为两类:主路由器(Master)和备份路由器(Backup)。
- 主路由器(Master)负责处理发送到虚拟IP地址的所有流量。
- 备份路由器(Backup)作为冗余设备,当主路由器不可用时接管其工作。
优先级
- 每个路由器都被分配一个优先级,范围是1到254,数值越高,优先级越高。
- 默认情况下,优先级最高的路由器会成为主路由器。如果有两个路由器优先级相同,那么拥有更高IP地址的路由器会成为主路由器。
VRRP通告消息
- 主路由器定期向备份路由器发送VRRP通告消息,默认间隔时间为1秒。
- 这些通告消息中包含主路由器的优先级和状态信息。
故障检测与切换
- 如果备份路由器在一定时间(通常为3秒,即3次通告消息间隔)内没有收到主路由器的VRRP通告消息,它会认为主路由器已经失效。
- 备份路由器会在检测到主路由器失效后,根据优先级顺序选举一个新的主路由器,并开始发送VRRP通告消息。
- 这个新的主路由器接管虚拟IP地址,继续为网络中的设备提供网关服务,实现无缝切换。
负载均衡
- 虽然VRRP主要用于冗余和故障切换,但在某些高级配置中,也可以通过设置不同VRRP组的优先级,实现负载均衡。
抢占功能
- 如果启用了抢占功能(通常为默认设置),当一个优先级较高的路由器恢复工作时,它会自动抢回主路由器的位置。
- 如果不启用抢占功能,即使优先级更高的路由器恢复,也不会抢回主路由器的角色,除非当前主路由器失效。
1.3、VRRP抢占模式
1.3.1、抢占模式的概念
- 抢占模式允许一个优先级更高的备份路由器在恢复正常后,主动接管主路由器的角色,即成为新的主路由器。
- 如果抢占模式被禁用,则无论优先级高低,当前的主路由器将继续保留其主路由器的角色,直到它失效为止。
1.3.2、抢占模式的优先级比较
- 抢占模式的前提是路由器之间存在优先级差异。路由器优先级越高,越有可能在启用抢占模式时成为主路由器。
- 当一个优先级较低的主路由器正在运行时,如果优先级更高的路由器恢复并启用了抢占模式,它将抢占主路由器的角色。
1.3.3、抢占模式的应用场景
启用抢占模式:
- 适用于希望始终由最高优先级路由器作为主路由器的场景。这样可以确保最强大、最可靠的设备始终承担主要的流量处理任务。
禁用抢占模式:
- 适用于希望避免频繁切换主路由器的场景,特别是在恢复时间较短且网络流量相对稳定的情况下。禁用抢占模式可以减少不必要的网络波动和切换。
2、Keepalived概述
2.1、Keepalived作用
Keepalived 是一个基于 VRRP(虚拟路由冗余协议)实现的高可用性解决方案,常用于 LVS(Linux Virtual Server)集群中,以确保服务的高可用性。它能够有效解决静态路由中可能出现的单点故障问题。
专为LVS和HA设计的一款健康检查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
cpp
官方网站:http://www.keepalived.org/
2.2、Keepalived工作原理
Keepalived 的工作原理基于 VRRP(虚拟路由冗余协议),通过在主备服务器之间协调工作,实现服务的高可用性。以下是 Keepalived 的工作原理详细说明:
基本结构:
- 主服务器(MASTER):负责处理大部分或全部的实际流量,并定期发送状态通告。
- 备份服务器(BACKUP):在主服务器正常工作时处于待命状态,持续监听主服务器的状态。
虚拟IP(VIP):
- 虚拟IP地址:Keepalived 配置的主备服务器共享一个虚拟IP地址,这个地址对外公开,客户端通过该虚拟IP访问服务。
- VIP 绑定:在正常情况下,VIP 绑定在主服务器上,所有流量都通过主服务器处理。
VRRP 协议:
- VRRP 通告消息:主服务器定期发送 VRRP 通告消息(默认每秒一次)给备份服务器。这个通告消息包含主服务器的优先级和当前状态。
- 优先级:每个服务器在 VRRP 中有一个优先级,主服务器通常具有较高的优先级。优先级较高的服务器会成为主服务器。
故障检测与切换:
- 主服务器故障:如果备份服务器在一定时间内(通常为3秒)没有收到主服务器的 VRRP 通告消息,它会认为主服务器发生了故障。
- 备份服务器接管:备份服务器将自动接管虚拟IP地址,成为新的主服务器,继续处理流量和请求。
- 无缝切换:这种切换是无缝的,客户端通常不会察觉到背后的变化,确保服务不中断。
健康检查:
- 服务检测:Keepalived 还可以配置健康检查模块,定期检查主服务器的健康状态(如服务端口、URL 等)。
- 动态调整:如果主服务器的某些服务出现异常,但服务器本身未完全失效,Keepalived 可以根据健康检查的结果动态调整服务器状态,如将其暂时从负载均衡池中移除。
抢占机制:
- 优先级较高的服务器恢复:如果主服务器恢复正常,它会重新发送 VRRP 通告消息。
- 抢占设置:根据配置,如果启用了抢占机制,优先级更高的服务器会重新夺回主服务器的位置,并重新绑定虚拟IP地址。
2.3、Keepalived 体系及其模块主要作用
①、Core 模块
作用:Core 模块是 Keepalived 的核心部分,负责主进程的启动和维护,以及全局配置文件的加载和解析。
功能:
- 启动 Keepalived 的主要进程。
- 解析并加载 Keepalived 的配置文件,初始化其他模块。
- 维护整个 Keepalived 的运行状态和管理流程。
②、VRRP 模块
作用:VRRP 模块负责实现 VRRP(虚拟路由冗余协议),确保在主服务器故障时备份服务器能够接管虚拟路由器的角色,提供高可用性。
功能:
- 实现 VRRP 协议的通信和选举机制。
- 管理主路由器和备份路由器之间的角色转换,确保网关的高可用性。
- 发送和接收 VRRP 通告消息,进行故障检测与切换。
③、Check 模块
作用:Check 模块负责对后端服务器的健康状态进行检查,确保只有健康的服务器能够参与负载均衡或接管服务。
功能:
- 实施健康检查,常见的方式包括端口检查和 URL 检查。
- 动态监控后端服务器的状态,根据健康检查结果调整服务器在负载均衡池中的状态。
- 确保在服务器发生故障时,自动将其移除,并在其恢复正常后重新加入。
四、部署LVS+Keepalived 高可用群集
前提:关闭防火墙和临时防护
cpp
systemctl stop firewalld.service
setenforce 0
1、部署Master负载调度服务器
1.1、修改主配置文件
bash
yum -y install ipvsadm keepalived
//安装软件
systemctl start keepalived.service
//启动服务
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
//备份文件
bash
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_01
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER //备服务器设置为 MASTER
interface ens33
virtual_router_id 10
priority 100 //备服务器设置为 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.88.180
}
}
virtual_server 172.16.88.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.16.88.44 80 { //第一个节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.88.55 80 { //第二个节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
//删除后面的其余配置
1.2、调整/proc响应参数
bash
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
2、部署Backup负载调度服务器
2.1、修改主配置文件
bash
yum -y install ipvsadm keepalived
//安装软件
systemctl start keepalived.service
//启动服务
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
//备份文件
bash
vim keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_02
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP //备服务器设置为 BACKUP
interface ens33
virtual_router_id 10
priority 80 //备服务器设置为 80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.88.180
}
}
2.2、调整/proc响应参数
bash
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
3、配置节点服务器
bash
yum -y install httpd //安装服务
systemctl start httpd //开启服务
配置节点服务器1:172.16.88.44
bash
echo 'this is kgc web!' > /var/www/html/index.html
配置节点服务器2:172.16.88.55
bash
echo 'this is benet web!' > /var/www/html/index.html
3.1、配置虚拟IP
编辑网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-lo:0
:
bash
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.88.180
NETMASK=255.255.255.255
重启网络服务:
bash
service network restart 或 systemctl restart network
ifup lo:0
ifconfig lo:0
route add -host 172.16.88.180 dev lo:0
3.2、调整/proc响应参数
bash
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
4、测试
客户端访问测试:
在客户端浏览器中访问以下URL,确认能够正常访问负载均衡后的Web服务
bash
http://172.16.88.180/
主服务器故障切换测试:
在主服务器上停止 keepalived
服务,以模拟主服务器故障
bash
systemctl stop keepalived
客户端重新访问测试
再次在客户端浏览器中访问 http://172.16.88.180/
,确认备份服务器是否能够接管并正常提供服务。如果服务正常,则说明故障切换功能正常,备份服务器成功接管虚拟IP。
五、Keepalived脑裂以及解决方法
1、什么是脑裂
在 Keepalived 的上下文中,"脑裂"(Split-Brain)指的是高可用集群系统中的一个问题,发生在主节点和备份节点之间的状态不一致或通信中断时。这种情况可能导致系统中的两个节点都认为自己是主节点,从而导致虚拟 IP 地址或服务的重复运行,造成系统的不稳定性。
脑裂的表现
- 服务重复:两个节点同时持有虚拟 IP 地址,导致服务的重复实例。
- 数据不一致:由于两个节点同时处理请求或提供服务,可能会导致数据不一致或冲突。
- 系统混乱:用户请求可能被路由到错误的节点,导致服务不可用或异常。
2、形成脑裂的原因
原因:
①、心跳之间发生故障:主备服务器间的心跳通信中断,导致双方无法确认对方的状态,可能引发脑裂。
②、网卡驱动故障:网卡驱动异常或故障,导致网络连接中断或不稳定,无法正常传输心跳消息。
③、IP 地址冲突问题:虚拟 IP 地址与实际 IP 地址发生冲突,导致网络混乱,可能引发脑裂。
④、仲裁服务器故障:仲裁服务器出现问题,导致无法正确判断主备节点状态,引发脑裂。
⑤、防火墙阻挡心跳消息传输:防火墙配置不当,阻挡了 Keepalived 的心跳消息传输,导致主备节点之间通信中断。
⑥、Keepalived 配置不一致:
- VRID 不一致:虚拟路由器 ID(VRID)配置不一致,可能导致主备节点无法正确识别对方。
- 优先级一致:主备节点优先级配置相同,导致主备节点无法正确确定主节点,可能引发竞争状态。
3、脑裂解决方法
-
双心跳连接:同时使用串行电缆和以太网电缆进行心跳通信。这种冗余设计确保即使一条连接断开,另一条仍能传递心跳消息,保持集群的完整性。
-
强制节点关闭:在检测到脑裂时,可以使用专用的硬件设备(如STONITH或Fencing设备)强制关闭其中一个节点的电源,避免两个节点同时作为主节点运行,从而解决脑裂问题。
-
完善的监控系统:建立一个全面的监控系统,实时监测集群的状态和健康状况。该系统应能及早发现潜在问题,并及时采取相应措施,预防脑裂的发生。