keepalived原理、keepalived+LVS_DR及keepalived+Nginx的實現
一.keepalived和其工作原理:
keepalived是一個類似於Layer2,4,7交換機制的軟件。是Linux集羣管理中保證集羣高可用的一個服務軟件,其功能是用來防止單點故障。
keepalived的工作原理:
keepalived是基於VRRP協議實現的保證集羣高可用的一個服務軟件,主要功能是實現真機的故障隔離和負載均衡器間的失敗切換,防止單點故障。在瞭解keepalived原理之前先了解一下VRRP協議。
VRRP協議:Virtual Route Redundancy Protocol虛擬路由冗餘協議。是一種容錯協議,保證當主機的下一跳路由出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。在介紹VRRP之前先介紹一些關於VRRP的相關術語:
虛擬路由器:由一個 Master 路由器和多個 Backup 路由器組成。主機將虛擬路由器當作默認網關。
VRID:虛擬路由器的標識。有相同 VRID 的一組路由器構成一個虛擬路由器。
Master 路由器:虛擬路由器中承擔報文轉發任務的路由器。
Backup 路由器: Master 路由器出現故障時,能夠代替 Master 路由器工作的路由器。
虛擬 IP 地址:虛擬路由器的 IP 地址。一個虛擬路由器可以擁有一個或多個IP 地址。
IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱爲 IP 地址擁有者。
虛擬 MAC 地址:一個虛擬路由器擁有一個虛擬 MAC 地址。虛擬 MAC 地址的格式爲 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器迴應 ARP 請求使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時候,纔回應接口的真實 MAC 地址。
優先級: VRRP 根據優先級來確定虛擬路由器中每臺路由器的地位。
非搶佔方式:如果 Backup 路由器工作在非搶佔方式下,則只要 Master 路由器沒有出現故障, Backup 路由器即使隨後被配置了更高的優先級也不會成爲Master 路由器。
搶佔方式:如果 Backup 路由器工作在搶佔方式下,當它收到 VRRP 報文後,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的 Master 路由器的優先級高,就會主動搶佔成爲 Master 路由器;否則,將保持 Backup 狀態。
虛擬路由示例示意圖:
VRRP將局域網內的一組路由器劃分在一起,形成一個VRRP備份組,它在功能上相當於一臺路由器的功能,使用虛擬路由器號進行標識。虛擬路由器有自己的虛擬IP地址和虛擬MAC地址,它的外在變現形式和實際的物理路由完全一樣。局域網內的主機將虛擬路由器的IP地址設置爲默認網關,通過虛擬路由器與外部網絡進行通信。
虛擬路由器是工作在實際的物理路由器之上的。它由多個實際的路由器組成,包括一個Master路由器和多個Backup路由器。 Master路由器正常工作時,局域網內的主機通過Master與外界通信。當Master路由器出現故障時, Backup路由器中的一臺設備將成爲新的Master路由器,接替轉發報文的工作。
VRRP的工作工程:
(1) 虛擬路由器中的路由器根據優先級選舉出 Master。 Master 路由器通過發送免
費 ARP 報文,將自己的虛擬 MAC 地址通知給與它連接的設備或者主機,從
而承擔報文轉發任務;
(2) Master 路由器週期性發送 VRRP 報文,以公佈其配置信息(優先級等)和工
作狀況;
(3) 如果 Master 路由器出現故障,虛擬路由器中的 Backup 路由器將根據優先級
重新選舉新的 Master;
(4) 虛擬路由器狀態切換時, Master 路由器由一臺設備切換爲另外一臺設備,新
的 Master 路由器只是簡單地發送一個攜帶虛擬路由器的 MAC 地址和虛擬 IP
地址信息的ARP 報文,這樣就可以更新與它連接的主機或設備中的
ARP 相關信息。網絡中的主機感知不到 Master 路由器已經切換爲另外一臺
設備。
(5) Backup 路由器的優先級高於 Master 路由器時,由 Backup 路由器的工作方
式(搶佔方式和非搶佔方式)決定是否重新選舉 Master。
VRRP優先級的取值範圍爲0到255(數值越大表明優先級越高)
keepalived的工作原理就是基於VRRP實現的,keepalived的體系結構圖如下:
在這個機構圖中,處於內核的IPVS和NETLINK,其中NETLINK是提供高級路由及其他相關的網絡功能,如果在負載均衡器上啓用iptables/netfilter,將會直接影響它的性能。對於圖中不同模塊功能的介紹如下:
VRRP Stack負責負載均衡器之間的失敗切換FailOver;
Checkers負責檢查調度器後端的Real server 或者 Upstream Server的健康狀況;
WatchDog 負責監控checkers和VRRP進程的狀況;
IPVS wrapper 用來發送設定的規則到內核IPVS;
Netlink Reflector 用來設定VRRP的vip地址。
keepalived運行時,會啓動3個進程,分別爲:core(核心進程),check和vrrp
core:負責主進程的啓動,維護和全局配置文件的加載;
check:負責健康檢查
vrrp:用來實現vrrp協議
keepalived配置文件的介紹:
在yum安裝好keepalived之後,keepalived會產生一個配置文件/etc/keepalived/keepalived.conf ,配置文件包含了三個段:全局定義段,VRRP實例定義段和虛擬服務器定義段。
global_defs { notification_email { #指定keepalived在發生切換時需要發送email到的對象。 [email protected] } notification_email_from [email protected]#指定發件人 smtp_server 192.168.200.1 #指定smtp服務器地址 smtp_connect_timeout30 #指定smtp連接超時時間 router_id LVS_DEVEL #運行keepalived的一個標識 } vrrp_sync_group VG_1{ #監控多個網段的實例 group{ inside_network#實例名 outside_network } notify_master /path/xx.sh #指定當切換到master時,執行的腳本 netify_backup /path/xx.sh #指定當切換到backup時,執行的腳本 notify_fault "path/xx.shVG_1" #故障時執行的腳本 notify /path/xx.sh #腳本所在目錄 smtp_alert #使用global_defs中提供的郵件地址和smtp服務器發送郵件通知} vrrp_instance VI_1 { state MASTER #指定哪個爲master,哪個爲backup interface eth0 #設置實例綁定的網卡 virtual_router_id 51 #VPID標記 priority 100 #優先級,高優先級的會搶佔爲master (默認爲搶佔模式) advert_int 1 #檢查間隔,1秒 authentication { #設置認證 auth_type PASS #認證方式 auth_pass 1111 #認證字符串(使用 openssl rand -hex 6生成隨機字符串) } virtual_ipaddress { #設置VIP <IPADDR>/<MASK> brd <IPADDR> dev <STRING>scope <SCOPE> label <LABEL> 192.168.200.17/24 deveth1 192.168.200.18/24 deveth2 label eth2:1 } notify_master<STRING>|<QUOTED-STRING> notify_backup<STRING>|<QUOTED-STRING> notify_fault<STRING>|<QUOTED-STRING> notify<STRING>|<QUOTED-STRING> smtp_alert } virtual_server 192.168.200.100 443 { delay_loop 6 #健康檢查時間間隔,單位秒 lb_algo rr #負載調度算法,支持的算法:rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR #LVS的類型:有NAT|DR|TUN nat_mask255.255.255.0 #子網掩碼 persistence_timeout50 #會話保持時間,單位秒(可以適當延長時間以保持session) protocol TCP #轉發協議類型,有TCP和UDP兩種 sorry_server 127.0.0.1 80 #web服務器全部失敗,可以指定Sorry web real_server 192.168.201.100443 { #定義RS 服務 weight 1#權重 inhibit_on_failure #當服務器健康檢查失效時,將weight設置爲0不是直接從ipvs中刪除 notify_up <STRING>|<QUOTED-STRING>#Server啓動時執行的腳本 notify_down <STRING>|<QUOTED-STRING>#Server down時執行的腳本 #後端RS服務器的檢查 (HTTP_GET 和SSL_GET): SSL_GET { url { #檢查url,可以指定多個,status_codeand digest path / digest ff20ad #或者status_code 200 .... } connect_timeout 3 #連接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 3 #重連間隔時間 } #也可以通過TCP_CHECK判斷RealServer的健康狀況: } }
二.keepalived+LVS_DR模型負載均衡實現集羣高可用:
1. 單主模型(master/backup)
實驗環境:
環境搭建:
1.分別在兩臺Director上安裝keepalived和相關的配置:
安裝前注意事項:
本機的主機名,要與hostname(uname -n)獲得的名稱保持一致;各節點要能相互解析主機名,一般建議通過hosts文件進行解析;各節點要進行時間同步(使用ntp時間服務器同步),確保iptables及selinux不會成爲服務阻塞。
(1)在Master上配置時間服務器並進行同步:
yum 安裝ntp服務器:yum install ntp -y
配置成本地時間服務器:編輯配置文件~]# vim/etc/ntp.conf添加如下內容:
restrict 172.16.0.0 netmask 255.255.0.0 nomodify notrap server 127.127.1.0 fudge 127.127.1.0 stratum 8 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst
啓動服務即可。其他節點可以通過命令ntpdate netserverIP來進行時間同步如:ntpdate172.16.99.3
(2)安裝keepalived和相關配置:
a.分別在172.16.99.3和172.16.99.5上安裝keepalived;此處可以yum安裝或者源碼安裝。此處使用yum安裝:yum install keepalived -y
b.配置:在172.16.99.3上的配置信息。
global_defs { notification_email { [email protected] } [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 3 router_id LVS_DEVEL # vrrp_mcast_group4224.99.99.18 } vrrp_script chk_down { #爲測試使用 script "[[ -f/etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 77 priority 100 advert_int 1 authentication { auth_type PASS auth_pass b17bfcfebf52 } virtual_ipaddress { 172.16.99.200/32 deveth0 label eth0:0 } sorry_server 172.16.99.380 track_script { chk_down } } virtual_server 172.16.99.200 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 172.16.99.1180 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry3 } } real_server 172.16.99.1280 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 dalay_before_retry3 } } }
在備用節點Backup172.16.99.5上的配置,只需要修改state BACKUP、virtual_router_id 77、priority 99即可,其他的配置和Master上的配置完全相同。
2.分別在兩臺RS上進行相關的配置:
通過編寫腳本進行相應的配置:
在其中一臺的RS172.16.99.11上的配置
#!/bin/bash echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore echo 1 >/proc/sys/net/ipv4/conf/eth0/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/eth0/arp_announce echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce sleep 3 ifconfig lo:0172.16.99.200 netmask 255.255.255.255 broadcast 172.16.99.200 up route add -host172.16.99.200 dev lo:0
另一臺RS腳本信息和172.16.99.11上的相同;
兩臺RS開啓web服務器。爲了演示實驗效果,讓網頁內容不同:
RS1網頁內容爲:
<h1>The web is 99.11 </h1>
RS2網頁內容爲:
<h1>The web is 99.12</h1>
關閉兩臺的iptables防火牆,關閉selinux.
3.啓動keepalived進行測試
查看一下ipvsadm 規則是否已經自動生成:
在目錄/etc/keepalived/下創建一個文件down,進行測試,當創建文件後,MASTER主機weight將會減2,最終導致VIP被BACKUP搶佔,keepalived默認工作在搶佔模式。
1.在172.16.99.3/etc/keepalived/目錄下創建down文件,查看VIP地址是否還存在:
日誌文件
2.在172.16.99.5上查看VIP是否存在
日誌文件:
2.雙主模型(MASTER/MASTER)
實驗結構:
雙主模型的實現主要是讓主Director和備用Director都能接受客戶端的訪問,設置兩個VIP,通過DNS服務器輪詢解析這兩個VIP來完成。
雙主模型的實現只需在單主模型的配置下,在配置文件中再加一個vrrp_instanceVI_2。只需做一下相應的修改,如下:
1.其中一臺Director(172.16.99.3)
當vrrp_instance VI_1爲state MASTER時:
vrrp_instance VI_2 {
stateBACKUP
interface eth0
virtual_router_id 177
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass d7a9dfb86ec4
}
virtual_ipaddress {
172.16.99.100/32 dev eth0 label eth0:1
}
track_script {
chk_down
}
其他的virtual_server 區域的配置和vrrp_instance VI_1的相同
2.在另一臺Director(172.16.99.5)上的配置:只需將上述的配置文件複製過去,然後修改以下幾項:
在vrrp_instance VI_2中,state MASTER、priority 100、
重新啓動keepalived:
99.3的日誌文件和IP:
99.5的日誌文件和IP:
2.在兩臺RS進行相關配置:
通過腳本進行修改:
#!/bin/bash echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/eth0/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/eth0/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce sleep 3 ifconfig lo:0 172.16.99.200 netmask 255.255.255.255 broadcast 172.16.99.200 up route add -host 172.16.99.200 dev lo:0 ifconfig lo:1 172.16.99.100 netmask 255.255.255.255 broadcast 172.16.99.100 up route add -host 172.16.99.100 dev lo:1
兩臺RS配置相同:
4.測試:
在一臺Director的/etc/keepalived/目錄下創建文件down,會發現兩個VIP會集中到另一臺上:
三.keepalived+Nginx負載均衡實現集羣高可用:
實現雙主模型:(MASTER/MASTER)
實驗結構圖:
實驗步驟:
1.在兩臺Nginx負載均衡器上進行配置keepalived和實現Nginx的負載均衡:
a.實現Nginx的負載均衡
編輯nginx的配置文件/etc/nginx/nginx.conf添加如下內容:
在http{}內添加:
upstream Rserver {
server 172.16.99.11:80 weight=1;
server 172.16.99.12:80 weight=1;
server 172.16.99.10:80 backup;
#當兩臺Upstream server宕機了,就會
# 顯示此web服務器的界面消息
}
再編輯/etc/nginx/conf.d/default.com文件,在server{}內添加:
location / {
proxy_pass http://Rserver/;
root /web/nginx/;
index index.html index.htm;
}
兩臺Nginx的負載均衡器配置相同。
進行測試,判斷nginx是否實現了負載均衡
b.編輯keepalived的配置文件(雙主模型)來實現Nginx負載均衡器的高可用:
配置內容如下:(先在172.16.99.3上配置)
global_defs { notification_email { [email protected] } [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 3 router_id LVS_DEVEL # vrrp_mcast_group4224.99.99.18 } vrrp_script chk_nginx { #檢查Nginx的運行狀態 script "killall -0nginx &> /dev/null" interval 1 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 77 priority 100 advert_int 1 authentication { auth_type PASS auth_pass b17bfcfebf52 } virtual_ipaddress { 172.16.99.200/32 deveth0 label eth0:0 } track_script { chk_nginx } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 100 priority 99 advert_int 1 authentication { auth_type PASS auth_pass d7a9dfb86ec4 } virtual_ipaddress { 172.16.99.100/32 deveth0 label eth0:1 } track_script { chk_down chk_nginx } }
在172.16.99.5上的配置,只需將此配置文件複製過去,然後修改以下幾項:
在vrrp_instance VI_1中:
state BACKUP
priority 99
在vrrp_instance VI_2中:
state MASTER
priority 100
2.啓動keepalived進行測試:
進行訪問:
將172.16.99.5的Nginx服務關閉:VIP(172.16.99.100)將轉移到另一臺的eth0:1上如下圖:訪問服務器能正常顯示網頁內容。
如果後端Upstream server 服務器都宕機了,客戶端在此訪問時,將會顯示server172.16.99.10:80 backup; 此web服務器的界面消息。如: