keepalived概述:
是Linux下一個輕量級別的高可用解決方案。高可用(High Avalilability,HA),其實兩種不同的含義:廣義來講,是指整個系統的高可用行,狹義的來講就是之主機的冗余和接管,
1.節點(node)
運行HA進程的一個獨立主機,稱為節點,節點是HA的核心組成部分,每個節點上運行着操作系統和高可用軟件服務,在高可用集群中,節點有主次之分,分別稱之為主節點/備份節點,每個節點擁有唯一的主機名,並且擁有屬於自己的一組資源,例如,磁盤,文件系統,網絡地址和應用服務等,主節點上一般運行着一個或多個應用服務,而備節點一般處於監控狀態
2.資源(resource)
資源是一個節點可以控制的實體,並且當節點發生故障時,這些資源能夠被其他節點接管,HA集群軟件中,可以當做資源的實體有:
(1)磁盤分區、文件系統
(2)IP地址VIP
(3)應用程序服務
(4)NFS文件系統
3.事件(event)
也就是集群中可能發生的事情,例如節點系統故障,網絡連通故障,網卡故障,應用程序故障等,這些事情都會發生節點資源發生轉移,HA的測試也是基於這些事情來進行的
4.動作(action)
事件發生時HA的響應方式,動作是由shell腳本控制的,例如當某個節點發生故障后,備份節點將通過事先設定好的執行腳本進行服務的關閉或啟動,進而接管故障節點的資源*
用途:
keepalived起初是為lvs設計的,專門用來監控集群系統中各個服務節點的狀態,它根據layer3,4 & 5交換機制檢測每個服務節點的狀態,如果某個服務節點出現異常,或工作出現故障,keepaived將檢測到,並將出現故障的服務節點從集群系統中剔除,而在故障節點恢復正常后,keepalived又可以自動將此服務節點重新加入到集群中,這些工作全部自動完成,不需要人工干預,需要人工完成的只是修復故障節點。
vrrp協議與工作原理:
在現實的網絡環境中,主機之間的通信都是通過配置靜態路由完成的,而主機之間的路由器一旦出現故障,通信就會失敗,因此在這種通信模式中,路由器就成了一個單點瓶頸,為了解決這個問題就引入了VRRP協議
VRRP協議是一種主備模式的協議,通過VRRP可以在網絡發生故障時透明地進行設備切換不影響主機間的數據通信,這其中涉及兩個概念:物理路由器和虛擬路由器
VRRP可以將兩台或者多台物理路由器設備虛擬成一個虛擬路由器,這個虛擬路由器通過虛擬IP(一個或多個)對外提供服務,二在虛擬路由器內部,是多個物理路由器協同工作,同一時間只有一台物理路由器對外提供服務,這台物理路由器被稱之為主路由器(處於master狀態角色)。它擁有對外提供的虛擬ip,提供各種網絡功能,比如arp請、icmp、數據轉發等,二其他物理路由器不擁有對外提供的虛擬ip,也不提供對外網絡功能,僅僅接收master的vrrp狀態通告信息,這些路由器被統稱為備份路由器(處於backup角色)。當主路由器失效時,處於backup角色的備份路由器將重新進行選舉,產生一個新的主路由器進入master角色繼續對外服務,整個切換過程對於用戶來說完全同名
在一個虛擬路由器中,只有處於master角色的路由器會一直發送vrrp數據包,處於backup角色的路由器只接受master發過來的報文信息,用來監控master運行狀態,因此,不會發生master搶占的現象,除非它的優先級更高,而當master不可用時,backup也就無法收到master發過來的報文信息,於是就認定master出現故障,接着多台backup就會進行選舉,優先級最高的backup將成為新的master,這種選舉並進行角色的過程非常快,因此也就保證了服務的持續可用性
注意:這里有一個誤區,由於keepalived可以和ipvs一起很好的工作,所以很多初學者都認為keepalived是一個負載均衡的軟件,這種理解是錯誤的。
內核模塊:
IPVS:主要用於通過IPVS跟lvs進行整合,是lvs的核心模塊,跟lvs一塊使用的
NETLINK:主要實現一些網絡的功能
用戶模塊:主要用於高可用
checker:檢查服務狀態
vrrp stack:用於DS高可用
二、安裝配置
1、yum -y install keepalived
2、准備兩台相同網段的主機,一台模擬主節點,一台模擬備用節點。
vrrp測試
主節點配置如下:
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 2 } virtual_ipaddress { 192.168.253.7 } }
備用節點配置:
vrrp_instance VI_1 { #名稱自定義但相同 state BACKUP #備用 interface ens33 virtual_router_id 51 #自定義,但要和主節點相同 priority 99 #備用節點通常優先級小於主節點 advert_int 1 authentication { auth_type PASS auth_pass 2 #自定義密碼 } virtual_ipaddress { 192.168.253.7 #主備都用相同的虛擬ip地址 } } #注意花括號不能少
綜上來說,主備只有狀態和優先級不同。
3.測試(一):主備節點的自動轉移
主:systemctl stop keepalived
備 :systemctl start keepalived
ip a --->inet 192.168.253.7/32 scope global ens33 ,主節點ip地址漂移到備用節點上
以上實驗證明keepalived的高可用利用vrrp協議將宕掉的主機ip轉移到備用節點上,從而提高可用性。
測試(二):主節點恢復,IP地址重新漂移回主節點
主:systemctl restart keepalived
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e4:3d:3a brd ff:ff:ff:ff:ff:ff inet 192.168.253.146/24 brd 192.168.253.255 scope global dynamic ens33 valid_lft 1673sec preferred_lft 1673sec inet 192.168.253.7/32 scope global ens33 #發現ip地址回到主節點上
測試(三):讓漂移后的主節點ip不回到恢復后的主節點上。
vrrp_instance VI_1 { state BACKUP #狀態與備用節點改為一樣的backup interface ens33 virtual_router_id 51 priority 100 advert_int 1 nopreempt #添加無法搶占的命令,因為默認搶占 authentication { auth_type PASS auth_pass 2 } virtual_ipaddress { 192.168.253.7 } }
如果主節點重啟服務並且執行ip a命令而沒有顯示ip的話就證明測試成功。
測試(四):讓兩個節點互為備用,節約資源(注意:同一個節點比較修改比在同一個配置文件下的比較修改要清晰。例如v1_1master與v1_1backup)
節點一:(設為v1_1的主節點,v1_2的備用節點)
vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 2 } virtual_ipaddress { 192.168.253.7 } } vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 52 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 3 } virtual_ipaddress { 192.168.253.8 } }
節點二:(設為v1_1的備用節點,v1_2的主節點)
vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 2 } virtual_ipaddress { 192.168.253.7 } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 3 } virtual_ipaddress { 192.168.253.8 } }
此設置可使兩節點之間任意一台節點宕機,另一台都能頂上,提高高可用性(HA)。
checker測試
作用:在真實提供服務的主機宕機后,能夠自動剔除而不是繼續發送報文請求。
1.保持上面的配置不變。
2.添加兩台real-server(192.168.253.10,192.168.253.147)
3.在兩台real-server上都寫下以下內容:
vim r1.sh
v#!/bin/bash case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig ens33:0 192.168.253.7/32 broadcast 192.168.253.7 up if [ $? -eq 0 ];then route add -host 192.168.253.7 dev ens33:0 #指定253.7的虛擬ip,此ip為v1_1的主ip,v1_2的備用ip。 fi echo "啟動成功" ;; stop) echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig ens33:0 down route del -host 192.168.253.7 echo "刪除成功" ;; *) echo "usage start|stop" ;;
esac
執行 bash r1.sh #啟動
執行route -n #查看此虛擬ip是否被添加
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.253.2 0.0.0.0 UG 100 0 0 ens33
192.168.253.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.253.7 0.0.0.0 255.255.255.255 UH 0 0 0 ens3 #發現已添加
此步驟作用在於指定唯一的虛擬路由,arp請求都優先通過這個路由。
4.在兩個節點的配置文件中配置real_server。
節點一:
virtual_server 192.168.253.7 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 192.168.253.147 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.253.10 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3
delay_before_retry 3
}
}
}
節點二:
virtual_server 192.168.253.8 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.253.10 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200 #此步驟有錯的話不會與后端節點建立lvs聯系。就無法通過ipvsadm -L -n查看到realserver的信息。
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.253.147 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
將節點2的虛擬ip指定為192.168.253.8,也就是說通過2節點沒有辦法check到real-server的損壞與否,因為real-server腳本里指定唯一的虛擬ip為192.168.253.7。
如果嘗試會報錯timeout。
5.關閉防火牆,開啟web服務。
6.在cmd界面curl 192.168.253.7 (real-server指定的虛擬地址),如果能抓取到,再將一台real-server停止web服務,在節點1上執行ipvsadm -L -n如果顯示沒有這台real-server的ip地址,則證明checker組件自動剔除了宕機的real-server,實驗成功。
7.有時候出現curl 虛擬ip只會有一台rea_server做出回應,原因有兩個:
1)節點配置出現錯誤,status_code或者NAT模式沒改等。
2)real_server的添加的虛擬出現錯誤。
8.如果出現 Failed to connect to 192.168.253.250 port 80: Connection refused 的報錯
1)real_server端路由添加錯誤
2)節點配置文件錯誤比如statu狀態的拼寫錯誤
3)appache服務沒開啟(最有可能)