keepalived是什么
keepalived是集群管理中保證集群高可用的一個服務軟件,其功能類似于heartbeat,用來防止單點故障。
keepalived工作原理
keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。 虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。 keepalived主要有三個模塊,分別是core、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。
keepalived的配置文件
keepalived只有一個配置文件keepalived.conf,里面主要包括以下幾個配置區域:
global_defs 主要是配置故障發生時的通知對象以及機器標識
static_ipaddress和static_routes區域配置的是是本節點的IP和路由信息
vrrp_script用來做健康檢查的,當時檢查失敗時會將vrrp_instance的priority減少相應的值
vrrp_instance用來定義對外提供服務的VIP區域及其相關屬性
vrrp_rsync_group用來定義vrrp_intance組,使得這個組內成員動作一致
keepalived實戰之-小試牛刀主備模型
實驗目標: 通過keepalived+lvs部署DR類型集群,實現高可用、負載均衡;主、備兩臺調度器均處于在線狀態,當任意一臺調度器宕機或出現故障時,VIP會“漂移”到另外一臺服務器上,繼續提供服務。
1.機器準備,做好時間同步,host解析
172.16.251.90 node1 [keepalived master] 172.16.251.91 node2 [keepalived backup] 172.16.251.92 node3 [web1 httpd rs1] 172.16.251.94 node4 [web2 httpd rs2] 172.16.251.95 node5 [client]
2.安裝lvs和keepalived,我們在node1,node2上安裝
node1:
(1).安裝ipvsadm組件
yum install ipvsadm keepalived -y
(2).啟動網卡間核心轉發功能
sysctl -w net.ipv4.ip_forward=1 cat /proc/sys/net/ipv4/ip_forward
node2:同上
3.準備好web服務,實現web訪問正常
node3:
(1).安裝httpd
yum install httpd -y echo "this is web1 test page." >/var/www/html/index.html
(2).啟動httpd并測試一下子
systemctl start httpd curl 127.0.0.1 [root@node3 ~]# curl 127.0.0.1 this is web1 test page.
node4:
(1).安裝httpd
yum install httpd -y echo "this is web2 test page." >/var/www/html/index.html
(2).啟動httpd并測試一下子
systemctl start httpd [root@node4 bin]# curl 127.0.0.1 this is web2 test page.
4.在node3,node4節點上配置vip
node3節點:
(1).配置VIP
ifconfig lo:0 172.16.50.50 netmask 255.255.255.255 broadcast 172.16.50.50 up route add -host 172.16.50.50 dev lo:0
(2).配置rs主機參數
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
node4節點同上:
我們這里有個腳本可以通行配置:
cd /server/script/ vim setparam.sh #!/bin/bash # vip=172.16.50.50 mask='255.255.255.255' 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 lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 ;; stop) ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac
5.在node1,node2上配置keepalived腳本
vim /etc/keepalived/keepalived.conf
node1腳本如下:
! Configuration File for keepalived global_defs { #故障發生時給誰發郵件通知 notification_email { root@localhost } #通知郵件從哪個地址發出 notification_email_from keepalived@localhost #通知郵件的smtp地址 smtp_server 127.0.0.1 #連接smtp服務器的超時時間 smtp_connect_timeout 30 #通過組播地址通告狀態和優先級信息 vrrp_mcast_group4 224.0.100.24 } vrrp_instance sr1 { #MASTER或BACKUP state MASTER #節點固有IP(非VIP)的網卡,用來發VRRP包 interface ens33 #取值在0-255之間,用來區分多個instance的VRRP組播 virtual_router_id 51 #設置優先級,選舉master,取值范圍1-255 priority 100 #健康查檢時間間隔 advert_int 1 #定義 router_id router_id node1 #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 authentication { auth_type PASS auth_pass r9RbiPlp } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; track_interface { ens33 } #nopreempt #非搶占模式 #配置虛擬IP地址(vip) virtual_ipaddress { 172.16.50.50/24 dev ens33 label ens33:0 } } virtual_server 172.16.50.50 80 { #定義延遲輪詢時間(單位秒) delay_loop 6 #設定VS的調用算法 lb_algo wrr #設定lvs調度類型 lb_kind DR persistence_timeout 50 #工作的協議 protocol TCP #當所有real server宕掉時,sorry server頂替 sorry_server 127.0.0.1 80 #真正提供服務的服務器RS1 real_server 172.16.251.92 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } #真正提供服務的服務器RS2 real_server 172.16.251.94 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } }
node2腳本如下:
! Configuration File for keepalived global_defs { #故障發生時給誰發郵件通知 notification_email { root@localhost } #通知郵件從哪個地址發出 notification_email_from keepalived@localhost #通知郵件的smtp地址 smtp_server 127.0.0.1 #連接smtp服務器的超時時間 smtp_connect_timeout 30 #通過組播地址通告狀態和優先級信息 vrrp_mcast_group4 224.0.100.24 } vrrp_instance sr1 { #MASTER或BACKUP state BACKUP #節點固有IP(非VIP)的網卡,用來發VRRP包 interface ens33 #取值在0-255之間,用來區分多個instance的VRRP組播 virtual_router_id 51 #設置優先級,選舉master,取值范圍1-255 priority 96 #健康查檢時間間隔 advert_int 1 #定義 router_id router_id node2 #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 authentication { auth_type PASS auth_pass r9RbiPlp } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; track_interface { ens33 } #nopreempt #非搶占模式 #配置虛擬IP地址(vip) virtual_ipaddress { 172.16.50.50/24 dev ens33 label ens33:0 } } virtual_server 172.16.50.50 80 { #定義延遲輪詢時間(單位秒) delay_loop 6 #設定VS的調用算法 lb_algo wrr #設定lvs調度類型 lb_kind DR nat_mask 255.255.255.255 persistence_timeout 50 #工作的協議 protocol TCP #當所有real server宕掉時,sorry server頂替 sorry_server 127.0.0.1 80 #真正提供服務的服務器RS1 real_server 172.16.251.92 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } #真正提供服務的服務器RS2 real_server 172.16.251.94 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } }
6.測試關掉其中任何一個keepalived,都可訪問curl 172.16.50.50
keepalived實戰之-小試牛刀雙主模型
我們剛剛做了一個主備模型,現在我們將這個主備模型稍微改造一下,我們只需要改造keepalived的配置文件即可:
1.在這之前,因為我們做的是lvs-dr模型,所以同樣我們需要在node3,node4上做另外一個vip 因此在node3,node4上操作:
ifconfig lo:1 172.16.60.60 netmask 255.255.255.255 broadcast 172.16.60.60 up route add -host 172.16.60.60 dev lo:1
我們用ifconfig可以看到兩個
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 172.16.50.50 netmask 255.255.255.255 loop txqueuelen 1 (Local Loopback) lo:1: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 172.16.60.60 netmask 255.255.255.255 loop txqueuelen 1 (Local Loopback)
通用腳本改成如下:
#!/bin/bash # Filename: setvip.sh # Revision: 1.1 # Date: 2017/06/24 # Author: Srayban # Email: 626612631@qq.com # Website: no # Description: 設置vip . /etc/init.d/functions vip="172.16.50.50" vip2="172.16.60.60" mask="255.255.255.255" 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 lo:0 $vip netmask $mask broadcast $vip up ifconfig lo:1 $vip2 netmask $mask broadcast $vip2 up route add -host $vip dev lo:0 route add -host $vip2 dev lo:1 ;; stop) ifconfig lo:0 down ifconfig lo:1 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac action "setvip is success." true
2.在node1,node2上改造keepalived腳本
vim /etc/keepalived/keepalived.conf node1腳本如下: ! Configuration File for keepalived global_defs { #故障發生時給誰發郵件通知 notification_email { root@localhost } #通知郵件從哪個地址發出 notification_email_from keepalived@localhost #通知郵件的smtp地址 smtp_server 127.0.0.1 #連接smtp服務器的超時時間 smtp_connect_timeout 30 #通過組播地址通告狀態和優先級信息 vrrp_mcast_group4 224.0.100.24 } vrrp_instance sr1 { #MASTER或BACKUP state MASTER #節點固有IP(非VIP)的網卡,用來發VRRP包 interface ens33 #取值在0-255之間,用來區分多個instance的VRRP組播 virtual_router_id 51 #設置優先級,選舉master,取值范圍1-255 priority 100 #健康查檢時間間隔 advert_int 1 #定義 router_id router_id node1 #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 authentication { auth_type PASS auth_pass r9RbiPlp } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; track_interface { ens33 } #nopreempt #非搶占模式 #配置虛擬IP地址(vip) virtual_ipaddress { 172.16.50.50/24 dev ens33 label ens33:0 } } vrrp_instance sr2 { #MASTER或BACKUP state BACKUP #節點固有IP(非VIP)的網卡,用來發VRRP包 interface ens33 #取值在0-255之間,用來區分多個instance的VRRP組播 virtual_router_id 61 #設置優先級,選舉master,取值范圍1-255 priority 96 #健康查檢時間間隔 advert_int 1 #定義 router_id router_id node1 #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 authentication { auth_type PASS auth_pass r9ObiP0p } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; track_interface { ens33 } #nopreempt #非搶占模式 #配置虛擬IP地址(vip) virtual_ipaddress { 172.16.60.60/24 dev ens33 label ens33:1 } } virtual_server 172.16.60.60 80 { #定義延遲輪詢時間(單位秒) delay_loop 6 #設定VS的調用算法 lb_algo wrr #設定lvs調度類型 lb_kind DR persistence_timeout 50 #工作的協議 protocol TCP #當所有real server宕掉時,sorry server頂替 sorry_server 127.0.0.1 80 #真正提供服務的服務器RS1 real_server 172.16.251.92 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } #真正提供服務的服務器RS2 real_server 172.16.251.94 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } } virtual_server 172.16.50.50 80 { #定義延遲輪詢時間(單位秒) delay_loop 6 #設定VS的調用算法 lb_algo wrr #設定lvs調度類型 lb_kind DR persistence_timeout 50 #工作的協議 protocol TCP #當所有real server宕掉時,sorry server頂替 sorry_server 127.0.0.1 80 #真正提供服務的服務器RS1 real_server 172.16.251.92 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } #真正提供服務的服務器RS2 real_server 172.16.251.94 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } }
node2腳本如下:
! Configuration File for keepalived global_defs { #故障發生時給誰發郵件通知 notification_email { root@localhost } #通知郵件從哪個地址發出 notification_email_from keepalived@localhost #通知郵件的smtp地址 smtp_server 127.0.0.1 #連接smtp服務器的超時時間 smtp_connect_timeout 30 #通過組播地址通告狀態和優先級信息 vrrp_mcast_group4 224.0.100.24 } vrrp_instance sr1 { #MASTER或BACKUP state BACKUP #節點固有IP(非VIP)的網卡,用來發VRRP包 interface ens33 #取值在0-255之間,用來區分多個instance的VRRP組播 virtual_router_id 51 #設置優先級,選舉master,取值范圍1-255 priority 96 #健康查檢時間間隔 advert_int 1 #定義 router_id router_id node2 #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 authentication { auth_type PASS auth_pass r9RbiPlp } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; track_interface { ens33 } #nopreempt #非搶占模式 #配置虛擬IP地址(vip) virtual_ipaddress { 172.16.50.50/24 dev ens33 label ens33:0 } } vrrp_instance sr2 { #MASTER或BACKUP state MASTER #節點固有IP(非VIP)的網卡,用來發VRRP包 interface ens33 #取值在0-255之間,用來區分多個instance的VRRP組播 virtual_router_id 61 #設置優先級,選舉master,取值范圍1-255 priority 100 #健康查檢時間間隔 advert_int 1 #定義 router_id router_id node2 #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 authentication { auth_type PASS auth_pass r9ObiP0p } #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; track_interface { ens33 } #nopreempt #非搶占模式 #配置虛擬IP地址(vip) virtual_ipaddress { 172.16.60.60/24 dev ens33 label ens33:1 } } virtual_server 172.16.60.60 80 { #定義延遲輪詢時間(單位秒) delay_loop 6 #設定VS的調用算法 lb_algo wrr #設定lvs調度類型 lb_kind DR nat_mask 255.255.255.255 persistence_timeout 50 #工作的協議 protocol TCP #當所有real server宕掉時,sorry server頂替 sorry_server 127.0.0.1 80 #真正提供服務的服務器RS1 real_server 172.16.251.92 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } #真正提供服務的服務器RS2 real_server 172.16.251.94 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } } virtual_server 172.16.50.50 80 { #定義延遲輪詢時間(單位秒) delay_loop 6 #設定VS的調用算法 lb_algo wrr #設定lvs調度類型 lb_kind DR nat_mask 255.255.255.255 persistence_timeout 50 #工作的協議 protocol TCP #當所有real server宕掉時,sorry server頂替 sorry_server 127.0.0.1 80 #真正提供服務的服務器RS1 real_server 172.16.251.92 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } #真正提供服務的服務器RS2 real_server 172.16.251.94 80 { #權重 weight 1 #設置健康狀態檢測方法 HTTP_GET { url { #定義要監控的URL; path / #判斷上述檢測機制為健康狀態的響應碼; status_code 200 } #連接請求的超時時長 connect_timeout 3 #重試次數 nb_get_retry 3 #下次重試的延遲時間 delay_before_retry 1 } } }
3.腳本改造以后,啟動keepalived
for i in {1..12};do curl 172.16.50.50; curl 172.16.60.60; done
可以看到兩個都能正常訪問了
原創文章,作者:srayban,如若轉載,請注明出處:http://www.www58058.com/78490