文章目錄

  • 前言
  • 一、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、原因

  1. 心跳線故障(斷線、老化)
    高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信。如心跳線壞了(包括斷了,老化)。
  2. 網卡/驅動故障
    因網卡及相關驅動壞了,ip配置及衝突問題(網卡直連)。
  3. 心跳網絡設備故障
    因心跳線間連接的設備故障(網卡及交換機)。
  4. 仲裁機器異常
    因仲裁的機器出問題
  5. 防火牆阻擋 VRRP
    高可用服務器上開啓了 iptables防火牆阻擋了心跳消息傳輸。
  6. 配置不一致(virtual_router_id、優先級、實例名)
    Keepalive配置裏同一 VRRP實例如果 virtual_router_id兩端參數配置不一致也會導致裂腦問題發生。
  7. 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正常顯示如下:

LVS+Keepalived負載均衡高可用羣集_#運維


備節點啓動keepalived正常顯示如下:

LVS+Keepalived負載均衡高可用羣集_#負載均衡_02

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 集羣的負載均衡與故障自動切換,規避腦裂風險,為業務高可用提供可靠實操方案。