LVS-DR+Keepalived高可用集群
- 什么是高可用集群?
- 高可用集群的衡量標準
- 自動切換/故障轉移(FailOver)
- 自動偵測
- 腦裂
- 常見解決方案
- Keepalived
- Keepalived是什么?
- keepalived作業原理
- keepalived主要有三個模塊
- Keepalived配置
- 初識Keepalived,實作Web服務器的高可用集群
- Keepalived感知Nginx
- Keepalived+LVS-DR集群配置
什么是高可用集群?
- 高可用集群(High Availability Cluster,簡稱HA Cluster),是指以減少服務中斷時間為目的的服務器集群技術,
- 它通過保護用戶的業務程式對外不間斷提供的服務,把因軟體、硬體、人為造成的故障對業務的影響降低到最小程度
高可用集群的衡量標準
- 要保證集群服務的100%時間永遠完全可用,幾乎可用說是一件不可能完成的任務,
- 比如,淘寶在這幾年雙十一剛開始的時候,一下子進來買東西的人很多,訪問量大,都出現一些問題,如下單后卻支付不了,所以說只能保證服務盡可能的可用,當然有些場景相信還是可能做到100%可用的,
- 通常用平均無故障時間(MTTF:mean time to failure)來度量系統的可靠性,用平均故障維修時間(MTTR:mean time to restoration)來度量系統的可維護性,于是可用性被定義為:HA=MTTF/(MTTF+MTTR)*100%,
具體HA(高可用)衡量標準:

- 其他高可用方案heartbeat、pacemaker、piranha (web頁面)
自動切換/故障轉移(FailOver)
- 自動切換階段某一主機如果確認對方故障,則正常主機除繼續進行原來的任務,還將依據各種容錯備援模式接管預先設定的備援作業程式,并進行后續的程式及服務,
- 通俗地說,即當A無法為客戶服務時,系統能夠自動地切換,使B能夠及時頂上繼續為客戶提供服務,且客戶感覺不到這個為他提供服務的物件已經更換,
- 通過上面判斷節點故障后,將高可用集群資源(如VIP、httpd等)從該不具備法定票數的集群節點轉移到故障轉移域(Failover Domain,可以接收故障資源轉移的節點),
自動偵測
- 自動偵測階段由主機上的軟體通過冗余偵測線,經由復雜的監聽程式,邏輯判斷,來相互偵測對方運行的情況,
- 常用的方法是:集群各節點間通過心跳資訊判斷節點是否出現故障,
腦裂
在高可用(HA)系統中,當聯系2個節點的“心跳線"斷開時,本來為一整體、動作協的HA系統,就分裂成為2個獨立的個體,由于相互失去了聯系,都以為是對方出了故障,兩個節點上的HA軟體像“裂腦人"一樣,爭搶“共享資源"、爭起"“應用服務",就會發生嚴重后果——或者共享資源被瓜分、2邊"服務"都起不來了;或者2邊“服務"都起來了,但同時讀寫"共享存盤",導致資料損壞(常見如資料庫輪詢著的聯機日志出錯),
常見解決方案
- 添加冗余的心跳線,例如:雙線條線(心跳線也HA),盡量減少“裂腦"發生幾率;
- 啟用磁盤鎖,正在服務一方鎖住共享磁盤,“裂腦"發生時,讓對方完全"搶不走"共享磁盤資源,但使用鎖磁盤也會有一個不小的問題,如果占用共享盤的一方不主動“解鎖",另一方就永遠得不到共享磁盤,現實中假如服務節點突然死機或崩潰,就不可能執行解鎖命令,后備節點也就接管不了共享資源和應用服務,于是有人4HA中設計了“智能"鎖,即:正在服務的一方只在發現心跳線全部斷開(察覺不到對端)時才啟用磁盤鎖,平時就不上鎖了,
- 設定仲裁機制,例如設定參考IP(如網關IP或某一個服務器),當心跳線完全斷開時,2個節:都各自ping一下參考IP,不通則表明斷點就出在本端,不僅“心跳”、還兼對外“服務"的本端網路鏈路斷了,即使啟動(或繼續)應用服務也沒有用了,那就主動放棄競爭,讓能夠ping通參考IP的一端去起服務,更保險一些,ping不通參考IP的一方干脆就自我重啟,以徹底釋放有可能還占用著的那些共享資源,
- 裂腦的監控報警,如郵件及手機短信等或值班,當然,在實施高可用方案時,要根據業務實際需求確定是否能容忍這樣的損失,對于一般的網站常規業務.這個損失是可容忍的,
Keepalived
Keepalived是什么?
- keepalived是集群管理中保證集群高可用的一個服務軟體,用來防止單點故障,
keepalived作業原理
- keepalived是以VRRP,協議為實作基礎的,VRRP全稱Virtual Router RedundancyProtocol,即虛擬路由冗余協議,
- 將N臺提供相同功能的服務器組成一個服務器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該服務器所在局域網內其他機器的默認路由為該vip) , master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master
keepalived主要有三個模塊
- 分別是core、 check和vrrp
- core模塊為keepalived的核心,負責主行程的啟動、維護以及全域組態檔的加載和決議,
- check負責健康檢查,包括常見的各種檢查方式,
- vrrp模塊是來實作VRRP協議的,
Keepalived配置
初識Keepalived,實作Web服務器的高可用集群
Server1:192.168.100.10
Server2:192.168.100.20
VIP:192.168.100.100
一、Server1:Master的配置
Server1:192.168.100.10
#創建etc下的keepalived目錄,編輯組態檔
[root@server1 ~]# yum -y install keepalived #安裝keepalived
[root@server1 ~]# vim /etc/keepalived/keepalived.conf #編輯主組態檔
#將原有的組態檔清空添加如下
!Configuration File for keepalived #keepalived組態檔檔案宣告
global_defs { #全域配置
router_id 1 #路由器編號,設備在組中的標識
}
#vrrp_script chk_nginx { #健康檢查
# script "/etc/keepalived/ck_ng.sh" #檢查腳本
# interval 2 #檢查頻率/秒
# weight -5 #優先級減5
# fall 3 #失敗三次
# }
vrrp_instance VI_1 { #VRRP模塊實體 VI_1,實體名,兩臺路由器相同
state MASTER #主或從狀態
interface ens32 #監控心跳網卡,(因為實驗環境就一張網卡所以監控ens32)
mcast_src_ip 192.168.100.10 #心跳源IP
virtual_router_id 55 #虛擬路由編號,主備一致
priority 100 #優先級
advert_int 1 #心跳間隔/秒
authentication { #認證模塊
auth_type PASS #認證型別為密碼認證
auth_pass 123456 #認證密碼123456
}
virtual_ipaddress { #VIP
192.168.100.100
}
#track_script { #跟蹤腳本
# chk_nginx
# }
}
[root@server1 ~]# scp -r /etc/keepalived/keepalived.conf 192.168.100.20:/etc/keepalived/ #復制至back服務器
[root@server1 ~]# systemctl enable keepalived #開機自啟
#安裝nginx
[root@server1 ~]# yum -y install nginx #安裝nginx,默認yum源中1.16.1版本
[root@server1 ~]# systemctl enable nginx --now
[root@server1 ~]# vim /usr/share/nginx/html/index.html #測驗keepalived修改默認主頁內容
...
131 <div id="content">
132
133 <h1>Welcome to CentOS Pakho one</h1>
...
[root@server1 ~]# systemctl start keepalived #啟動keepalived
http://192.168.100.10/

