一、keepalived介紹
爲了保證業務不間斷的對外提供服務,從而需要有單獨的硬件(F5)或者軟件來監控服務是否能正常的提供服務,keepalived就是一種能夠監控後端服務是否能正常的提供服務的一種軟件,keepalived軟件是根據一種路由協議實現的,協議名叫做VRRP。
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中有一個免費的ARP是來解決路由器或者路由器中的緩存mac地址的問題免費ARP:通知同一個網段的主機更新地址表,緩存,mac地址
keepalived兩種工作模式
1.搶佔模式
如果backup工作在搶佔模式下,當收到vrrp報文後,會將自己的優先級與通告的優先級進行比對,若比通告的優先級高,則會主動搶佔爲master,否則繼續保持backup
2.非搶佔模式
如果backup工作在非搶佔模式下,只要master不發生故障,就算backup比master優先級高也不會搶佔爲master
keepalived核心功能
1.VRRP:地址轉移
2.檢查IPVS健康狀態,若後端服務出現故障,能夠自動的踢出和添加
3.添加IPVS規則,直接在keepalived配置文件中就可以添加IPVS功能
二、使用keepalived實現VRRP的雙主模型配置(單主則直接添加一個即可)
該配置只是在兩臺不同的主機上配置keepalived,沒有配置任何的服務,只是起到了VRRP能夠在任何一臺主機故障,虛擬IP地址還是可用
主機1
[root@centos7 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@loaclhost #這裏填寫可以真正發送郵件的郵件服務器 } notification_email_from keepalived@localhost #發送人 smtp_server 127.0.0.1 #主機地址 smtp_connect_timeout 10 #超時時間 router_id test1 #該ID不能與其他服務器一致 vrrp_mcast_group4 224.255.255.255 #廣播地址,可以使用任意廣播地址 } vrrp_instance VI_1 { #指定VRRP state MASTER #工作模式 interface ens38 #物理網卡 virtual_router_id 11 #相同的VRRP應該一致,不同的VRRP不能一致 priority 100 #優先級,1-255 advert_int 1 #每隔多久發送一個ARP authentication { auth_type PASS #認證機制, auth_pass 12345678 #密碼,最長8位字符 } virtual_ipaddress { 192.168.1.200/24 dev ens38 #虛擬IP地址,網卡等信息 } track_interface { ens38 #監控的網卡,可以監控多個 } } vrrp_instance VI_2 { state BACKUP interface ens38 virtual_router_id 22 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 87654321 } virtual_ipaddress { 192.168.1.222/24 dev ens38 } track_interface { ens38 } }
主機2
[root@centos7 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@loaclhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 10 router_id test2 vrrp_mcast_group4 224.255.255.255 } vrrp_instance VI_1 { state BACKUP interface ens38 virtual_router_id 11 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.200/24 dev ens38 } track_interface { ens38 } } vrrp_instance VI_2 { state MASTER interface ens38 virtual_router_id 22 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 87654321 } virtual_ipaddress { 192.168.1.222/24 dev ens38 } track_interface { ens38 } }
三、使用keepalived高可用IPVS
準備環境,若需要測試則需要四臺主機,兩臺做後端的提供web服務的機器,兩臺做高可用IPVS,這裏只配置前端高可用的配置
[root@centos7 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@loaclhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 10 router_id test1 vrrp_mcast_group4 224.255.255.255 } vrrp_instance VI_1 { state MASTER interface ens38 virtual_router_id 11 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.200/24 dev ens38 } track_interface { ens38 } } virtual_server 192.168.1.200 80 { #IPVS的設置,需要指定使用哪一個虛擬主機 delay_loop 1 #輪詢間隔 lb_algo rr #輪詢算法支持rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR #模型 DR|NAT|TUN persistence_timeout 10 超時時間 protocol TCP #使用協議,只支持TCP sorry_server 127.0.0.1 80 #當所有服務都不可用時,指定錯誤頁面,一般指向本機 real_server 192.168.1.153 80 { #都斷的服務器 weight 1 #權重 HTTP_GET { #方法,也可以使用SSL_GET定義https協議 url { path / #檢查的目錄 status_code 200 #返回的狀態碼 } nb_get_retry 3 #重試次數 delay_before_retry 10 #重試之前的延遲時長 connect_timeout 10 #請求超時時長 } } }
備用主機
[root@centos7 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@loaclhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 10 router_id test2 vrrp_mcast_group4 224.255.255.255 } vrrp_instance VI_1 { state BACKUP interface ens38 virtual_router_id 11 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.200/24 dev ens38 } track_interface { ens38 } } virtual_server 192.168.1.200 80 { delay_loop 1 lb_algo rr lb_kind DR persistence_timeout 10 protocol TCP sorry_server 127.0.0.1 80 real_server 192.168.1.153 80 { weight 1 HTTP_GET { url { path / status_code 200 } nb_get_retry 3 delay_before_retry 10 connect_timeout 10 } } }
在該模型下,也需要和IPVS配置NAT模型時更改的內核參數,和添加指向keepalived服務器的路由,參考更改配置如下,在多臺後端服務器上都需要修改,若需要永久生效,則需要將配置更改到/etc/sysctl.conf文件中
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 [root@centos7 ~]#ifconfig lo:0 192.168.1.200 netmask 255.255.255.255 broadcast 192.168.1.200 up [root@centos7 ~]#route add -host 192.168.1.200 dev lo:0
四、使用keepalived高可用nginx,因爲keepalived內置並不能直接高可用nginx,所以需要依靠腳本文件來實現,這裏只是簡單的實現高可用,基本拓撲圖如下圖,但是DNS一般就是指的添加兩條A記錄,並不是自己搭建DNS服務器
相關配置文件
調用腳本
1.定義腳本 vrrp_script 腳本名 { script "" interval INT #檢測間隔 weight -INT|+INT #表示滿足條件後增加權重或減少權重,從而達到動態的切換 } 2.調用腳本 track_script { 腳本1 腳本2 }
兩臺主機的相關配置
keepalivedA
[root@centos7 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@loaclhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 10 router_id test1 vrrp_mcast_group4 224.255.255.255 } vrrp_script test { script "killall -0 nginx" interval 1 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface ens38 virtual_router_id 11 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.200/24 dev ens38 } track_interface { ens38 } track_script { test } }
keepalivedB
[root@centos7 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@loaclhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 10 router_id test2 vrrp_mcast_group4 224.255.255.255 } vrrp_script test { script "killall -0 nginx" interval 1 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface ens38 virtual_router_id 11 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 12345678 } virtual_ipaddress { 192.168.1.200/24 dev ens38 } track_interface { ens38 } track_script { test } } vrrp_instance VI_2 { state MASTER interface ens38 virtual_router_id 22 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 87654321 } virtual_ipaddress { 192.168.1.222/24 dev ens38 } track_interface { ens38 } track_script { test } }