一、Keepalived 原理
keepalived 基于 VRRP(虛擬路由冗余協議)實現高可用。
核心原理是通過競選機制在多臺服務器(主 / 備節點)中選舉出一臺主節點承擔服務,同時備節點持續監控主節點狀態:主節點正常時,通過組播發送 VRRP 通告消息宣告存活,獨占虛擬 IP(VIP)對外提供服務;
當主節點故障(如服務中斷、網絡異常),備節點因超時未收到通告,會觸發重新競選,優先級最高的備節點升級為主節點并接管 VIP,實現服務無縫切換,確保業務不中斷。
此外,keepalived 還支持健康檢查(如檢測端口、URL 狀態),可更精準判斷服務可用性。
VRRP 原理
VRRP(虛擬路由冗余協議)是一種實現路由冗余的協議,核心是通過將多臺物理路由器組成一個 “虛擬路由器”,對外提供統一的虛擬 IP(VIP)和虛擬 MAC 地址,避免單點故障。
工作時,虛擬路由器內的設備通過優先級競選主 / 備角色:優先級最高的成為主路由器,承擔數據包轉發任務,并定期發送 VRRP 通告消息(組播)宣告存活;
備份路由器則監聽通告,若超時未收到主路由器消息(判定主節點故障),則觸發重新競選,優先級最高的備份節點升級為主路由器,接管 VIP 和虛擬 MAC,繼續提供路由服務,整個過程對客戶端透明,確保網絡持續可用。
?
?
二、Keepalived 日常配置
2.1.Keepalived 日志獨立
vim /etc/sysconfig/keepalived
########
KEEPALIVED_OPTIONS="-D -S 6"
########
?
vim /etc/rsyslog.conf
########
local7.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /var/log/boot.log
local6.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /var/log/keepalived.log # 添加此條
########
?
systemctl restart rsyslog.service
systemctl restart keepalived.service
?
# 測試:查看新日志文件,有內容則實驗成功
cat /var/log/keepalived.log
?
2.2.Keepalived 子配置文件
vim /etc/keepalived/keepalived.conf
######
include /etc/keepalived/conf.d/*.conf # 在主配置文件添加此條,表示包含 conf.d 目錄下 .conf 結尾的文件
######
?
# 檢查語法
keepalived -t -f /etc/keepalived/keepalived.conf
?
# 重啟服務
systemctl restart keepalived.service
?
?
三、Keepalived 模式配置
3.1.Keepalived 單主模式
實驗準備:兩臺 keepalived 主機,兩臺 rs 主機,一臺 client 主機
ka-master 主機:192.168.67.100
ka-slave 主機:192.168.67.200
rs1主機:192.168.13.10
rs2 主機:192.168.13.20
keepalived 主機配置
# 時間同步
# 100 作為服務vim /etc/chrony.conf端,200 作為客戶端
# 服務端配置(100)
vim /etc/chrony.conf
...
allow 192.168.67.0/24 # 開啟服務端允許 67 網段連接本機
...
systemctl restart chronyd.service
?
#客戶端配置(200)
vim /etc/chrony.conf
...
server 192.168.67.100 iburst
...
systemctl restart chronyd.service
?
# 客戶端測試:查看時間同步結果,顯示 ^* 則同步成功
chronyc sources -v
# 安裝 keepalived 并配置
dnf install keepalived -y
vim /etc/keepalived/keepalived.conf
##################
...
! Configuration File for keepalived
?
global_defs {notification_email {haha@haha.org}notification_email_from haha@haha.orgsmtp_server 127.0.0.0smtp_connect_timeout 30router_id ka-mastervrrp_skip_check_adv_addr# vrrp_strictvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44
}
vrrp_instance VI_1 {state MASTER # slave 主機設置為 BACKUPinterface eth0virtual_router_id 51priority 100 # 優先級,slave 主機設置為 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}
}
...
# 其他都注釋掉
##################
?
# 重啟服務
systemctl restart keepalived.service
systemctl enable --now keepalived.service
?
# 測試:在優先級高的主機上查看 VIP
ifconfig
# 查看組播情況
tcpdump -i eth0 -nn host 224.0.0.44
master 的主機會發送組播消息,告訴 slave 的主機自己存活,如果 master 的主機故障,則會出現 VIP 飄逸到 slave 的主機。
如果 master 主機恢復運行,VIP 會重新漂移到 master 主機,因為 master 主機的優先級高于 slave 主機。
問題:VIP 反復飄逸,會導致網絡波動。
所以產生了非搶占模式。
?
3.2.Keepalived 非搶占模式
在搶占模式的基礎上,修改 Keepalived 主機配置文件
vim /etc/keepalived/keepalived.conf
#######
vrrp_instance VI_1 {state BACKUP # 兩個主機的 state 都需要是 BACKUP,因為非搶占模式沒有主備之分interface eth0virtual_router_id 51priority 100 # 優先級,另一臺主機設置為 80nopreempt # 在搶占模式的基礎上,添加此條,實現非搶占模式advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}
}
#######
測試
systemctl restart keepalived.service
# 停止 master 主機服務
# 發生 VIP 飄逸
systemctl stop keepalived.service
# 再次重啟 master 服務,VIP 不發生飄逸
# master 優先級高于 slave 主機,但是服務恢復后,不發生 VIP 搶占
systemctl start keepalived.service
# VIP 仍然在 slave 上
非搶占模式弊端:如果 slave 主機的性能沒有 master 主機好,那么讓 slave 注意一直承載 VIP 會發生性能瓶頸,所以出現了延遲搶占模式。
3.3.Keepalived 延遲搶占模式
在搶占模式的基礎上,修改 Keepalived 主機配置文件
vim /etc/keepalived/keepalived.conf
#######
vrrp_instance VI_1 {state BACKUP # 延遲搶占模式兩臺主機都為 BACKUPinterface eth0virtual_router_id 51priority 100 # slave 主機優先級 80preempt_delay 10 # 延遲時間配置,默認時間單位 s,不用加 sadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}
}
#######
測試:延遲搶占模式,master 主機故障,VIP 會飄逸到 slave 主機,如果 master 主機恢復 VIP 會在設置的延遲搶占時間完畢后搶占 VIP。
systemctl stop keepalived.service
master 沒有 VIP,VIP 漂移到 slave 上。
10 s 后 VIP 會飄逸回 master。
?
3.4.Keepalived 單播模式
因為 Keepalived 的心跳檢測默認是發送組播的形式保活,會造成網絡擁堵,所以需要配置單播模式,減少網絡流量。
vim /etc/keepalived/keepalived.conf
#######
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 100preempt_delay 10advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}unicast_src_ip 192.168.67.100 # 本機 IP,注意:兩臺主機需按需配置unicast_peer {192.168.67.200 # 對端主機 IP,注意:兩臺主機需按需配置}
}
#######
測試
# 在承載 vIP 的主機上查看單播情況
tcpdump -i eth0 -nn src host 192.168.67.100 and dst 192.168.67.200
?
3.5.Keepalived 郵件告警
Keepalived 下載軟件
注意:Keepalived 主機的主機名要是域名的模式,這樣發郵件才不會被卡住。
# 配置主機名
hostnamectl set-hostname ka-master.zyz.org
?
# 下載軟件
dnf install s-nail sendmail -y
?
vim /etc/mail.rc
######
set from=zhaoyz0911@163.com
set smtp=smtp.163.com
set smtp-auth-user=zhaoyz0911@163.com
set smtp-auth-password=QXbQYU3c48EWe8Ch # 此驗證碼要到郵箱里開啟 POP3 并獲得
set smtp-auth=login
set ssl-verify=ignore
######
?
systemctl restart sendmail.service
netstat -antlupe | grep 25
# 測試郵件是否可以發出
echo hello | mailx -s test zhaoyz0911@163.com
郵箱收到此郵件
vim /etc/keepalived/mail.sh
######
#!/bin/bash
mail_dest='zhaoyz0911@163.com'
?
mail_send()
{mail_subj="$HOSTNAME to be $1 vip 轉移"mail_mess="`date +%F\ %T`: vrrp 轉移,$HOSTNAME 變為 $1"echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 inmaster)mail_send master;;backup)mail_send backup;;fault)mail_send fault;;*)exit 1;;
esac
######
?
chmod +x /etc/keepalived/mail.sh
# 修改 Keepalived 配置文件,添加 keepalived 的狀態變化時,可以自動觸發腳本的功能
vim /etc/keepalived/keepalived.conf
######
! Configuration File for keepalived
?
global_defs {notification_email {haha@haha.org}notification_email_from haha@haha.orgsmtp_server 127.0.0.0smtp_connect_timeout 30router_id ka-mastervrrp_skip_check_adv_addr# vrrp_strictvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44enable_script_security # 啟用腳本安全機制,限制健康檢查腳本的執行權限script_user root # 指定健康檢查腳本的執行用戶為 root
}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 100preempt_delay 10advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}unicast_src_ip 192.168.67.100unicast_peer {192.168.67.200}notify_master "/etc/keepalived/mail.sh master" # 當當前節點從其他狀態切換為 master 狀態時觸發notify_backup "/etc/keepalived/mail.sh backup" # 當當前節點從其他狀態切換為 backup 狀態時觸發notify_fault "/etc/keepalived/mail.sh faild" #當前節點因故障進入 fault 狀態時觸發
}
######
測試
systemctl restart keepalived.service
?
收到 VIP 轉移的郵件,試驗成功
3.6.Keepalived 雙主模式
Keepalived 主機配置
! Configuration File for keepalived
?
global_defs {notification_email {haha@haha.org}notification_email_from haha@haha.orgsmtp_server 127.0.0.0smtp_connect_timeout 30router_id ka-mastervrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44
}
vrrp_instance WEB_VIP {state MASTER # 第二臺 Keepalived 主機改為 BACKUPinterface eth0virtual_router_id 51priority 100 # 第二臺 Keepalived 主機改為 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}
}
vrrp_instance DB_VIP {state BACKUP # 第二臺 Keepalived 主機改為 MASTERinterface eth0virtual_router_id 52 priority 80 # 第二臺 Keepalived 主機改為 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.160/24 dev eth0 label eth0:1}
}
重啟服務,測試
systemctl restart keepalived.service
?
關閉一臺 Keepalived 主機,VIP 自動漂移到第二臺 Keepalived 主機,則有兩個 VIP。
systemctl stop keepalived.service
?
四、Keepalived 高可用
4.1.Keepalived + LVS - DR 單主模式
實驗準備:關閉所有主機的 SElinux 和 防火墻,全都為 NAT 模式網卡
client:192.168.67.123
ka-master:192.168.67.100、VIP:192.168.67.150
ka-slave:192.168.67.200、VIP:192.168.67.150
rs1:192.168.67.10、VIP:192.168.67.150
rs2:198.168.67.20、VIP:192.168.67.150
后端 rs 配置
配置 nginx 服務、配置虛擬網卡添加 VIP、arp 抑制
yum install nginx -y
echo 192.168.67.10 > /usr/share/nginx/html/index.html # 另一個主機配置自己的 IP 作為默認發布文件內容
systemctl enable --now nginx
curl localhost
# 兩個主機都需要配置 VIP
nmcli connection add type dummy ifname rstest ipv4.method manual ipv4.addresses 192.168.67.150/32 connection.autoconnect yes
nmcli connection up dummy-rstest
ip a
# arp 抑制
echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.rstest.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
echo net.ipv4.conf.rstest.arp_announce = 2 >> /etc/sysctl.conf
sysctl -p
Keppalived 主機配置
安裝 ipvsadm 工具、配置 Keepalived 實現后端檢測和負載均衡
yum install ipvsadm -y
修改 Keepalived 配置文件
vim /etc/keepalived/keepalived.conf
########
! Configuration File for keepalived
?
global_defs {notification_email {haha@haha.org}notification_email_from haha@haha.orgsmtp_server 127.0.0.0smtp_connect_timeout 30router_id ka-mastervrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44 # 組播
}
vrrp_instance WEB_VIP {state MASTER # 另一個主機設置為 BACKUPinterface eth0virtual_router_id 51priority 100 # 另一個主機設置為 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}
}
virtual_server 192.168.67.150 80 { # 類似于 ipvsadm -A 調度主機delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.67.10 80 { # 類似于 ipvsadm -a 后端主機weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2retry 3delay_before_retry 3}}real_server 192.168.67.20 80 { # 類似于 ipvsadm -a 后端主機weight 1TCP_CHECK {connect_timeout 2retry 3delay_before_retry 3connect_port 80}}
}
########
?
systemctl restart keepalived.service
驗證:查看 VIP
在持有 VIP 的主機上查看 ipvs 策略
客戶端測試:輪詢結果
4.2.Keepalived + LVS - DR 雙主模式
實驗準備:關閉所有主機的 SElinux 和 防火墻,全都為 NAT 模式網卡
client:192.168.67.123
ka-master:192.168.67.100/24、VIP1:192.168.67.150/24、VIP2:192.168.67.160/24
ka-slave:192.168.67.200/24、VIP1:192.168.67.150/24、VIP2:192.168.67.160/24
rs1:192.168.67.10/24、VIP1:192.168.67.150/32、VIP2:192.168.67.160/32
rs2:198.168.67.20/24、VIP1:192.168.67.150/32、VIP2:192.168.67.160/32
(VIP1 是提供 Nginx 服務的 VIP,VIP2 是提供 Mariadb 服務的 VIP)
后端 rs 配置
配置 nginx 服務:安裝軟件、默認發布文件、測試
配置虛擬網卡添加 VIP、arp 抑制
yum install nginx -y
echo 192.168.67.10 > /usr/share/nginx/html/index.html # 另一個主機配置自己的 IP 作為默認發布文件內容
systemctl enable --now nginx
curl localhost
# 兩個主機都需要配置 VIP
nmcli connection add type dummy ifname rstest ipv4.method manual ipv4.addresses 192.168.67.150/32 connection.autoconnect yes
nmcli connection add type dummy ifname dbtest ipv4.method manual ipv4.addresses 192.168.67.160/32 connection.autoconnect yes
nmcli connection up dummy-rstest
nmcli connection up dummy-dbtest
ip a
# arp 抑制
echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.rstest.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
echo net.ipv4.conf.rstest.arp_announce = 2 >> /etc/sysctl.conf
sysctl -p
配置 Mariadb 服務:安裝軟件、配置 server-id、授權用
# 安裝 mariadb
yum install mariadb-server ?-y
?
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
...
server-id=10 # 添加此行,注意兩個主機的 id 需要不一致
...
?
systemctl enable --now mariadb
?
mysql -e "grant all on *.* to zyz@'%' identified by 'zyz'" # 添加可遠程登錄的用戶
?
# 測試:遠程登錄 mysql
mysql -uzyz -pzyz -h192.168.13.10
mysql -uzyz -pzyz -h192.168.13.20
測試 mysql server_id
Keppalived 主機配置
安裝 ipvsadm 工具、配置 Keepalived 實現后端檢測和負載均衡
yum install ipvsadm -y
修改 Keepalived 配置文件:雙主模式,需要配置兩個 vrrp_instance 和兩個 virtual_server,一個提供 Web 服務,一個提供 Mysql 服務。
vim /etc/keepalived/keepalived.conf
########
! Configuration File for keepalived
?
global_defs {notification_email {haha@haha.org}notification_email_from haha@haha.orgsmtp_server 127.0.0.0smtp_connect_timeout 30router_id ka-mastervrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44 # 組播
}
vrrp_instance WEB_VIP {state MASTER # 另一個主機設置為 BACKUPinterface eth0virtual_router_id 51priority 100 # 另一個主機設置為 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}
}
vrrp_instance DB_VIP {state BACKUP # 另一個主機設置為 MASTERinterface eth0virtual_router_id 52priority 80 # 另一個主機設置為 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.160/24 dev eth0 label eth0:1}
}
virtual_server 192.168.67.150 80 { # 提供 Web 服務的 VIP,端口 80delay_loop 6lb_algo rrlb_kind DRprotocol TCP
?real_server 192.168.67.10 80 { # 提供 Web 服務的 RS1,端口80weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2retry 3delay_before_retry 3}}real_server 192.168.67.20 80 { # 提供 Web 服務的 RS2,端口80weight 1TCP_CHECK {connect_timeout 2retry 3delay_before_retry 3connect_port 80}}
}
virtual_server 192.168.67.160 3306 { # 提供 Mysql 服務的 VIP,端口 3306delay_loop 6lb_algo rrlb_kind DRprotocol TCP
?real_server 192.168.67.10 3306 { # 提供 Mysql 服務的 RS1,端口 3306weight 1TCP_CHECK {connect_timeout 10retry 3delay_before_retry 5connect_port 3306}}real_server 192.168.67.20 3306 { # 提供 Mysql 服務的 RS2,端口 3306weight 1TCP_CHECK {connect_timeout 10retry 3delay_before_retry 5connect_port 3306}}
}
########
?
systemctl restart keepalived.service
驗證:查看 VIP
查看 ipvs 策略,兩個 Keepalived 主機都可查到
客戶端測試:Web 結果
客戶端測試:Mysql 結果
?
4.3.Keepalived + HAProxy(Vrrp)腳本檢測修改優先級
實驗準備:關閉所有主機的 SElinux 和 防火墻,全都為 NAT 模式網卡
client:192.168.67.123
ka-master:192.168.67.100/24、VIP:192.168.67.150/24
ka-slave:192.168.67.200/24、VIP:192.168.67.150/24
rs1:192.168.67.10/24
rs2:198.168.67.20/24
Haproxy 實現后端檢測和流量分發,Keepalived 實現 HAProxy 的健康檢測,如果 HAProxy 故障,通過 VRRP 健康檢測腳本實現動態改變優先級,實現 VIP 的漂移。Keepalived + HAProxy 模式只能使用搶占模式和延遲搶占模式,不適用于非搶占模式。
后端 rs 配置
配置 nginx 服務:安裝軟件、默認發布文件、測試
yum install nginx -y
echo 192.168.67.10 > /usr/share/nginx/html/index.html # 另一個主機配置自己的 IP 作為默認發布文件內容
systemctl enable --now nginx
curl localhost
Keepalived 主機配置 HAProxy 服務
兩個 Keepalived 主機都需配置 HAProxy 服務,內容相同。
yum install haproxy -y
vim /etc/haproxy/haproxy.cfg
# 除以下內容都注釋掉
##########
globallog ? ? ? ? 127.0.0.1 local2chroot ? ? /var/lib/haproxypidfile ? ? /var/run/haproxy.pidmaxconn ? ? 4000user ? ? ? haproxygroup ? ? ? haproxydaemonstats socket /var/lib/haproxy/statsssl-default-bind-ciphers PROFILE=SYSTEMssl-default-server-ciphers PROFILE=SYSTEM
defaultsmode ? ? ? ? ? ? ? ? ? httplog ? ? ? ? ? ? ? ? ? ? globaloption ? ? ? ? ? ? ? ? httplogoption ? ? ? ? ? ? ? ? dontlognulloption http-server-closeoption forwardfor ? ? ? except 127.0.0.0/8option ? ? ? ? ? ? ? ? redispatchretries ? ? ? ? ? ? ? ? 3timeout http-request ? 10stimeout queue ? ? ? ? ? 1mtimeout connect ? ? ? ? 10stimeout client ? ? ? ? 1mtimeout server ? ? ? ? 1mtimeout http-keep-alive 10stimeout check ? ? ? ? ? 10smaxconn ? ? ? ? ? ? ? ? 3000
listen webclusterbind ? *:80mode ? httpbalance roundrobinserver web1 192.168.67.10:80 check inter 3 fall 2 rise 2server web2 192.168.67.20:80 check inter 3 fall 2 rise 2
#############
Keepalived 主機配置 Keepalived 服務
mkdir /etc/keepalived/scrips/
?
cat >> /etc/keepalived/scrips/haproxy.sh << EOF
#!/bin/bash
killall -0 haproxy &> /dev/null
EOF
?
chmod +x /etc/keepalived/scrips/haproxy.sh
?
?
vim /etc/keepalived/keepalived.conf
#############
! Configuration File for keepalived
global_defs {notification_email {haha@haha.org}notification_email_from haha@haha.orgsmtp_server 127.0.0.0smtp_connect_timeout 30router_id ka-mastervrrp_skip_check_adv_addrvrrp_garp_interval 1vrrp_gna_interval 1vrrp_mcast_group4 224.0.0.44enable_script_security # 啟用腳本安全檢查機制script_user root # 指定執行腳本時使用的用戶身份為 root
}
vrrp_script TEST_CHECK { # 定義健康檢查腳本script "/etc/keepalived/scrips/haproxy.sh" # 腳本路徑interval 1 # 腳本執行間隔,每1秒檢查一次weight -30 # 腳本返回值非 0 時,當前節點優先級減少30fall 2 # 連續失敗2次后,判定服務異常rise 2 # 連續成功2次后,判定服務恢復正常timeout 2 # 腳本執行超時時間,超過2秒視為執行失敗
}
vrrp_instance WEB_VIP {state MASTER # 第二臺主機配置為 BACKUPinterface eth0virtual_router_id 51priority 100 # 第二臺主機配置為 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.150/24 dev eth0 label eth0:0}track_script { # 關聯健康檢查腳本TEST_CHECK # 引用上面定義的 TEST_CHECK 腳本,監控haproxy 狀態}unicast_src_ip 192.168.67.100 # 單播配置:源 IP,第二臺主機配置為本機 IPunicast_peer {192.168.67.200 # 單播配置:目標 IP,第二臺主機配置為對方 IP}
}
#############
?
echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.conf
sysctl -p
?
systemctl start keepalived.service
systemctl enable --now keepalived.service
systemctl start haproxy
systemctl enable --now haproxy
測試
持有 VIP 的主機查看單播情況:可以看到 vrid 51 的優先級是 100.
在此主機上關閉 HAProxy 服務,Keepalived 檢測到 HAProxy 故障,運用腳本降低此主機的優先級為 70。
再開啟此主機上的 HAProxy 服務,可以看到優先級恢復為 100。
在以上的操作過程中,client 客戶端訪問 VIP,Web 服務不停滯,客戶端感受不到服務的故障,實現了高可用。
?
?
五、總結
LVS + Keepalived
LVS 本身是內核態的負載均衡模塊(工作在 TCP/IP 協議棧的傳輸層),但它的管理和后端健康檢查依賴 Keepalived實現。
Keepalived 不僅負責 LVS 的主備高可用(VIP 漂移),還內置了對后端 RS 的健康檢查(如 ICMP、TCP 端口檢測),并能動態調整 LVS 的路由表(通過 ipvsadm 接口)。
簡單說:Keepalived 是 “大腦”,既管高可用,又管后端檢測和指揮 LVS 做流量分發;LVS 更像 “執行器”,只負責按 Keepalived 的規則轉發流量。
HAProxy + Keepalived
HAProxy 是用戶態的負載均衡軟件(工作在應用層),自帶完整的流量分發邏輯(支持 HTTP/HTTPS 等七層規則)和后端 RS 健康檢查(更精細,如 URL 返回碼檢測)。
此時 Keepalived 的作用被簡化:僅負責 HAProxy 的主備高可用(監控 HAProxy 進程狀態,通過優先級調整實現 VIP 漂移),不參與流量分發和后端檢測。
簡單說:HAProxy 是 “全能選手”,自己管流量分發和后端檢測;Keepalived 只當 “保鏢”,確保 HAProxy 本身不單點故障。
底層核心差異: LVS 與 Keepalived 的耦合度更高(Keepalived 原生支持 LVS 配置),而 HAProxy 是獨立的負載均衡器,Keepalived 僅為其提供高可用保障。這種差異導致 LVS 方案更適合四層高性能場景,HAProxy 方案更適合七層復雜規則場景。