目錄
#1.1Keepalived雙機熱備基礎知識
? 1.1.1Keepalived概述及安裝
? 1.1.2Keepalived的熱備方式
? 1.1.3Keepalived的安裝與服務控制
#2.1使用Keeplived實現雙機熱備
? 2.1.1主服務器的配置
? 2.1.2備用服務器的配置
? 2.1.3測試雙機熱備功能
#3.1使用Keeplived實現雙機熱備的實驗案例
? 3.1.1基礎環境配置
? 3.1.2配置主調度器
? 3.1.3配置從調度器
? 3.1.4配置Web節點服務器
? 3.1.5測試LVS+Keepalived高可用群集
1.1Keepalived雙機熱備基礎知識
? ??Keepalived 起初是專門針對 LVS 設計的一款強大的輔助工具,主要用來提供故障切換(Failover)和健康檢查(Health Checking)功能 —— 判斷 LVS 負載調度器、節點服務器的可用性,當 master 主機出現故障及時切換到 backup 節點保證業務正常,當 master 故障主機恢復后將其重新加入群集并且業務重新切換回 master 節點。
1.1.1Keepalived概述及安裝
? ??Keepalived 的官方網站位于?Keepalived for Linux,本章將以 YUM 方式講解 Keepalived 的安裝、配置和使用過程。在非 LVS 群集環境中使用時,Keepalived 也可以作為熱備軟件使用。
1.1.2Keepalived的熱備方式
? ?Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虛擬路由冗余協議)熱備份協議,以軟件的方式實現 Linux 服務器的多機熱備功能。VRRP 是針對路由器的一種備份解決方案 —— 由多臺路由器組成一個熱備組,通過共用的虛擬 IP 地址對外提供服務;每個熱備組內同一時刻只有一臺主路由器提供服務,其他路由器處于冗余狀態。若當前在線 的路由器失效,則其他路由器會自動接替(優先級決定接替順序)虛擬 IP 地址,以繼續提供服務,如圖 3.1 所示。
? ? 熱備組內的每臺路由器都可能成為主路由器,虛擬路由器的 IP 地址(VIP)可以在熱備組內的路由器之間進行轉移,所以也稱為漂移 IP 地址。使用 Keepalived 時,漂移地址的實現不需要手動建立虛接口配置文件(如 ens33 :0),而是由 Keepalived 根據配置文件自動管理。
?
?
1.1.3Keepalived的安裝與服務控制
(1)安裝Keepalived
[root@localhost ~]# yum install -y keepalived ipvsadm
(2)控制Keepalived服務
[root@localhost ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
2.1使用Keepalived實現雙機熱備
? ? ?基于 VRRP 的熱備方式,Keepalived 可以用作服務器的故障切換,每個熱備組可以有 多臺服務器 —— 當然,最常用的就是雙機熱備了。在這種雙機熱備方案中,故障切換主要針對虛擬 IP 地址的漂移來實現,因此能夠適用于各種應用服務器(不管是 Web、FTP、Mail,還是 SSH、DNS……)。
? ? ?本小節將通過一個簡單的案例來說明 Keepalived 雙機熱備的配置方法。其中,主、備服務器的 IP 地址分別為 192.168.10.101 和 192.168.10.102,基于漂移地址 192.168.10.100 提供 Web 服務,如圖 3.2 所示。
? ?主,備服務器中都安裝Keepalived,使用DNF方式安裝httpd提供Web服務。
2.1.1主服務器的配置
[root@localhost ~]# systemctl stop firewalld // 關閉防火墻
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf.sample keepalived.conf
[root@localhost keepalived]# vi keepalived.conf
global_defs {
router_id HA_TEST_R1 // 本路由器 (服務器) 的名稱
}
vrrp_instance VI_1 { // 定義 VRRP 熱備實例
state MASTER // 熱備狀態,MASTER 表示主服務器
interface ens33 // 承載 VIP 地址的物理接口
virtual_router_id 1 // 虛擬路由器的 ID 號,每個熱備組保持一致
priority 100 // 優先級,數值越大優先級越高
advert_int 1 // 通告間隔秒數 (心跳頻率)
authentication { // 認證信息,每個熱備組保持一致
auth_type PASS // 認證類型
auth_pass 123456 // 密碼字串
}
virtual_ipaddress { // 指定漂移地址 (VIP), 可以有多個
192.168.10.100
}
}
[root@localhost keepalived]# systemctl start keepalived
[root@localhost keepalived]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:93:80:fb brd ff:ff:ff:ff:ff:ff
inet 192.168.10.101/24 brd 172.16.16.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33 // 自動設置的 VIP 地址
valid_lft forever preferred_lft forever
inet6 fe80::56be:f27:2b9b:823e/64 scope link
valid_lft forever preferred_lft forever
2.1.2備用服務器的配置
[root@localhost ~]# systemctl stop firewalld // 關閉防火墻
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf.sample keepalived.conf
[root@localhost keepalived]# vi keepalived.conf
global_defs {
router_id HA_TEST_R2 // 本路由器 (服務器) 的名稱
}
vrrp_instance VI_1 {
state BACKUP // 熱備狀態,BACKUP 表示備用服務器
priority 99 // 優先級,數值應低于主服務器
…… // 省略部分內容
}
[root@localhost keepalived]# systemctl start keepalived
[root@localhost keepalived]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:d1:f0:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.102/24 brd 172.16.16.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::1f08:ab66:736f:72eb/64 scope link
valid_lft forever preferred_lft forever
2.1.3測試雙機熱備功能
? ? Keepalived 的日志消息保存在 /var/log/messages 文件中,在測試主、備故障自動切換功能時,可以跟蹤此日志文件來觀察熱備狀態的變化。以針對連通性和 Web 服務的測試為例,主要操作如下。
(1)連通性測試
? ? ?在客戶機中執行 “ping -t 192.168.10.100” 命令,能夠正常、持續 ping 通,根據以下操作繼續觀察測試結果。
? ? ?① 停止啟用主服務器的 Keepalived 服務,發現 ping 測試只中斷了 1 或 2 個包即恢復正常,說明已有其他服務器接替 VIP 地址,并及時響應客戶機請求。
? ? ?② 重新啟用主服務器的 Keepalived 服務,發現 ping 測試再次中斷 1 或 2 個包即恢復正常,說明主服務器已恢復正常,并奪回 VIP 地址的控制權。
(2)Web 訪問測試
? ? ?在 keepalived 運行的主機上啟動 nginx 服務并寫入不通的測試頁面內容
Keepalived01
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# echo “web01” >/usr/share/nginx/html/index.html
Keepalived02
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# echo “web02” >/usr/share/nginx/html/index.html
? ?在客戶機中訪問?http://192.168.10.100/,將看到由主服務器 192.168.10.101 提供的網頁文檔。
① 停止啟用主服務器的 Keepalived 服務,再次訪問上述 Web 服務,將看到由備用服務
器 192.168.10.102 提供的網頁文檔,說明 VIP 地址已切換至備用服務器。
② 重新啟用主服務器的 Keepalived 服務,再次訪問上述 Web 服務,將看到重新由主服
務器 192.168.10.101 提供的網頁文檔,說明主服務器已重新奪取 VIP 地址。
(3)查看日志記錄
在執行主、備服務器故障切換的過程中,分別觀察各自的 /var/log/messages 日志文件,可以看到 MASTER、SLAVE 狀態的遷移記錄。
① 主服務器中,Keepalived 服務狀態先變為 “stop”,移除 VIP 地址,恢復后重新變為 MASTER。
[root@localhost ~]# less /var/log/messages
…… // 省略部分信息
Sep 11 13:32:24 localhost Keepalived[18259]: Stopping Keepalived v1.2.13 (11/05,201
6)
Sep 11 13:32:24 localhost systemd: Stopping LVS and VRRP High Availability Monito
r...
Sep 11 13:32:24 localhost Keepalived_vrrp[18261]: VRRP_Instance(VI_1) sending 0 prio
rity
Sep 11 13:32:24 localhost Keepalived_vrrp [18261]: VRRP_Instance (VI_1) removing proto
col VIPs.
…… // 省略部分信息
Sep 11 13:36:42 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Transition to
MASTER STATE
Sep 11 13:36:42 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Received lower
prio advert, forcing new election
Sep 11 13:36:43 localhost Keepalived_vrrp[18280]: VRRP_Instance(VI_1) Entering MASTE
R STATE
Sep 11 13:36:43 localhost Keepalived_vrrp [18280]: VRRP_Instance (VI_1) setting protoc
ol VIPs.
…… // 省略部分信息
② 備用服務器中,狀態先切換為 MASTER,待主服務器恢復后再交回控制權。
[root@localhost ~]# less /var/log/messages
…… // 省略部分信息
Sep 11 13:12:43 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Transition to
MASTER STATE
Sep 11 13:12:44 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering MASTE
R STATE
Sep 11 13:12:44 localhost Keepalived_vrrp [25338]: VRRP_Instance (VI_1) setting protoc
ol VIPs.
…… // 省略部分信息
Sep 11 13:14:23 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Received highe
r prio advert
Sep 11 13:14:23 localhost Keepalived_vrrp[25338]: VRRP_Instance(VI_1) Entering BACKU
P STATE
Sep 11 13:14:23 localhost Keepalived_vrrp [25338]: VRRP_Instance (VI_1) removing proto
col VIPs.
…… // 省略部分信息
? ?通過上述測試過程,可以發現雙機熱備已經正常。客戶機只要通過 VIP 地址就可以訪問服務器所提供的 Web 等應用。其中,任何一臺服務器失效,另一臺服務器將會立即接替服務,從而實現高可用性。實際應用時,注意主、備服務器所提供的 Web 服務內容要保持一致。
3.1使用Keepalived實現雙機熱備的實驗案例
? ? Keepalived 的設計目標是構建高可用的 LVS 負載均衡群集,可以調用 ipvsadm 工具來創建虛擬服務器、管理服務器池,而不僅僅用作雙機熱備。使用 Keepalived 構建 LVS 群集更加簡便易用,主要優勢體現在:對 LVS 負載調度器實現熱備切換,提高可用性;對服務器池中的節點進行健康檢查,自動移除失效節點,恢復后再重新加入。
? ? 在基于 LVS+Keepalived 實現的 LVS 群集結構中,至少包括兩臺熱備的負載調度器,三臺以上的節點服務器。本節將以 DR 模式的 LVS 群集為基礎,增加一臺從負載調度器,使用 Keepalived 來實現主、從調度器的熱備,從而構建兼有負載均衡、高可用兩種能力的 LVS 網站群集平臺,如圖 3.3 所示。
? ?使用 Keepalived 構建 LVS 群集時,也需要用到 ipvsadm 管理工具。但大部分工作會由 Keepalived 自動完成,不需要手動執行 ipvsadm(除了查看和監控群集以外)。下面主要講解 Keepalived 的服務器池設置,關于 NFS 共享服務的配置、Keepalived 的熱備配置等在此不再詳細闡述。
操作系統 | 配置 | 主機名 | IP | 服務 |
---|---|---|---|---|
OpenEuler24 | 2C4G | lb01 | 192.168.10.101 | Keepalived/ipvsadm |
OpenEuler24 | 2C4G | lb01 | 192.168.10.102 | Keepalived/ipvsadm |
OpenEuler24 | 2C4G | web01 | 192.168.10.103 | Nginx |
OpenEuler24 | 2C4G | web02 | 192.168.10.104 | Nginx |
OpenEuler24 | 2C4G | nfs-server | 192.168.10.105 | nfs-utils/rpcbind |
?3.1.1基礎環境配置
關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
關閉內核安全機制
setenforce 0
安裝Keepalived以及ipvsadm
dnf -y install keepalived ipvsadm
3.1.2配置主調度器
(1)全局配置,熱備配置
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_HA_R1 // 主調度器的名稱
}
vrrp_instance VI_1 {
state MASTER // 主調度器的熱備狀態
interface ens33
virtual_router_id 1
priority 100 // 主調度器的優先級
advert_int 1
authentication { // 主、從熱備認證信息
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { // 指定群集 VIP 地址
192.168.10.100
}
}
(2)Web服務器池配置
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
…… #省略部分信息
virtual_server 192.168.10.100 80 {#虛擬服務器地址 (VIP)、端口
delay_loop 15 #健康檢查的間隔時間 (秒)
lb_algo rr #輪詢 (rr) 調度算法
lb_kind DR #直接路由 (DR) 群集工作模式
! persistence 60 #連接保持時間 (秒), 若啟用請去掉!號
protocol TCP #應用服務采用的是 TCP 協議
real_server 192.168.10.103 80 { #第一個 Web 節點的地址、端口
weight 1 #節點的權重
TCP_CHECK { #健康檢查方式
connect_port 80 #檢查的目標端口
connect_timeout 3 #連接超時 (秒)
nb_get_retry 3 #重試次數
delay_before_retry 4 // 重試間隔 (秒)
}
}
}
real_server 192.168.10.104 80 { #第二個 Web 節點的地址、端口
…… #省略部分信息
}
}
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 兩個 DS,一個為 MASTER 一個為 BACKUP
interface ens33 # 當前 IP 對應的網絡接口,通過 ifconfig 查詢
virtual_router_id 62# 虛擬路由 ID (0 - 255),在一個 VRRP 實例中主備服務器 ID 必須一樣
priority 100 # 優先級值設定:MASTER 要比 BACKUP 的值大
advert_int 1 # 通告時間間隔:單位秒,主備要一致
authentication { # 認證機制,主從節點保持一致即可
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100 # VIP,可配置多個
}
}
vim keepalived
virtual_server 192.168.10.100 80 {
delay_loop 3 # 設置健康狀態檢查時間
lb_algo rr # 調度算法,這里用了 rr 輪詢算法
lb_kind DR # 這里測試用了 Direct Route 模式
persistence_timeout 50 # 持久連接超時時間,注意添加此項配置客戶端連續請求時,請求到同一節點
protocol TCP
real_server 192.168.10.103 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3 # 舊版本為 nb_get_retry
delay_before_retry 3# 重試間隔 3 秒
connect_port 80
}
}
real_server 192.168.10.104 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 80
}
}
}
(3)重新啟動Keepalived服務
? ?systemctl? restart keepalived
3.1.3配置從調度器
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_HA_R2
// 從調度器的名稱
}
vrrp_instance VI_1 {
state BACKUP // 從調度器的熱備狀態
priority 90 // 從調度器的優先級
…… // 省略部分信息
}
virtual_server 192.168.10.100 80 {
…… // 省略部分信息
}
[root@localhost ~]# systemctl restart keepalived
3.1.4配置Web節點服務器
bash
# 修改為自己的 VIP
vip=192.168.207.200
case $1 in
start)# 設置 ARP 參數echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/all/arp_announceecho "1" > /proc/sys/net/ipv4/conf/default/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/default/arp_announceecho "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/lo/arp_announce# 臨時添加 VIP(重啟失效)sudo ip addr add ${vip}/32 dev lo label lo:0# 臨時添加路由(重啟失效)sudo ip route add local ${vip}/32 dev lo# 永久生效(通過 rc.local 或 NetworkManager 腳本)echo "ip addr add ${vip}/32 dev lo label lo:0" | sudo tee -a /etc/rc.localecho "ip route add local ${vip}/32 dev lo" | sudo tee -a /etc/rc.localsudo chmod +x /etc/rc.local;;
stop)# 恢復 ARP 參數echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/all/arp_announceecho "0" > /proc/sys/net/ipv4/conf/default/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/default/arp_announceecho "0" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" > /proc/sys/net/ipv4/conf/lo/arp_announce# 移除臨時添加的 VIPsudo ip addr del ${vip}/32 dev lo label lo:0# 移除臨時添加的路由sudo ip route del local ${vip}/32 dev lo# 從 rc.local 中移除永久設置sudo sed -i "/ip addr add ${vip}\/32 dev lo label lo:0/d" /etc/rc.localsudo sed -i "/ip route add local ${vip}\/32 dev lo/d" /etc/rc.local;;
*)echo "Usage: $0 {start|stop}"exit 1
esac
exit 0