二、Server2:Backup的配置
Server2:192.168.100.20
#backup服務器的配置幾處修改
[root@server2 ~]# yum -y install keepalived
[root@server2 ~]# vim /etc/keepalived/keepalived.conf
...
state BACKUP #改為backup服務器
...
mcast_src_ip 192.168.100.20 #改為backup真實服務器
...
priority 99 #優先級99
[root@server2 ~]# systemctl enable keepalived
[root@server2 ~]# yum -y install nginx
[root@server2 ~]# systemctl enable nginx --now
[root@server2 ~]# vim /usr/share/nginx/html/index.html
...
131 <div id="content">
132
133 <h1>Welcome to CentOS Pakho two</h1>
...
[root@server2 ~]# systemctl start keepalived
http://192.168.100.20/

三、客戶端訪問
#訪問vip: http://192.168.100.100/

#拔掉master服務器網線模擬master服務器宕機

http://192.168.100.100/ #再次訪問vip

Keepalived感知Nginx
- 恢復之前的實驗,啟動兩臺主機的keepalived和nginx,確保頁面訪問正常,關閉master的nginx服務
[root@server1 ~]# systemctl stop nginx
- 繼續訪問VIP,頁面不會切換到slave
- 原因是keepalived監控的是介面IP狀態,無法監控nginx服務狀態
一、編輯監控腳本
Server1:192.168.100.10
#添加nginx監控腳本
[root@server1 ~]# vim /etc/keepalived/ck_ng.sh
#!/bin/bash
#檢查nginx行程是否存在
counter=$(ps -C nginx --no-heading | wc -l)
if [ "${counter}" = 0 ] ;then
#嘗試啟動一次nginx,停止五秒后再次檢測
systemctl restart nginx
sleep 5
if [ "${counter}" = 0 ];then
#如果沒有啟動成功,殺死keepalived行程觸發主備切換
systemctl stop keepalived
fi
fi
[root@server1 ~]# chmod +x /etc/keepalived/ck_ng.sh
[root@server1 ~]# scp /etc/keepalived/ck_ng.sh 192.168.100.20:/etc/keepalived/
Server2:192.168.100.20
[root@server2 ~]# chmod +x /etc/keepalived/ck_ng.sh
二、啟動監控腳本
Server1:192.168.100.10
[root@server1 ~]# vim /etc/keepalived/keepalived.conf
#取消注釋即可
...
vrrp_script chk_nginx {
script "/etc/keepalived/ck_ng.sh" #腳本位置
interval 2 #每兩秒鐘執行一次
weight -5 #減去本機優先級
fall 3 #嘗試三次
}
...
track_script {
chk_nginx #chk_nginx對應上方策略名
}
...
[root@server1 ~]# systemctl restart nginx keepalived
Server2:192.168.100.20同理
[root@server2 ~]# vim /etc/keepalived/keepalived.conf
...
[root@server2 ~]# systemctl restart nginx keepalived
Keepalived+LVS-DR集群配置

