Keepalived定義
Keepalived 是一個基于VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺為主服務器(MASTER),一臺為備份服務器(BACKUP),但是對外表現為一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現。
VRRP 協議簡介
VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協議。
虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。于安全性考慮,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組,使得這個組內成員動作一致
環境準備
Centos7系統,后端服務器提供web服務。
地址規劃:
- VS1: 172.18.51.7
- VS2:172.17.51.77
- RS1:172.18.51.74
- RS2:172.18.51.75
- VirtualIP:172.18.51.81
拓撲圖:
實驗目標: 通過keepalived+lvs部署DR類型集群,實現高可用、負載均衡;主、備兩臺調度器均處于在線狀態,當任意一臺調度器宕機或出現故障時,VIP會“漂移”到另外一臺服務器上,繼續提供服務。
安裝chrony程序包,部署時間服務器,同步各服務器時間
RS:提供httpd服務,定義web主頁,啟動服務
VS:當所有real server宕掉時,sorry
server頂替,定義其主頁,啟動服務
RS的預配置腳本:
vim setparam.sh #!/bin/bash # vip=172.18.51.100 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
啟動 bash -x setparam.sh start
VS配置:
vs1和vs2的配置文件,主備模式、優先級不一樣,其它地方一致;
VS1
[root@centos7 keepalived]#cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { #故障發生時給誰發郵件通知 root@localhost } notification_email_from keepalived@localhost #通知郵件從哪個地址發出 smtp_server 127.0.0.1 #通知郵件的smtp地址 smtp_connect_timeout 30 #連接smtp服務器的超時時間 vrrp_mcast_group4 224.0.101.24 # 通過組播地址通告狀態和優先級信息 } vrrp_instance sr1 { state MASTER #MASTER或BACKUP interface ens33 #節點固有IP(非VIP)的網卡,用來發VRRP包 virtual_router_id 51 #取值在0-255之間,用來區分多個instance的VRRP組播 priority 100 #設置優先級,選舉master,取值范圍1-255 advert_int 1 #健康查檢時間間隔 authentication { #認證區域,認證類型有PASS和HA(IPSEC),密碼8位字符 auth_type PASS auth_pass rE+szbuO } track_interface { ens33 #配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態; } # nopreempt #非搶占模式 virtual_ipaddress { 172.18.51.81/16 dev ens33 label ens33:0 #配置虛擬IP地址(vip) } } virtual_server 172.18.51.81 80 { delay_loop 6 #定義延遲輪詢時間(單位秒) lb_algo wrr #設定VS的調用算法 lb_kind DR #設定lvs調度類型 protocol TCP #工作的協議 sorry_server 127.0.0.1 80 #當所有real server宕掉時,sorry server頂替 real_server 172.18.51.74 80 { #真正提供服務的服務器RS1 weight 1 #權重 HTTP_GET { ##設置健康狀態檢測方法 url { path / #定義要監控的URL; status_code 200 #判斷上述檢測機制為健康狀態的響應碼; } connect_timeout 1 #連接請求的超時時長 nb_get_retry 3 #重試次數 delay_before_retry 1 #下次重試的延遲時間 } } real_server 172.18.51.75 80 { #真正提供服務的服務器RS2 weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
VS2
[root@centos703 ~]# cd /etc/keepalived/ [root@centos703 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 vrrp_mcast_group4 224.0.101.24 } vrrp_instance sr1 { state BACKUP interface ens33 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass rE+szbuO } track_interface { ens33 } nopreempt virtual_ipaddress { 172.18.51.81/16 dev ens33 ens33 label ens33:0 } } virtual_server 172.18.51.81 80 { delay_loop 6 lb_algo wrr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 172.18.51.74 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 172.18.51.75 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
啟動服務:systemctl start keepalived.service,自動生成ipvs規則
通過客戶端測試:
real
server正常時訪問:輪詢
關閉RS1上httpd 服務: 訪問RS2頁面
關閉RS2httpd 服務后,訪問頁面跳到sorry
server頁面:
原創文章,作者:Mr-Xiao,如若轉載,請注明出處:http://www.www58058.com/75935