LVS+Keepalived群集
一。Keepalived工具
叢集需要滿足的特點:負載均衡,健康檢查,故障切換
在應用中單臺伺服器承擔負載應用存在單點故障的危險,一旦發生故障,企業服務將發生中斷,造成損失
Keepalived工具專為LVS和HA(高可用)設計的一款健康檢查工具
(1)支援故障自動切換(Failover)
(2)支援節點健康狀態檢查(Health Checking)
判斷LVS負載排程器、節點伺服器的可用性,當master主機出現故障即時切換到backup節點保證業務正常,當master故障主機恢復後將其重新加入群集並且業務重新切回master節點
(3)官方網站:http://www.keepalived.org/
二。Keepalived及工作原理
Keepalived是一個基於底層協議是VRRP熱備份協議來實現的LVS服務高可用方案,可以解決靜態路由出現的單點故障問題。
2.1)工作原理
在一個LVS服務叢集中通常有主伺服器 (MASTER)和備份伺服器(BACKUP) 兩種角色的伺服器,但是對外表現為一個虛擬IP,主伺服器會發送VRRP通告資訊給備份伺服器, 當備份伺服器收不到VRRP訊息的時候,即主伺服器異常的時候,備份伺服器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。
2.2)Keepalived體系主要模組及其作用
keepalived體系架構中主要有三個模組,分別是core、check和
core模組∶為keepalived的核心,負責主程序的啟動、維護及全域性配置檔案的載入和解析。
vrrp模組∶是來實現VRRP協議的。
check模組∶負責健康檢查,常見的方式有埠檢查及URIL檢查。
2.3)VRRP(虛擬路由冗餘協議)
1. 是針對路由器的一種備份解決方案
2. 多臺路由器組成一個熱備組,通過共用的,虛擬IP地址對外提供服務
3. 每個熱備組內同時只有一臺主路由器提供服務,其他路由器處於冗餘狀態
4. 若當前線上的路由器失效,則其他路由器會,根據設定的優先順序自動接替虛擬IP地址,繼續提供服務
工作原理
(1)VRRP會把多臺路由器組成一個虛擬路由器組vrid,VRRP會生成一個虛擬路由器 (包含虛擬
(2)區域網內的使用者不關心哪個是主哪個是備,他們只用虛擬路由器的虛擬IP作為他們的閘道器實際上虛擬IP是承載在master路由器,也就是說實際的資料包是通過master進行轉發
(3)master和backup是通過優先順序來決定哪個是master,優先順序最大的那臺就是 master,其餘小的都是backup
(4)backup只是用來監聽Master定時發來的vrrp報文,如果超時未收到 master 發來的vrrp報文,backup就會搶佔master地位,虛擬IP也會一起漂移到backup 上
三。keepalived 腦裂現象是如何產生的?那又如何解決?
在某一次故障切換後,原來的master並沒有真正的掛掉 ,VIP還在,而backup 則已經搶佔master地位,並也在本地配置了VIP,本來為一整體、動作協調的HA系統,就分裂成為2個獨立的個體。由於相互失去了聯絡,都以為是對方出了故障。兩個節點上的HA軟體像“裂腦人”一樣,爭搶“共享資源”、爭起“應用服務”,就會發生嚴重後果——或者共享資源被瓜分、2邊“服務”都起不來了;或者2邊“服務”都起來了,但同時讀寫“共享儲存”,導致資料損壞(常見如資料庫輪詢著的聯機日誌出錯)。這時客戶端傳送請求都能夠做出響應造成資源的爭奪
解決思路
1.網路的層面來解決 再加一條鏈路,需要一定的成本
2.通過第三方監控軟體的方式來解決 zabbix
既監控伺服器的狀態,也監控網路的流量
3.在本地通過指令碼方式來解決
在master主機通過if判斷是否能夠ping通backup主機,ping不通2種可能性,中間鏈路斷掉了或backup宕機,再使用if判斷使用ssh跳到某一臺節點伺服器ping backup主機,如果也ping 不通則判斷backup宕機,如果Ping通則說明是中間鏈路問題,鏈路問題就手動關閉maseter的keepalived工具,讓backup主機頂上
4. 編寫監控腦裂指令碼
vim check_keepalived.sh
#!/bin/bash
state=$(ip addrshow ens33|grep 192.168.150.200 |wc -l)
while true
do
if [$state-ne 0 ]
then
echo "建立VIP"
else
echo "未建立VIP"
fi
done
5. 命令測試確保兩臺負載均衡能夠正常負載
例如:
[root@dd ~]#curl -H Host:www.kgc.com 192.168.150.15
<h1>this is first 1 web!</h1>
四。實驗搭建LVS+Keepalived高可用群集
主DR伺服器:192.168.150.5
備DR伺服器:192.168.150.10
web伺服器1:192.168.150.15
web伺服器2:192.168.150.20
VIP:192.168.150.200
客戶端:192.168.150.100
1.配置負載排程器 (主、備相同)
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
(1)需要關閉icmp的重定向,不充當路由器
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
(2)啟動ipvsadm工具
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C #清空規則
(3)配置keeplived(主、備DR伺服器上都要設定)
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak #備份一下配置檔案
vim keepalived.conf
。。。。。。。
global_defs{ #定義全域性引數
--10行--修改,郵件服務指向本地
smtp_server 127.0.0.1 #該IP是本機迴環地址
--12行--修改,指定伺服器(路由器)的名稱,主備伺服器名稱須不同,例如主為LVS_01,備為LVS_02
router_id LVS_01
--14行--註釋或刪除,取消嚴格遵守VRRP協議功能,否則VIP無法被連線
#vIrp_strict
}
vrrp_ instance VI_1{ #定義VRRP熱備例項引數
--20行--修改,指定熱備狀態,主為MASTER,備為BACKUP
state MASTER
--21行--修改,指定承載vip地址的物理介面
interface ens33
-22行--修改,指定虛擬路由器的ID號,每個熱備組保持一致
virtual_router_id 10
#如果設定非搶佔模式,兩個節點都必須加上配置nopreempt,搶佔模式主機宕機,備機頂上,主機恢復則搶回master位,非搶佔不會主動搶回
nopreempt
-23行--修改,指定優先順序,數值越大優先順序越高,這裡設定主為100,備為90
priority 100
advert_int 1#通告間隔秒數(心跳頻率)
authentication { #定義認證資訊,每個熱備組保持一致
auth_type PASS #認證型別
--27行--修改,指定驗證密碼,主備伺服器保持一致
auth_pass abc123
}
virtual_ipaddress{ #指定群集vip地址
192.168.150.200
}
}
--36行--修改,指定虛擬伺服器地址(VIP)、埠,定義虛擬伺服器和Web伺服器池引數
virtual server 192.168.150.20080 {
delay_loop 6 #健康檢查的間隔時間(秒)
lb_algo rr #指定排程演算法,輪詢(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 50 #連線保持時間(秒)
protocol TCP#應用服務採用的是TCP協議
-43行--修改,指定第一個Web節點的地址、埠
real server 192.168.150.1580 {
weight 1#節點的權重
-45行--刪除,新增以下健康檢查方式
TCP_CHECK {
connect_port 80 #新增檢查的目標埠
connect_timeout 5 #新增連線超時(秒)
nb_get_retry 4 #新增重試次數
delay_before_retry 3 #新增重試間隔
}
}
#新增第二個web節點的地址,埠以及健康檢查方式
real server 192.168.150.2080 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 5
nb_get_retry 4
delay_before_retry 3
}
}
###刪除後面多餘配置項
}
systemctl start keepalived
ip addr #檢視虛擬網絡卡vip
*注意刪除多餘配置項後括號是否都補全,少括號依然可以啟動成功但無法加載出虛擬網絡卡ip
2. 節點伺服器配置
systemctl stop firewalld.service
setenforce 0
(1)配置承載VIP的虛擬口
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.150.200
NETMASK=255.255.255.255
ifup lo:0
ifconfig
#臨時新增路由指定該介面承載VIP地址
route add -host 192.168.150.200dev lo:0
或新增到開機自啟
vim /etc/rc.d/rc.local
/usr/sbin/route add -host 192.168.150.200dev lo:0
chmod +x /etc/rc.d/rc.local
(2)調整核心的ARP響應引數
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1 #系統只響應目的IP為本地IP的ARP請求
net.ipv4.conf.lo.arp_announce = 2 #系統不使用IP包的源地址來設定ARP請求的源地址,而選擇傳送介面的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
(3)設定首頁檔案啟動web服務
yum -y installhttpd
192.168.150.15伺服器
echo ‘<h1>this is first 1 web!</h1>’> /var/www/html/index.html
192.168.150.20伺服器
echo ‘<h1>this is first 2 web!</h1>’> /var/www/html/index.html
systemctl start httpd
3. 測試驗證
客戶端訪問http://192.168.150.200
再在主伺服器關閉Keepalived進行測試
手動停止master上的keepalived服務,檢視是否進行主備切換