Master:192.168.100.10
backup:192.168.100.20
web1:192.168.100.30
web2:192.168.100.40
VIP:192.168.100.100
一、在Master上安裝Keepalived
ipvsadm安裝并不啟動,因為在keepalived配置中集成了ipvs代碼
[root@master ~]# yum -y install keepalived ipvsadm
二、在Master上修改組態檔
[root@master ~]# vim /etc/keepalived/keepalived.conf
#將原有的組態檔清空添加如下
#Keepalived配置
!Configuration File for keepalived #keepalived組態檔檔案宣告
global_defs { #默認的全域配置
route_id Director1 #該設備在組當中的名字,兩邊不一樣
}
vrrp_instance VI_1 { #VRRP模塊實體 VI_1,實體名,兩臺路由器相同
state MASTER #主或從狀態,另外一臺是BACKUP
interface ens32 #心跳網卡
virtual_router_id 51 #虛擬路由編號,兩邊一樣即可
priority 150 #優先級
advert_int 1 #檢查間隔/秒
authentication { #認證模塊
auth_type PASS #認證型別為密碼認證
auth_pass 1111 #認證密碼1111
}
virtual_ipaddress { #VIP和作業介面
192.168.100.100/24 dev ens32
}
}
#LVS-DR配置
virtual_server 192.168.100.100 80 { #VIP
delay_loop 3 #服務輪詢時間間隔,每三秒測驗真實服務器是否存活
lb_algo rr #負載均衡策略演算法 rr:輪詢
lb_kind DR #LVS集群模式 DR
protocol TCP #協議為TCP協議
real_server 192.168.100.30 80 { #真實后端服務器
weight 1 #權重1
TCP_CHECK { #TCP校驗
connect_timeout 3 #健康檢查方式,連接超時時間,與delay_loop配合使用
}
}
real_server 192.168.100.40 80 { #真實后端服務器
weight 1 #權重1
TCP_CHECK { #TCP校驗
connect_timeout 3 #健康檢查方式,連接超時時間,與delay_loop配合使用
}
}
}
三、在backup上安裝keepalived
ipvsadm安裝不啟動
[root@backup ~]# yum -y install keepalived ipvsadm
四、拷貝Master上的keepalived.conf到backup上
[root@backup ~]# scp 192.168.100.10:/etc/keepalived/keepalived.conf /etc/keepalived/
五、拷貝后修改組態檔
[root@backup ~]# vim /etc/keepalived/keepalived.conf
...
route_id Director2
...
state BACKUP
...
priority 100 #優先級100,低于Master即可
...
六、Master和backup上啟動服務
[root@master ~]# systemctl enable keepalived --now
[root@master ~]# shutdown -r now #重啟
[root@backup ~]# systemctl enable keepalived --now
[root@backup ~]# shutdown -r now
七、Web服務器配置
web1和web2相同配置
[root@web1 ~]# yum -y install httpd && systemctl enable httpd --now
[root@web1 ~]# echo Pakho1 > /var/www/html/index.html
[root@web2 ~]# yum -y install httpd && systemctl enable httpd --now
[root@web2 ~]# echo Pakho2 > /var/www/html/index.html
八、配置虛擬地址
[root@web1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
#其余行洗掉,修改如下
DEVICE=lo:0 #子介面
IPADDR=192.168.100.100 #VIP地址
NETMASK=255.255.255.255 #子網掩碼
ONBOOT=yes #開機自啟
[root@web2 ~]# scp 192.168.100.30:/etc/sysconfig/network-scripts/ifcfg-lo:0 /etc/sysconfig/network-scripts/
九、配置路由
[root@web1 ~]# vim /etc/rc.local
...
/sbin/route add -host 192.168.100.100 dev lo:0
[root@web2 ~]# vim /etc/rc.local
...
/sbin/route add -host 192.168.100.100 dev lo:0
十、配置ARP
[root@web1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2 #忽略arp請求,可以回復
[root@web2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# shutdown -r now
[root@web2 ~]# shutdown -r now
十一、測驗
#將Master網線斷開
http://192.168.100.100/

#將Master網線連接,斷開backup
http://192.168.100.100/

實作負載均衡高可用集群,實驗完成!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287364.html
標籤:其他
上一篇:nginx學習筆記
