目录
[1. 配置负载调度器(Master)](#1. 配置负载调度器(Master))
一、Keepalived
1.Keepalived简介
Keepalived是一个高可用性(HA)解决方案,主要用于提高Linux系统中的服务和应用的可用性。它通常与虚拟路由冗余协议(VRRP)一起使用,提供负载均衡和故障转移功能。Keepalived主要用于确保在单个服务器出现故障时,服务能够快速转移到另一台备份服务器,从而保持服务的持续可用性
2.工作原理(两个部分)
虚拟路由冗余协议(VRRP)
VRRP使得多个服务器能够共享一个虚拟IP地址。这个虚拟IP地址是客户端与服务进行通信时使用的地址,而实际的物理IP地址则可以是不同的服务器的地址。Keepalived通过VRRP协议来实现这个功能,确保即使主服务器出现故障,服务仍然可以继续运行。其工作原理如下
主服务器和备份服务器在VRRP配置中,指定一个主服务器(也称为主路由器)和一个或多个备份服务器。主服务器
会拥有虚拟IP地址,并定期向网络广播它的存在
优先级和竞选每台服务器都有一个优先级值。主服务器的优先级值较高,而备份服务器的优先级值较低
主服务器会定期发送VRRP广告包,以表明它是当前的主路由器
故障检测和切换如果主服务器无法发送广告包(例如,发生了故障),备份服务器会检测到主服务器的失效,并启动竞选过程。如果备份服务器的优先级值比其他备份服务器高,它会成为新的主路
由器,并接管虚拟IP地址
虚拟IP迁移一旦备份服务器成为新的主服务器,它会接管虚拟IP地址,使客户端能够继续连接到服务而
不会察觉到主服务器的故障
健康检查
健康检查功能用于检测和确保后端服务器的健康状态,以便于负载均衡和故障处理。Keepalived通过定期对后端服务器进行健康检查来实现这一功能,具体工作原理如下
健康检查配置在Keepalived的配置文件中,可以定义对后端服务器的健康检查方式,例如通过TCP
HTTP、脚本等方式进行检查
检测和状态更新Keepalived定期向后端服务器发送健康检查请求。如果服务器响应正常,则认为服务器健康否则,认为服务器不可用
动态负载均衡在负载均衡模式下,Keepalived根据健康检查的结果动态调整流量分配。如果一个服务器被
检测为不可用,Keepalived会将流量重新分配到其他健康的服务器上
故障恢复当一个曾经不可用的服务器恢复健康状态时,Keepalived会将其重新加入负载均衡池中,以
便重新分配流量
**注:**上面内容是VRRP工作原理简版,具体版可参考VRRP工作原理
3.Keepalived体系及模块
3.1Core模块
作用
核心功能:Core模块是Keepalived的核心部分,负责主进程的启动、维护和管理
配置管理:该模块负责加载和解析全局配置文件(通常是/etc/keepalived/keepalived.conf),并将配置应用到其他模块中
进程管理:负责启动和管理Keepalived的各个子进程,包括VRRP和健康检查进程。Core模块确保所有配置和状态在各个模块之间的一致性
3.2VRRP模块
作用
实现VRRP协议:VRRP(Virtual Router Redundancy Protocol)模块实现了虚拟路由器冗余协议的功能,用于提供高可用性
虚拟IP管理:通过VRRP模块,Keepalived可以管理一个或多个虚拟IP地址。这些虚拟IP地址可以在主路由器和备份路由器之间进行切换,确保服务在主路由器发生故障时仍能继续运行
主备切换:VRRP模块负责检测主路由器的状态,并在主路由器发生故障时自动将虚拟IP地址切换到备份路由器上
3.3Check模块
作用
健康检查:Check模块负责对后端服务器进行健康检查,以确保它们的可用性。健康检查的方式可以包括端口检查和URL检查
端口检查:通过检查服务器的特定端口是否开放来判断服务器的健康状态。例如,可以检查HTTP服务的80端口是否正常响应
URL检查:通过发送HTTP请求到特定URL并验证响应内容来判断服务器的健康状态。这种检查可以确保服务器不仅端口开放,而且应用服务正常运行
动态负载均衡:根据健康检查的结果,Check模块可以动态调整负载均衡配置,将流量分配到健康的服务器上,避免将请求发送到出现故障的服务器
3.4总结
Core模块:负责Keepalived的核心管理和配置处理,确保系统的整体运行
VRRP模块:实现了虚拟路由器冗余协议,提供高可用性和主备切换功能
Check模块:进行健康检查,确保后端服务器的健康状态,支持动态负载均衡
二、部署LVS+Keepalived高可用集群
实验准备:
4台linux(全部使用NAT模式)
所有服务器全部关闭防火墙以及增强功能
systemctl stop firewalld.service
setenforce 0
1. 配置负载调度器(Master)
Master服务器:172.16.58.10
安装软件
yum -y install ipvsadm keepalived
启动服务
systemctl start keepalived.service
备份文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
修改主配置文件
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,备为backup
interface ens33
virtual_router_id 10
priority 100 ##指定优先级,数值越大越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.58.180
}
}
virtual_server 172.16.58.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.16.58.20 80 { //第一个节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.58.30 80 { //第二个节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
//删除后面的其余配置
调整proc响应参数
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)
Master服务器:172.16.58.40
安装软件
yum -y install ipvsadm keepalived
启动服务
systemctl start keepalived.service
备份文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
修改主配置文件
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 ##指定热备状态,主为master,备为backup
interface ens33
virtual_router_id 10
priority 80 ##指定优先级,数值越大越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.58.180
}
}
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.配置节点服务器
安装服务
yum -y install httpd
启动服务
systemctl start httpd
节点服务器一:172.16.58.20
echo 'this is kgc web!' > /var/www/html/index.html
节点服务器二:172.16.58.30
echo 'this is benet web!' > /var/www/html/index.html
4.配置虚拟IP
在172.16.58.20和172.16.58.30上进行配置
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=172.16.58.180
NETMASK=255.255.255.255
重启网络服务
service network restart 或 systemctl restart network
ifup lo:0
ifconfig lo:0
route add -host 172.16.88.180 dev lo:0
调整proc响应参数
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
5.测试验证
在客户端访问:http://172.16.58.180/ 确认能够正常访问
模拟故障切换
在主服务器关闭 keepalived 服务后再测试
systemctl stop keepalived
客户端重新访问测试
再次在客户端浏览器中访问 http://172.16.58.180/ 确认备份服务器是否能够接管并正常提供服务。如果服务正常,则说明故障切换功能正常,备份服务器成功接管虚拟IP
三、Keepalived脑裂以及解决方法
1.什么是脑裂
脑裂是指在高可用集群中,由于网络或通信故障,主节点和备节点之间失去了联系,导致备节点错误地认为主节点不可用,并接管主节点的服务或资源。然而,由于主节点实际上仍在运行,主备节点会同时服务同一资源(例如同一个虚拟 IP)。这会造成数据不一致、冲突或其他问题
2.经典场景
主备节点之间的网络故障:
例如由于某些网络设备或配置错误,主备节点之间的心跳通信被中断,备节点错误地认为主节点已经失效,导致它自己提升为主节点,同时主节点仍然在工作
双主状态:两个节点都认为自己是主节点,导致服务同时在两台机器上运行
3.常见的问题
IP 冲突
当两个节点都试图绑定同一个虚拟 IP 时,会引起 IP 冲突
服务不一致例如数据库服务的主备节点出现脑裂,可能导致数据不一致或损坏
资源竞争多个节点对相同的资源同时进行操作,可能导致文件系统或存储崩溃等问题
4.解决方法
(1)使用强制优先级策略
Keepalived中的每个节点都有一个优先级(priority),主节点的优先级较高,备节点的优先级较
低。为了避免脑裂,可以确保:
当主节点恢复正常时,它能够优先成为主节点,而备节点自动退位
(2)增加VRRP心跳检测机制
Keepalived依赖心跳消息在主备节点之间交换状态信息,默认情况下每秒发送一次VRRP消息。如果主节点没有在一定时间内收到备节点的心跳消息,它会认为主节点已经失效,从而进行主备切换
(3)使用双主检测脚本(自定义检测)
可以编写自定义脚本,在检测到脑裂时自动关闭服务或阻止该节点继续提供服务,避免两个节点同时接管资源。可以通过 Keepalived 的 track script 功能来实现
#!/bin/bash
# 检查是否有另一个主节点
if ip addr show | grep -q "172.16.58.10"; then
echo "VIP is already in use, shutting down keepalived"
systemctl stop keepalived
fi
在Keepalived配置中插入此脚本
track_script {
check_vip {
script "/opt/check_vip.sh"
interval 2
}
}