概述:
在之前的內容中,我們了解了當一個網站并發量大時,可以利用前端負載均衡器將用戶請求調度到后端的多個real server上,實現分散服務壓力,橫向擴展的方式,形成LB集群,但是試想一下,作為前端負載均衡器:
如果是LVS,萬一作為前端調度器的Director故障,則會導致所有服務器不可用,還有LVS無法對后端的各個Real Server做健康狀況檢測,無論后端Real Server是否故障,作為LVS調度器而言,都會將請求調度到根據算法指定的Real Server上,也就是如果某個Real Server故障,那么調度到該Real Server上的請求將會無法正常響應。
如果是Nginx作為前端調度器,雖然Nginx可以對后端的Upstream Server做健康狀況探測,當某個節點故障時,不會將請求調度到該節點上;但是,萬一Nginx調度器的節點本身發生故障,也會造成所有的服務不可用,也就是Nginx自身就是單點故障所在。
針對以上的情況,我們有必要對服務器進行高可用,當某個節點故障時,不會讓整個服務不可用,本篇就介紹一下利用keepalived實現對前端調度器的高可用的實現方案,具體分為以下幾個部分:
1、keepalived的相關概念簡介
2、keepalived實現vrrp(實現虛擬IP資源的轉移)
3、keepalived實現對LVS負載均衡調度器的高可用(主/備模型)
4、keepalived實現對Nginx服務的高可用(主/備模型)
5、keepalived實現雙主模型的高可用實現方案(主/主模型)
第一章 keepalived的相關概念簡介
1、VRRP協議,virtual redundant route protocol,虛擬冗余路由協議
能夠把多個物理路由器虛擬為一個虛擬路由器對外提供服務,vrrp協議能夠自動的識別當前哪個是活動節點,當活動節點故障后,能夠自動的將另一個作為活動節點對外提供服務
vrrp對外提供服務是,是利用虛擬出來一個地址,包括mac也是虛擬出來的,對外提供服務
2、VRRP協議的相關術語解釋
虛擬路由器:由一個主路由器和多個備份路由器組成,將其虛擬為一個路由器向外提供服務(注意,可能虛擬出來的不止一個虛擬路由器)
VRID:虛擬路由器標識,當虛擬出來多個虛擬路由器時,用來唯一標識某個虛擬路由器的ID號,0-255之間的有效數字
Master路由器:物理路由器中的主路由器,ACTIVE,用來承擔報文轉發任務的路由器,一般一個虛擬路由器集群只有一個Master路由器
Backup路由器:當Master路由器發生故障時,能夠代替Master路由器工作的路由器
虛擬IP地址(VIP):虛擬路由器向外提供服務的IP地址,一個虛擬路由器可以有一個或多個IP地址
IP地址擁有者:物理路由器的接口的IP地址與虛擬IP地址相同的路由器,稱為IP地址擁有者,也就是Master路由器
虛擬MAC(VMAC):虛擬路由器的虛擬MAC地址,虛擬MAC地址的格式為00-00-5E-00-01-{VRID},因此,VRID范圍就是0-255,VMAC前5段是固定的,后面是VRID
優先級:VRRP是根據優先級來決定誰是Master路由器,誰是Backup路由器,優先級由數字表示,可用范圍為0-254
3、VRRP的工作模式:
搶占方式:僅根據優先級來判斷哪個路由器作為Master路由器。當原來的Master故障后,Backup路由器會作為新的Master路由器,但是當原來的Master恢復后,由于其優先級高,會又變回Master路由器,從新將資源搶占回來
非搶占方式:當原來的Master故障后,Backup路由器會作為新的Master路由器,當原來的Master恢復后,不會搶占成為Master路由器,而是作為Backup路由器
為了保證Master路由器和Backup路由器能夠協調工作,VRRP需要實現以下功能:
<1>Master路由器的選舉
<2>Master路由器的狀態通告(傳遞心跳信息,優先級等)
<3>為了提高安全性,還需要提供認證功能(防止外來的路由器隨意加入到集群中),支持的認證方式有:
無認證
簡單字符串認證,預共享秘鑰
md5認證
4、keepalived簡介
keepalived最初的設計目標是為了實現lvs設備的高可用,keepalived能夠根據配置文件中的定義生成ipvs規則,并能夠對各個real server的健康狀態進行檢測(LVS實際上按照高可用的角度來講,只有兩個資源,一個是VIP,一個是內核上的ipvs規則)
keepalived的功能主要是:
<1> vrrp協議的軟件實現,原生設計的目的是為了高可用ipvs服務
<2> vrrp協議完成地址流動
<3> 為vip地址所在的地址生成ipvs規則(在keepalived配置文件中預先定義)
<4> 為ipvs集群的各RS做健康狀態檢測
<5> 基于腳本調用接口,通過執行腳本完成腳本中定義的功能(如對其他服務的高可用),進而影響集群事物
5、keepalived的軟件結構
一般啟動keepalived之后,會啟動一個主進程(讀取和分析配置文件,并根據配置文件,指揮兩個子進程完成相關工作),兩個子進程,其中一個子進程用來實現VRRP協議,另一個是checkers進程,用來監控lvs后端的各個real server的健康狀況,還有一些外圍其他服務的監控腳本的實現
主進程還能利用內核提供的watchdog模塊,實現對兩個子進程的健康性檢查,當發現某個子進程故障后,主進程會kill掉這個子進程,然后再從新啟一個子進程
watchdog能夠讓兩個子進程每隔一段時間,向主進程的socket套接字上發送信息,當某一時刻,主進程無法收到子進程的信息,就判斷子進程故障,然后就殺掉,重啟子進程
兩個節點之間哪個為主,哪個為備用節點,是由優先級來決定的,當初始時,優先級高的為主節點,當其中某一個節點故障,無法啟動,則另一個節點會替換上來,作為主的,向外提供服務。另一種情況,當節點本身正常,但是節點上的某服務,也就是某資源不正常時,這時keepalived的子進程checkers就會將當前節點的優先級降級,從而實現了另一個備用節點的優先級要高于該節點,當下次節點間相互通告信息時,備用節點就會發現自己的優先級比當前活動節點的優先級要高,然后就提升為主節點,啟動資源,對外提供服務
優先級的數字是0-255,值越大,優先級越高,0和255被系統自身占用,不能作為可用的優先級的數字進行調整
第二章 keepalived實現vrrp(實現虛擬IP資源的轉移)
1、實驗環境
2、實驗前準備工作
<1> 各個節點的時間同步
在某個節點(本例中為10.1.32.68主機)上安裝ntp服務,作為時間服務器,修改其配置文件中server相關的參數,將server修改為127.127.1.0,從本機同步時間,啟動ntpd服務
其他keepalived向該服務器同步時間
驗證各個keepalived節點的時間是否一致
<2> 節點之間可基于ssh秘鑰進行認證
<3> 各節點解析的主機名與實際主機名保持一致
在各個節點上的/etc/hosts文件中編輯主機名與IP的對應關系,實現解析結果與實際主機名的一致性
<4> 確保iptables和selinux不會阻礙實驗的正常進行
3、配置實驗環境
4、安裝keepalived
5、配置node72的keepalived服務
[root@node72 ~]# ######## 備份配置文件 ######## [root@node72 ~]# cp /etc/keepalived/keepalived.conf{,.bak} [root@node72 ~]# ######## 編輯修改配置文件 ######## [root@node72 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost ######## 定義節點狀態發生變化時發送通知的目標郵箱地址 ######## } notification_email_from keepalived_test@nwc.com ######## 定義發件人的信息 ######## smtp_server 127.0.0.1 ######## 定義郵箱服務器地址 ######## smtp_connect_timeout 30 ######## 定義郵箱服務器的鏈接超時時間 ######## router_id node72 ######## 定義本機的路由器ID,自定義即可 ######## vrrp_mcast_group4 224.0.32.18 ######## 定義心跳信息通告的組播地址,同一個集群的組播地址一樣 ######## } vrrp_instance VI_1 { ######## 定義一個虛擬路由器的實例,實例名稱為VI_1 ######## state MASTER ######## 定義本節點在該虛擬路由器實例中的初始角色,MASTER還是BACKUP ######## interface eno16777736 ######## 虛擬路由器的工作的接口 ######## virtual_router_id 32 ######## 虛擬路由器ID(也就是VRID),用以區別不同的虛擬路由器實例 ######## priority 100 #####定義當前節點在該虛擬路由器實例中的優先級,MASTER要比BACKUP節點的優先級高##### advert_int 1 ######## 定義通告信息發送的時間間隔 ######## authentication { ######## 定義認證機制和認證的秘鑰 ######## auth_type PASS ######## PASS為簡單字符認證,建議使用PASS即可 ######## auth_pass 12345678 ######## 認證的秘鑰,最大有效值為8位長度 ######## } virtual_ipaddress { ######## 定義該虛擬路由器的VIP ######## 10.1.32.1/16 dev eno16777736 label eno16777736:0 ######## VIP為10.1.32.1/16,定義在eno16777736接口的 eno16777736:0別名上 ######## } } track_interface { ###定義要監控的接口,一旦接口出現故障,則節點會轉為FAULT狀態,觸發重新選舉,實現資源轉移### eno16777736 }
6、配置node73的keepalived服務
[root@node73 ~]# ######## 備份配置文件 ######## [root@node73 ~]# cp /etc/keepalived/keepalived.conf{,.bak} [root@node73 ~]# ######## 編輯修改配置文件 ######## [root@node73 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost ######## 定義節點狀態發生變化時發送通知的目標郵箱地址 ######## } notification_email_from keepalived_test@nwc.com ######## 定義發件人的信息 ######## smtp_server 127.0.0.1 ######## 定義郵箱服務器地址 ######## smtp_connect_timeout 30 ######## 定義郵箱服務器的鏈接超時時間 ######## router_id node73 ######## 定義本機的路由器ID,自定義即可 ######## vrrp_mcast_group4 224.0.32.18 ######## 定義心跳信息通告的組播地址,同一個集群的組播地址一樣 ######## } vrrp_instance VI_1 { ######## 定義一個虛擬路由器的實例,實例名稱為VI_1 ######## state BACKUP ######## 定義本節點在該虛擬路由器實例中的初始角色,MASTER還是BACKUP ######## interface eno16777736 ######## 虛擬路由器的工作的接口 ######## virtual_router_id 32 ######## 虛擬路由器ID(也就是VRID),用以區別不同的虛擬路由器實例 ######## priority 95 ######## 定義當前節點在該虛擬路由器實例中的優先級 ######## advert_int 1 ######## 定義通告信息發送的時間間隔 ######## authentication { ######## 定義認證機制和認證的秘鑰 ######## auth_type PASS ######## PASS為簡單字符認證,建議使用PASS即可 ######## auth_pass 12345678 ######## 認證的秘鑰,最大有效值為8位長度 ######## } virtual_ipaddress { ######## 定義該虛擬路由器的VIP ######## 10.1.32.1/16 dev eno16777736 label eno16777736:0 ######## VIP為10.1.32.1/16,定義在eno16777736接口的 eno16777736:0別名上 ######## } } track_interface { ###定義要監控的接口,一旦接口出現故障,則節點會轉為FAULT狀態,觸發重新選舉,實現資源轉移### eno16777736 }
7、驗證VRRP的高可用性
8、利用自定義腳本,在keepalived中調用自定義的腳本實現節點狀態轉移時的通知機制
實現當節點狀態發生轉移時,發送郵件給當前系統的root用戶
編寫腳本: [root@node72 ~]# [root@node72 ~]# vim /etc/keepalived/notify.sh #!/bin/bash # Author:nwc # Time:2016-11-01 12:56:17 # contact='root@localhost' ##定義變量contact,其值為root@localhost,指明通告給誰,也就是郵件發送給誰 vip="10.1.32.1" ##定義變量vip,其值為VIP的地址 notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1" echo $mailbody | mail -s "$mailsubject" $contact } ##定義一個notify函數,用于發送郵件,定義了郵件的主題和郵件的正文部分,函數可以接受函數自身的位置參數 case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: `basename $0` master|backup|fault" ;; esac ##定義一個循環,當腳本的位置參數$1為對應值時,調用函數發送郵件
第三章 keepalived實現對LVS負載均衡調度器的高可用(主/備模型)
1、實驗環境
2、準備實驗環境、各節點時間同步,ssh秘鑰登錄,節點解析與主機名一致配置過程省略
3、根據實驗環境,配置LVS-DR模型各個Real Server對應的配置(本例中利用腳本實現)
腳本為: #!/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 lo:0 10.1.32.1 netmask 255.255.255.255 broadcast 10.1.32.1 route add -host 10.1.32.1 dev lo:0 ;; stop) 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 down ;; *) echo "error" exit ;; esac
4、在各個Real Server上提供httpd服務,提供測試頁面,以供測試之用
5、在Director1上安裝配置keepalived,實現對LVS調度器的高可用
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived_test@nwc.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node72 vrrp_mcast_group4 224.0.32.18 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 32 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.32.1/16 dev eno16777736 label eno16777736:0 } track_interface { eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 10.1.32.1 80 { ####將哪個ip的哪個端口定義為LVS的負載均衡集群服務#### delay_loop 6 ### 定義服務輪詢時間間隔,單位秒 ### lb_algo rr ### 定義集群調度算法 ### lb_kind DR ### 定義LVS的工作模型 NAT|DR|TUN ### # nat_mask 255.255.255.0 ### 當工作模型是NAT時,NAT的掩碼 ### # persistence_timeout 50 ### 定義LVS的是否啟用持久連接,不加此選項,代表不啟用,如果啟用,定義時長 ### protocol TCP ### 定義集群的服務的協議類型,keepalived只支持TCP的 ### sorry_server 10.1.32.72 80 ###定義當LVS后端的real sever全部不可用后的錯誤頁面的服務器### real_server 10.1.32.68 80 { ### 定義一個后端real server ### weight 1 ### 指明權重 ### HTTP_GET { ### 指明檢測健康狀況的方法 ### url { ## 表示請求某個URL進行檢查,要求響應狀態碼為200 ### path / status_code 200 } connect_timeout 3 ###檢測時,對方無響應的超時時間### nb_get_retry 3 ### 檢測重試次數 ### delay_before_retry 3 ### 每次檢測的間隔時間 ### } } real_server 10.1.32.168 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
6、在Director2上安裝配置keepalived,實現LVS調度器的高可用
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived_test@nwc.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node73 vrrp_mcast_group4 224.0.32.18 } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 32 priority 95 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 10.1.32.1/16 dev eno16777736 label eno16777736:0 } track_interface { eno16777736 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } sorry_server 10.1.32.73 80 virtual_server 10.1.32.1 80 { delay_loop 6 lb_algo rr protocol TCP real_server 10.1.32.68 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 10.1.32.168 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
7、在兩臺Director上提供httpd服務,用于實現提供當所有Real Server都不可用時的錯誤頁面
8、在兩臺Director上啟動keepalived服務,客戶端訪問VIP,驗證是否正常
停掉某個Real Server,驗證對后端的real server的健康性檢測是否生效
停掉keepalived的主節點后的Director后,驗證服務是否可用
停掉兩個Real Server,驗證錯誤頁面服務器的配置是否生效
停掉兩個節點的keepalived服務后,服務就無法正常訪問了
第四章 keepalived實現對Nginx服務的高可用(主/備模型)
1、實驗環境
2、在兩個nginx節點上yum安裝keepalived,rpm安裝nginx;在兩個web服務器上安裝httpd,提供測試頁面
3、配置網絡環境
4、啟動后端兩臺web服務器,驗證服務是否正常
5、配置nginx將用戶請求反代到兩臺web服務器,驗證服務是否正常
6、在ngx1上配置keepalived,實現對nginx服務的高可用
7、在ngx2主機上配置keepalived對nginx服務進行高可用
8、啟動兩個節點的keepalived,驗證高可用是否生效
9、利用狀態轉移時的通知腳本機制,定義當節點狀態發生變化時,后續的動作。
本例以:當節點變為主節點時不做任何操作,當節點變為備用節點時,停止nginx
腳本為 #!/bin/bash # Author:nwc # Time:2016-11-01 12:56:17 # contact='root@localhost' ##定義變量contact,其值為root@localhost,指明通告給誰,也就是郵件發送給誰 vip="10.1.32.1" ##定義變量vip,其值為VIP的地址 notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date +"%F %T"`:vrrp transition,`hostname` change to be $1" echo $mailbody | mail -s "$mailsubject" $contact } ##定義一個notify函數,用于發送郵件,定義了郵件的主題和郵件的正文部分,函數可以接受函數自身的位置參數 case $1 in master) notify master ;; backup) notify backup nginx -s reload ;; fault) notify fault ;; *) echo "Usage: `basename $0` master|backup|fault" ;; esac ##定義一個循環,當腳本的位置參數$1為對應值時,調用函數發送郵件
在keepalived配置文件中進行引用
第五章 keepalived實現雙主模型的高可用實現方案(主/主模型)
1、實驗環境
2、利用上個實驗的環境,實現將前端nginx做成雙主模型
在上個實驗的基礎上,只需要配置定義兩個vrrp實例,其中一個vrrp實例的ngx1節點上是主節點,在ngx2節點上是備用節點,另一個vrrp實例在ngx1上是備用節點,在ngx2上是主節點
3、啟動keepalived服務,驗證配置
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/56546