文章目錄
- 前言
- 一、keepalived概念和原理
- 1、keepalived介紹
- 2、vrrp工作原理
- 3、keepalived主要模塊
- 二、腦裂問題和解決方案
- 1、什麼是腦裂
- 2、原因
- 解決策略
- 三、LVS+keepalived部署
- 1、環境準備
- 2、通用操作(所有節點)
- 2.1、關閉防火牆和selinux
- 2.2、安裝依賴包
- 3、配置節點(DR)-keepalived
- 3.1、配置主節點-keepalived
- 3.2、配置備用節點-keepalived
- 3.3、主備節點參數優化
- 4、節點配置
- 4.1、配置 VIP 到 lo 接口
- 4.2、ARP 參數調整,避免MAC衝突
- 5、啓動服務
- 6、測試
- 7、小結
- 總結
前言
上一章節介紹了LVS的部署,本文主要介紹keepalived和部署keepalived在LVS上的內容。
本文圍繞 LVS+Keepalived 高可用負載均衡集羣展開,先解析核心概念與 VRRP 原理,再闡述腦裂問題解決方案,最後提供從環境配置到測試驗證的完整部署實操指南。
一、keepalived概念和原理
1、keepalived介紹
- 基於 VRRP 協議實現高可用(HA)
- 初衷是為 LVS 負載均衡提供高可用方案,後來支持其他服務(如 Nginx、MySQL 等)
- 具體實現功能:
1、LVS集羣管理
2、節點健康檢查
3、故障自動切換
4、高可用vip接管
2、vrrp工作原理
- MASTER 節點發送心跳(通告)給 BACKUP 節點。
- BACKUP 節點收不到心跳時,接管 VIP。
- MASTER 恢復時,可搶回 VIP(搶佔模式)或不搶回(非搶佔模式)。
- 默認多播地址:224.0.0.18
- 優先級決定 MASTER 節點(數值越大優先)。
3、keepalived主要模塊
core : 核心進程、配置文件加載解析
vrrp : VRRP 協議實現,高可用
check : 健康檢查,支持 TCP/HTTP/腳本檢查
二、腦裂問題和解決方案
1、什麼是腦裂
兩個節點失去心跳連接,均認為對方掛掉
結果:
1、共享資源衝突
2、數據損壞(如數據庫)
2、原因
- 心跳線故障(斷線、老化)
高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信。如心跳線壞了(包括斷了,老化)。 - 網卡/驅動故障
因網卡及相關驅動壞了,ip配置及衝突問題(網卡直連)。 - 心跳網絡設備故障
因心跳線間連接的設備故障(網卡及交換機)。 - 仲裁機器異常
因仲裁的機器出問題 - 防火牆阻擋 VRRP
高可用服務器上開啓了 iptables防火牆阻擋了心跳消息傳輸。 - 配置不一致(virtual_router_id、優先級、實例名)
Keepalive配置裏同一 VRRP實例如果 virtual_router_id兩端參數配置不一致也會導致裂腦問題發生。 - vrrp實例名字不一致、優先級一致。
解決策略
1、雙心跳線冗餘
添加冗餘的心跳線,例如:雙線條線(心跳線也HA),儘量減少“裂腦”發生機率。
2、磁盤鎖(鎖定共享資源)
正在服務一方鎖住共享磁盤,“裂腦”發生時,讓對方完全“搶不走”共享磁盤資源。但使用鎖磁盤也會有一個不小的問題,如果佔用共享盤的一方不主動“解鎖”,另一方就永遠得不到共享磁盤。現實中假如服務節點突然死機或崩潰,就不可能執行解鎖命令。後備節點也就接管不了共享資源和應用服務。於是有人在HA中設計了“智能”鎖。即:正在服務的一方只在發現心跳線全部斷開(察覺不到對端)時才啓用磁盤鎖。平時就不上鎖了。
3、仲裁機制(Ping 參考 IP)
例如設置參考IP(如網關IP),當心跳線完全斷開時,2個節點都各自ping一下參考IP,不通則表明斷點就出在本端。不僅“心跳”、還兼對外“服務”的本端網絡鏈路斷了,即使啓動(或繼續)應用服務也沒有用了,那就主動放棄競爭,讓能夠ping通參考IP的一端去起服務。更保險一些,ping不通參考IP的一方乾脆就自我重啓,以徹底釋放有可能還佔用着的那些共享資源。
4、腳本監控報警
三、LVS+keepalived部署
1、環境準備
主 DR:192.168.10.103(MASTER)
備 DR:192.168.10.104(BACKUP)
VIP:192.168.10.180
Web 節點:
192.168.10.101
192.168.10.102
客户端:192.168.10.2
2、通用操作(所有節點)
2.1、關閉防火牆和selinux
# 關閉防火牆和增強服務
systemctl stop firewalld
setenforce 0
# 永久關閉SELinux(需重啓)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.2、安裝依賴包
主 / 備 LVS 節點:安裝 keepalived、ipvsadm和加載ip_vs
# 下載安裝keepalived
yum -y install ipvsadm keepalived
# 加載lvs模塊
modprobe ip_vs
cat /proc/net/ip_vs # 檢查模塊
後端 RealServer:安裝 httpd或nginx(用於測試負載均衡)
yum install -y httpd && systemctl enable httpd
如果需要使用nginx可以看之前的nginx編譯安裝流程。當然也可以yum install -y nginx(不推薦,更新、模塊、安裝路徑無法控制)
3、配置節點(DR)-keepalived
3.1、配置主節點-keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
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
interface ens33
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180/32
}
}
virtual_server 192.168.10.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.101 80 {
weight 1 # 服務器的權重
# 對後端服務器的TCP 層健康檢查.(檢測 80 端口是否存活)
TCP_CHECK {
connect_port 80 # 檢查的端口(後端 HTTP 服務端口)
connect_timeout 3 # 連接超時時間(3 秒)
nb_get_retry 3 # 連接失敗時的重試次數(3 次)
delay_before_retry 3 # 重試間隔(3 秒)
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3.2、配置備用節點-keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_02 # MASTER 為 LVS_01,BACKUP 為 LVS_02
smtp_server 127.0.0.1
}
vrrp_instance VI_1 {
state BACKUP # BACKUP 節點寫 BACKUP
interface ens33
virtual_router_id 10
priority 90 # MASTER 高於 BACKUP
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180/32
}
}
virtual_server 192.168.10.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.101 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3.3、主備節點參數優化
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
4、節點配置
4.1、配置 VIP 到 lo 接口
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
# 內容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0
4.2、ARP 參數調整,避免MAC衝突
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、啓動服務
測試頁面寫入內容
# 192.168.10.101
echo 'this is 192.168.10.101 web01!' > /var/www/html/index.html
# 192.168.10.102
echo 'this is 192.168.10.102 web02!' > /var/www/html/index.html
啓動服務
systemctl restart httpd # rs節點
systemctl restart nginx # rs節點
systemctl restart keepalived # 主備節點
6、測試
主節點啓動keepalived正常顯示如下:
備節點啓動keepalived正常顯示如下:
7、小結
1、VIP
DR 節點配置 VIP 網卡 ens33:0,Web 節點配置 lo:0
2、搶佔模式
MASTER 恢復會搶回 VIP,非搶佔模式需配置 nopreempt
3、健康檢查
Keepalived 支持 TCP/HTTP 檢查,可防止故障節點被調度
4、防火牆
Firewalld 需關閉,確保 VRRP 心跳消息暢通
5、腦裂防護
雙心跳線、磁盤鎖、仲裁 IP、腳本監控
總結
本文通過標準化部署流程與參數優化,實現了 LVS+Keepalived 集羣的負載均衡與故障自動切換,規避腦裂風險,為業務高可用提供可靠實操方案。