企業級Nginx負載均衡與keepalived高可用實戰(二)keepalived篇

一、Keepalived高可用軟件

1.一、Keepalived介紹

  • Keepalived軟件起初是專門爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的VRRP功能。所以,Keepalived除了可以管理LVS軟件外,還能夠做爲其餘服務(例如:Nginx,Haproxy,MySQL等)的高可用解決方案軟件。
  • Keepalived軟件主要是經過VRRP協議實現高可用功能的。VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗餘協議)的縮寫,VRRP出現的目的就是爲了解決靜態路由單點故障問題的,他可以保證當個別節點宕機時,整個網絡能夠不間斷地運行。因此,Keepalived一方面具備配置管理LVS的功能,同時還具備對LVS下面節點進行健康檢查的功能,另外一方面也可實現系統網絡服務的高可用功能。
  • Keepalived軟件的官方站點是http://www.keepalived.org

1.二、Keepalived服務的三個重要功能

  • 管理LVS負載均衡軟件
      早期的LVS軟件,須要經過命令行或腳本實現管理,而且沒有針對LVS節點的健康檢查功能。爲了解決LVS的這些使用不便問題,Keepalived誕生了,能夠說,Keepalived軟件起初是專爲解決LVS的問題而誕生的。所以,Keepalived和LVS的感情很深,他們的關係如同夫妻同樣,能夠緊密地結合,愉快地工做。Keepalived能夠經過讀取自身的配置文件,實現經過更底層的接口直接管理LVS的配置以及控制服務的啓動,中止功能,這使得LVS的應用更加簡單方便了。
  • 實現對LVS集羣節點健康檢查功能(healthcheck)
      前文已講過,Keepalived能夠經過在自身的Keepalived.conf文件裏配置LVS的節點IP和相關參數實現對LVS的直接管理;除此以外,當LVS集羣中的某一個甚至是幾個節點服務器同時發生故障沒法提供服務時,Keepalived服務會自動將失效的節點服務器從LVS的正常轉發隊列中清除出去,並將請求調度到別的正常節點服務器上,從而保證最終用戶的訪問不受影響;當故障的節點服務器被修復之後,Keepalived服務又會自動地把它們加入到正常轉發隊列中,對客戶提供服務。
  • 做爲系統網絡服務的高可用功能(failover)
    • Keepalived能夠實現任意兩臺主機之間,例如Master和Backup主機之間的故障轉移和自動切換,這個主機能夠是普通的不能停機的業務服務器,也能夠是LVS負載均衡,Nginx反向代理這樣的服務器。
    • Keepalived高可用功能實現的簡單原理爲,兩臺主機同時安裝好Keepalived軟件並啓動服務,開始正常工做時,由角色爲Master的主機得到全部資源並對用戶提供服務,角色爲Backup的主機做爲Master主機的熱備;當角色爲Master的主機失效或出現故障時,角色爲Backup的主機將自動接管Master主機的全部工做,包括接管VIP資源及相應資源服務;而當角色爲Master的主機故障修復後,又會自動接管回它原來處理的工做,角色爲Backup的主機則同時釋放Master主機失效時它接管的工做,此時,兩臺主機將恢復到最初啓動時各自的原始角色及工做狀態。

1.三、Keepalived高可用故障切換轉移原理

    • Keepalived高可用服務之間的故障切換轉移,是經過VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議)來實現的。
    • 在Keepalived服務正常工做時,主Master節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup節點本身還活着,當主Master節點發生故障時,就沒法發送心跳消息,備節點也就所以沒法繼續檢測到來自主Master節點的心跳了,因而調用自身的接管程序,接管主Master節點的IP資源及服務。而當主Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
    • 那麼,什麼是VRRP呢?
      VRRP,全稱Virtual Router Redundancy Protocol,中文名爲虛擬路由冗餘協議,VRRP的出現就是爲了解決靜態路由的單點故障問題,VRRP是經過一種競選機制來將路由的任務交給某臺VRRP路由器的。
    • VRRP早期是用來解決交換機,路由器等設備單點故障的,下面是交換,路由的Master和Backup切換原理描述,一樣適用於Keepalived的工做原理。
    • 在一組VRRP路由器集羣中,有多臺物理VRRP路由器,可是這多臺物理的機器並非同時工做的,而是由一臺稱爲Master的機器負責路由工做,其餘的機器都是Backup。Master角色並不是一成不變的,VRRP會讓每一個VRRP路由參與競選,最終獲勝的就是Master。獲勝的Master有一些特權,好比擁有虛擬路由器的IP地址等,擁有系統資源的Master負責轉發發送給網關地址的包和響應ARP請求。
    • VRRP經過競選機制來實現虛擬路由器的功能,全部的協議報文都是經過IP多播(Multicast)包(默認的多播地址224.0.0.18)形式發送的。虛擬路由器由VRID(範圍0-225)和一組IP地址組成,對外表現爲一個周知的MAC地址:00-00-5E-00-01-{VRID}。因此,在一個虛擬路由器中,無論誰是Master,對外都是相同的MAC和IP(稱之爲VIP)。客戶端主機並不須要因Master的改變而修改本身的路由配置。對他們來講,這種切換是透明的。
    • 在一組虛擬路由器中,只有做爲Master的VRRP路由器會一直髮送VRRP廣播包(VRRP Advertisement messages),此時Backup不會搶佔Master。當Master不可用時,Backup就收不到來自Master的廣播包了,此時多臺Backup中優先級最高的路由器會搶佔爲Master。這種搶佔是很是快速的(可能只有1秒甚至更少),以保證服務的連續性。出於安全性考慮,VRRP數據包使用了加密協議進行了加密。

Keepalived高可用之間是經過VRRP通訊的,所以,我從VRRP開始給您講起:前端

  1. VRRP也就是虛擬路由冗餘協議,它的出現就是爲了解決靜態路由的單點故障。
  2. VRRP是經過一種競選協議機制來將路由任務交給某臺VRRP路由器的。
  3. VRRP用IP多播的方式(默認多播地址(224.0.0.18))實現高可用之間通訊。
  4. 工做時主節點發包,備節點接包,當備節點接收不到主節點發的數據包的時候,就啓動接管程序接管主節點的資源。備節點能夠有多個,經過優先級競選,但通常Keepalived系統運維工做中都是一對。
  5. VRRP使用了加密協議加密數據,但Keepalived官方目前仍是推薦用明文的方式配置認證類型和密碼。

介紹完了VRRP,接下來我再介紹一下Keepalived服務的工做原理:ios

  • Keepalived高可用之間是經過VRRP進行通訊的,VRRP是經過競選機制來肯定主備的,主的優先級高於備,所以,工做時主會優先得到全部的資源,備節點處於等待狀態,當主掛了的時候,備節點就會接管主節點的資源,而後頂替主節點對外提供服務。
  • 在Keepalived服務之間,只有做爲主的服務器會一直髮送VRRP廣播包,告訴備它還活着,此時備不會搶佔主,當主不可用時,即備監聽不到主發送的廣播包時,就會啓動相關服務接管資源,保證業務的連續性。接管速度最快能夠小於1秒。

二、Keepalived高可用服務搭建準備

2.一、安裝Keepalived環境說明

  • 硬件環境準備
    準備4臺物理服務器或4臺VM虛擬機,兩臺用來作Keepalived服務,兩臺作測試的Web節點以下表所示:
HOSTNAME IP 說明
lb01 192.168.103.121 Keepalived主服務器(Nginx主負載均衡器)
lb02 192.168.103.122 Keepalived備服務器(Nginx備負載均衡器)
web01 192.168.103.123 web01服務器
web02 192.168.103.124 web02服務器

 

  • CentOS系統及Nginx代理環境

2.二、開始安裝Keepalived軟件

說明:下面有關Keepalived安裝,啓動服務的操做都是同時處理lb01,lb02兩臺機器。nginx

可經過官方地址獲取Keepalived源碼軟件包編譯安裝,也可使用yum的安裝方式直接安裝,這裏選擇更爲簡便額後者--yum安裝方式,下面以lb01爲例,介紹整個安裝步驟,以下:web

//lb01
[root@lb01 /]# yum install keepalived -y
[root@lb01 /]# rpm -qa keepalived
keepalived-1.3.5-8.el7_6.5.x86_64

//lb02
[root@lb02 /]# yum install keepalived -y
[root@lb02 /]# rpm -qa keepalived
keepalived-1.3.5-8.el7_6.5.x86_64

提示:數據庫

1)上述安裝過程須要在lb01和lb02兩臺服務器上同時安裝。
2)Keepalived版本爲3.5版vim

2.三、啓動Keepalived服務並檢查

 

啓動服務命令:安全

service keepalived start
systemctl enable keepalived.service

建議查找資料將服務作成開機自動運行。bash

檢查服務是否正常啓動敲以下命令查看日誌:服務器

journalctl -xe

2.四、Keepalived配置文件說明

和其餘使用yum安裝的軟件同樣,Keepalived軟件的配置文件默認路徑及配置文件名爲:網絡

[root@lb01 /]# ls -l /etc/keepalived/keepalived.conf 
-rw-r--r--. 1 root root 3598 7月  30 01:19 /etc/keepalived/keepalived.conf

前面已經說過,Keepalived軟件有3個主要功能,而這裏僅講解其高可用部分的功能。

這裏的具有高可用功能的Keepalived.conf配置文件包含了兩個重要區塊,下面會分別說明

  • 全局定義(Global Definitions)部分
    這部分主要用來設置Keepalived的故障通知機制和Router ID標識。示例代碼以下:
    global_defs {
       notification_email {                   # 定義服務故障報警的Email地址。做用是當服務發生切換或RS節點等有故障時,發報警郵件。這幾行是可選配置,notification_email指定在Keepalived發生事件時,須要發送的Email地址,能夠有多個,每行一個。【可選的配置】
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc    # 指定發送郵件的發送人,即發件人地址。【可選的配置】
       smtp_server 192.168.200.1              # 指定發送郵件的smtp服務器,若是本機開啓了sendmail或postfix,就可使用上面默認配置實現郵件發送。【可選配置】
       smtp_connect_timeout 30                # 接smtp的超時時間。【可選配置】
       router_id LVS_DEVEL                    # Keepalived服務器的路由標識(router_id).在一個局域網內,這個標識(router_id)應該是惟一的。建議使用機器名【【必須】】
     vrrp_skip_check_adv_addr # 檢查vrrp報文中的全部地址比較耗時,設置此標誌的意思是若是接收的到報文和上一個報文來至同一個路由器,則不執行檢查。默認是跳過檢查 vrrp_strict # 嚴格執行VRRP協議規範,此模式不支持節點單播,引發vip問題的就是這個參數 vrrp_garp_interval 0
       vrrp_gna_interval 0
    }

    建議去掉紅色標註部分
    大括號「{}」。用來分隔區塊,要成對出現。若是漏寫了半個大括號,Keepalived運行時,不會報錯,但也不會獲得預期的結果。另外,因爲區塊間存在多層嵌套關係,所以很容易遺漏區塊結尾處的大括號,要特別注意。

  • VRRP實例定義區塊(VRRP instance(s))部分
    vrrp_instance VI_1 {                    # 表示定義一個vrrp_instance實例,名字是VI_1,每一個vrrp_instance實例能夠認爲是Keepalived服務的一個實例或者做爲一個業務服務,在Keepalived服務配置中,這樣的vrrp_instance實例能夠有多個。注意,【存在於主節點中的vrrp_instance實例在備節點中也要存在,這樣才能實現故障切換接管】
        state MASTER                        # 表示當前實例VI_1的【角色狀態】,當前角色爲MASTER,這個狀態只能有【MASTER】和【BACKUP】兩種狀態,而且須要【大寫】這些字符。其中MASTER爲正式工做的狀態,BACKUP爲備用的狀態。當MASTER所在的服務器故障或失效時,BACKUP所在的服務器會接管故障的MASTER繼續提供服務。
        interface eth0                        # 網絡通訊接口。爲對外提供服務的網絡接口,如eth0,eth1。當前主流的服務器都有2~4個網絡接口,在選擇服務接口時,要搞清楚了。
        virtual_router_id 51                # 虛擬路由ID標識,這個標識最好是一個【數字】,而且要在一個keepalived.conf配置中是【惟一的】。【可是MASTER和BACKUP配置中相同實例的virtual_router_id又必須是【一致的】,不然將出現腦裂問題。】
        priority 100                        # 數字越大,表示實例優先級越高。在同一個vrrp_instance實例裏,MASTER的優先級配置要高於BACKUP的。若MASTER的priority值爲150,那麼BACKUP的priority必須小於150,通常建議【間隔50以上爲佳】,例如:設置BACKUP的priority爲100或更小的數值。
        advert_int 1                        # 同步通知間隔。MASTER與BACKUP之間通訊檢查的時間間隔,單位爲秒,默認爲1.
        authentication {                    # 權限認證配置。包含認證類型(auth_type)和認證密碼(auth_pass)。
            auth_type PASS                  # 認證類型有PASS(Simple Passwd(suggested)),AH(IPSEC(not recommended))兩種,官方推薦使用的類型爲PASS。
            auth_pass 1111                  # 驗證密碼爲明文方式,最好長度不要超過8個字符,建議用4位數字,同一vrrp實例的MASTER與BACKUP使用相同的密碼才能正常通訊。
        }
        virtual_ipaddress {                 # 虛擬IP地址。能夠配置多個IP地址,每一個地址佔一行,配置時最好明確指定子網掩碼以及虛擬IP綁定的網絡接口。不然,子網掩碼默認是32位,綁定的接口和前面的interface參數配置的一致。注意,這裏的虛擬IP就是在工做中須要和域名綁定的IP,即和配置的高可用服務監聽的IP要保持一致!
            192.168.200.16
            192.168.200.17
            192.168.200.18
        }
    }

     

三、Keepalived高可用服務單實例實戰

3.一、配置Keepalived實現單實例單IP自動漂移接管

  • 事實上,網絡服務的高可用功能基本原理都很簡單,就是把手動的操做自動化運行而已。當沒有配置高可用服務時,若是服務器宕機了怎麼解決呢?無非就是找一個新服務器,配好域名解析的那個原IP,而後搭好相應的網絡服務罷了,只不過手工去實現這個過程會比較漫長,相比而言,自動化切換效率更高,效果更好,並且還能夠有更多的功能,例如:發送ARP廣播,觸發執行相關腳本動做等。
  • 實際上也能夠將高可用對的兩臺機器應用服務同時開啓,可是隻讓有VIP一端的服務器提供服務,若主的服務器宕機,VIP會自動漂移到備用服務器上,此時用戶的請求直接發送到備用服務器上,而無需臨時啓動對應服務(事先開啓應用服務)。下面就來學習VIP自動漂移的實戰案例。

實戰配置Keepalived主服務器lb01 MASTER

  1. 配置lb01 MASTER的keepalived.conf配置文件
    [root@lb01 /]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         786744873@qq.com          # 郵箱隨便寫
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1       # 郵件服務器IP
       smtp_connect_timeout 30
       router_id lb01              # id爲lb1,不能和其餘Keepalived節點相同(全局惟一)
    }
    
    vrrp_instance VI_1 {           # 實例名字爲VI_1,相同實例的備節點名字要和這個相同
        state MASTER               # 狀態爲MASTER,備節點狀態須要爲BACKUP
        interface enp0s3           # 通訊(心跳)接口enp0s3,此參數備節點設置和主節點相同,其實是網卡名稱
        virtual_router_id 55       # 實例ID爲55,要和備節點相同
        priority 150               # 優先級爲150,備節點的優先級必須比此數字低
        advert_int 1               # 通訊檢查間隔時間1秒
        authentication {
            auth_type PASS         # PASS認證類型,此參數備節點設置和主節點相同
            auth_pass 1111         # 密碼1111,此參數備節點設置和主節點相同
        }
        virtual_ipaddress {
            192.168.103.120/24 dev enp0s3 label enp0s3:1 #虛擬IP,即VIP爲192.168.103.120,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:1,此參數備節點設置和主節點相同
        }
    }
  2. 配置完畢後,啓動Keepalived服務,以下:
    [root@lb01 /]# service keepalived restart
  3. 而後檢查配置結果,查看是否有虛擬IP 192.168.103.120
    [root@lb01 /]# ip a | grep 192.168.103.120
        inet 192.168.103.120/24 scope global secondary enp0s3:1
  4. 測試master

實戰配置Keepalived備服務器lb02 BACKUP

  1. 配置lb02 BACKUP的keepalived.conf配置文件,操做步驟以下:
    [root@lb02 /]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         786744873@qq.com
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id lb02              # id爲lb2,不能和其餘Keepalived節點相同(全局惟一)
    }
    
    vrrp_instance VI_1 {
        state BACKUP               #此參數和lb01 MASTER不一樣
        interface enp0s3
        virtual_router_id 55
        priority 100               # 此參數和lb01 MASTER不一樣
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.103.120/24 dev enp0s3 label enp0s3:1
        }
    }
  2. 配置完成後,啓動Keepalived服務,以下:
    [root@lb02 /]# service keepalived restart
    Redirecting to /bin/systemctl restart keepalived.service
  3. 而後檢查配置結果,查看是否有虛擬IP 192.168.103.120
    [root@lb02 /]# ip a | grep 192,168.103.120
    [root@lb02 /]# 

    這裏沒有返回任何結果就對了,由於lb02爲BACKUP,當主節點活着的時候,它不會接管 192.168.103.120

    • 出現上述無任何結果的現象,表示lb02的Keepalived服務單實例配置成功。若是同窗們的配置過濾後有192.168.103.120的IP,則表示Keepalived工做不正常,同一個IP地址同一時刻應該只能出現一臺服務器。
    • 若是查看BACKUP備節點VIP有以下信息,說明高可用裂腦了,裂腦是兩臺服務器爭搶同一資源致使的,例如:兩邊都配置了同一個VIP地址。
    • 出現上述兩臺服務器爭搶同一IP資源問題,通常要先考慮排查兩個地方:
      1)主備兩臺服務器對應的Keepalived.conf配置文件是否有錯誤?例如,是否同一實例的virtual_router_id配置不一致。
  4. 進行高可用主備服務器切換實驗
    // lb01
    [root@lb01 /]# ip a | grep 192.168.103.120        #虛擬VIP在lb01服務器上
        inet 192.168.103.120/24 scope global secondary enp0s3:1
    [root@lb01 /]# service keepalived stop              #停掉服務
    Redirecting to /bin/systemctl stop keepalived.service
    [root@lb01 /]# ip a | grep 192.168.103.120        #虛擬VIP消失了
    [root@lb01 /]# 
    
    // lb02
    [root@lb02 /]# ip a | grep 192.168.103.120          #虛擬VIP出如今了lb02上
        inet 192.168.103.120/24 scope global secondary enp0s3:1
    • 咱們能夠發現,備節點lb02已經接管綁定了192.168.103.120這個VIP,這期間備節點還會發送ARP廣播,讓全部的客戶端更新本地的ARP表,以便客戶端訪問新接管VIP服務的節點。
    • 此時若是再啓動主服務器的Keepalived服務,主服務器就會接管回VIP 192.168.0.240,啓動後能夠觀察下主備的IP漂移狀況,備服務器是否釋放了IP?主服務器是否又接管了IP?
    主節點啓動Keepalived服務後,發現很快就又接管了VIP 192.168.103.120,操做及檢查步驟以下:
    [root@lb01 /]# ip a | grep 192.168.103.120        #虛擬VIP在lb01服務器上
        inet 192.168.103.120/24 scope global secondary enp0s3:1

    說明:
    這裏僅實現了VIP的自動漂移切換,所以,僅適合兩臺服務器提供的服務均保持開啓的應用場景,這也是工做中經常使用的高可用解決方案。

    Keepalived配置參數 MASTER節點特殊參數 BACKUP節點特殊參數
    router_id(惟一標識) router_id lb01 router_id lb02
    state(角色狀態) state MASTER state BACKUP
    priority(競選優先級) priority 150 priority 100

四、Keepalived高可用服務器的「裂腦」問題

4.一、什麼是裂腦

因爲某些緣由,致使兩臺高可用服務器對在指定時間內,沒法檢測到對方的心跳消息,各自取得資源及服務的全部權,而此時的兩臺高可用服務器對都還活着並在正常運行,這樣就會致使同一個IP或服務在兩端同時存在而發生衝突,最嚴重的是兩臺主機佔用同一個VIP地址,當用戶寫入數據時可能會分別寫入到兩端,這可能會致使服務器兩端的數據不一致或形成數據丟失,這種狀況就被稱爲裂腦。

4.二、致使裂腦發生的緣由

通常來講,裂腦的發生,有如下幾種緣由:

  • 高可用服務器對之間心跳線鏈路發生故障,致使沒法正常通訊。
  • 心跳線壞了(包括斷了,老化)
  • 網卡及相關驅動壞了,IP配置及衝突問題(網卡直連)。
  • 心跳線間鏈接的設備故障(網卡及交換機)
  • 仲裁的機器出問題(採用仲裁的方案)
  • 高可用服務器上開啓了iptables防火牆阻擋了心跳消息傳輸
  • 高可用服務器上心跳網卡地址等信息配置不正確,致使發送心跳失敗。
  • 其餘服務配置不當等緣由,如心跳方式不一樣,心跳廣播衝突,軟件BUG等

提示:
Keepalived配置裏同一VRRP實例若是virtual_router_id兩端參數配置不一致,也會致使裂腦問題發生。

4.三、解決裂腦的常見方案

在實際生產環境中,咱們能夠從如下幾個方面來防止裂腦問題的發生:

  • 同時使用串行電纜和以太網電纜鏈接,同時用兩條心跳線路,這樣一條線路壞了,另外一個仍是好的,依然能傳送心跳消息。
  • 當檢測到裂腦時強行關閉一個心跳節點(這個功能需特殊設備支持,如Stonith,fence)。至關於備節點接收不到心跳消息,經過單獨的線路發送關機命令關閉主節點的電源。
  • 作好對裂腦的監控報警(如郵件及手機短信等或值班),在問題發生時人爲第一時間介入仲裁,下降損失。例如,百度的監控報警短信就有上行和下行的區別。報警信息發送到管理員手機上,管理員能夠經過手機回覆對應數字或簡單的字符串操做返回給服務器,讓服務器根據指令自動處理相應故障,這樣解決故障的時間更短。
  • 固然,在實施高可用方案時,要根據業務實際需求肯定是否能容忍這樣的損失。對於通常的網站常規業務,這個損失是可容忍的。

4.四、解決Keepalived裂腦的常見方案

做爲互聯網應用服務器的高可用,特別是前端Web負載均衡器的高可用,裂腦的問題對普通業務的影響是能夠忍受的,若是是數據庫或者存儲的業務,通常出現裂腦問題就很是嚴重了。所以,能夠經過增長冗餘心跳線路來避免裂腦問題的發生,同時增強對系統的監控,以便裂腦發生時人爲快速介入解決問題。

  • 若是開啓防火牆,必定要讓心跳消息經過,通常經過容許IP段的形式解決。
  • 能夠拉一條以太網網線或者串口線做爲主被節點心跳線路的冗餘。
  • 開發檢測程序經過監控軟件(例如Nagios)檢測裂腦。

下面是生產場景檢測裂腦故障的一些思路:

  1. 簡單判斷的思想:只要備節點出現VIP就報警,這個報警有兩種狀況,一是主機宕機了備機接管了;二是主機沒宕,裂腦了。無論屬於哪一個狀況,都進行報警,而後由人工查看判斷及解決。
  2. 比較嚴謹的判斷:備節點出現對應VIP,而且主節點及對應服務(若是能遠程鏈接主節點看是否有VIP就更好了)還活着,就說明發生裂腦了。

五、Keepalived雙實例雙主模式配置

5.一、Keepalived雙實例雙主模式配置實戰

前面給出的是Keepalived單實例主備模式的高可用演示,Keepalived還支持多實例多業務雙向主備模式,即A業務在lb01上是主模式,在lb02上是備模式,而B業務在lb01上是備模式,在lb02上是主模式,下面就以雙實例爲例講解不一樣業務實現雙主的配置。

下圖爲Keepalived雙實例雙主模式IP及VIP規劃表

HOSTNAME IP 說明
lb01 192.168.103.121 VIP:192.168.103.120(用於綁定A服務www.yunjisuan.com域名)
lb02 192.168.103.122 VIP:192.168.103.130(用於綁定B服務bbs.yunjisuan.com域名)
  1. 首先,配置lb01 192.168.103.121的Keepalived.conf,在單實例的基礎上增長一個vrrp_instance VI_2實例,步驟及內容以下:
    [root@lb01 /]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         786744873@qq.com          # 郵箱隨便寫
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1       # 郵件服務器IP
       smtp_connect_timeout 30
       router_id lb01              # id爲lb1,不能和其餘Keepalived節點相同(全局惟一)
    }
    
    vrrp_instance VI_1 {           # 實例名字爲VI_1,相同實例的備節點名字要和這個相同
        state MASTER               # 狀態爲MASTER,備節點狀態須要爲BACKUP
        interface enp0s3           # 通訊(心跳)接口enp0s3,此參數備節點設置和主節點相同,其實是網卡名稱
        virtual_router_id 55       # 實例ID爲55,要和備節點相同
        priority 150               # 優先級爲150,備節點的優先級必須比此數字低
        advert_int 1               # 通訊檢查間隔時間1秒
        authentication {
            auth_type PASS         # PASS認證類型,此參數備節點設置和主節點相同
            auth_pass 1111         # 密碼1111,此參數備節點設置和主節點相同
        }
        virtual_ipaddress {
            192.168.103.120/24 dev enp0s3 label enp0s3:1 #虛擬IP,即VIP爲192.168.103.120,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:1,此參數備節點設置和主節點相同
        }
    }
    
    vrrp_instance VI_2 {
        state BACKUP
        interface enp0s3
        virtual_router_id 56
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.103.130/24 dev enp0s3 label enp0s3:2 #虛擬IP,即VIP爲192.168.103.130,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:2,此參數備節點設置和主節點相同
        }
    }
    #提示: 以vrrp_instance VI_1在lb01 192.168.103.121服務器上的角色爲主,vrrp_instance VI_2在lb01 192.168.103.121服務器上的角色爲備。
  2. 而後配置lb02 192.168.103.130的Keepalived.conf,在單實例的基礎上增長vrrp_instance VI_2實例,步驟及內容以下:
    [root@lb02 /]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         786744873@qq.com
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id lb02              # id爲lb2,不能和其餘Keepalived節點相同(全局惟一)
    }
    
    vrrp_instance VI_1 {
        state BACKUP               #此參數和lb01 MASTER不一樣
        interface enp0s3
        virtual_router_id 55
        priority 100               # 此參數和lb01 MASTER不一樣
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.103.120/24 dev enp0s3 label enp0s3:1
        }
    }
    
    vrrp_instance VI_2 {
        state MASTER
        interface enp0s3
        virtual_router_id 56
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.103.130/24 dev enp0s3 label enp0s3:2 #虛擬IP,即VIP爲192.168.103.130,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:2,此參數備節點設置和主節點相同
        }
    }
    #提示: 以vrrp_instance VI_1在lb02 192.168.103.121服務器上的角色爲備,vrrp_instance VI_2在lb02 192.168.103.122服務器上的角色爲主。
  3. 接着,在lb01,lb02上分別重啓Keepalived服務,觀察初始VIP設置狀況。
    首先要關閉lb01和lb02的Keepalived服務,而後再進行以下操做:
    #關閉服務
    [root@lb01 /]# service keepalived stop
    Redirecting to /bin/systemctl stop keepalived.service
    [root@lb02 /]# service keepalived stop
    Redirecting to /bin/systemctl stop keepalived.service
    
    #在lb01上進行以下操做:
    [root@lb01 keepalived]# service keepalived restart
    [root@lb01 keepalived]# ip a | egrep "192.168.103.120|192.168.103.130"
        inet 192.168.103.120/24 scope global secondary eth0:1         #因爲lb02還沒開服務
        inet 192.168.103.130/24 scope global secondary eth0:2         #主備VIP都顯示在lb01上
    
    #在lb02上進行以下操做:
    [root@lb02 keepalived]# service keepalived restart
    [root@lb02 keepalived]# ip a | egrep "192.168.103.120|192.168.103.130"
        inet 192.168.103.130/24 scope global secondary eth0:2     #lb01開啓的狀況下,lb02開啓服務後,只顯示了vrrp_instance VI_2實例lb02做爲主模式的VIP 192.168.103.130
        
    #再次在lb01上進行以下操做:
    [root@lb01 ~]# ip a | egrep "120|130"
        inet 192.168.103.120/24 scope global secondary eth0:1
    
    #lb01上只有192.168.103.120了。

    特別提示:
    若是測試結果不符,請查看是否沒有關閉iptables
    到此爲止,咱們發現lb01,lb02主備節點已經實現了初始配置的VIP服務狀態,當任意一端宕機,VIP能夠實現互相切換接管。在實際工做中,能夠把www.yunjisuan.com解析到192.168.103.120提供服務,把bbs.yunjisuan.com解析到192.168.103.130提供服務,固然了,lb01,lb02也要配置相應服務,例如:Nginx反向代理服務等。

六、Nginx負載均衡配合Keepalived服務案例實戰

6.一、在lb01和lb02上配置Nginx負載均衡

結合上節介紹的Nginx負載均衡的環境,調整好主負載均衡器lb01,備用負載均衡器lb02服務器上Nginx負載均衡環境,兩臺服務器的安裝基礎環境如出一轍。

 

 

這裏使用的Nginx負載均衡的配置以下:

[root@lb01 /]# vim /usr/local/nginx/conf/nginx.conf
[root@lb02 /]# vim /usr/local/nginx/conf/nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {

    server 192.168.103.123:80 weight=1;
    server 192.168.103.124:80 weight=1;

    }
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
                        proxy_pass http://www_server_pools;
                        proxy_set_header host $host;
                        proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
}

提示:此配置僅代理了www.yunjisuan.com域名

6.二、在lb01和lb02上配置Keepalived服務

Keepalived的配置與本節以前的實驗配置一致。

6.三、用戶訪問準備

準備工做以下:

(1)在客戶端hosts文件裏把www.yunjisuan.com域名解析到VIP 192.168.103.120上,正式場景需經過DNS解析。

(2)兩臺服務器配好Nginx負載均衡服務,而且確保後面代理的Web節點能夠測試訪問。

由於我們暫時沒有域名,因此沒法測試

七、解決高可用服務只針對物理服務器的問題

默認狀況下Keepalived軟件僅僅在對方機器宕機或Keepalived停掉的時候纔會接管業務。但在實際工做中,有業務服務中止而Keepalived服務還在工做的狀況,這就會致使用戶訪問的VIP沒法找到對應的服務,那麼,如何解決業務服務宕機能夠將IP漂移到備節點使之接管提供服務呢?

  • 第一個方法:能夠寫守護進程腳原本處理。當Nginx業務有問題時,就停掉本地的Keepalived服務,實現IP漂移到對端繼續提供服務。實際工做中部署及開發的示例腳本以下:
    # 此腳本的基本思想是若沒有80端口存在,就停掉Keepalived服務實現釋放本地的VIP。在後臺執行上述腳本並檢查:
    [root@lb01 /]# vim /etc/keepalived/check_nginx.sh
    
    #!/bin/sh
    
    while true
    do
        if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then
            service keepalived stop
        fi
        sleep 5
    done
    
    
    # 啓動腳本
    [root@lb01 /]# sh /etc/keepalived/check_nginx.sh &
    [1] 18446
    [root@lb01 /]# ps -ef | grep check | grep -v grep
    root     18446 32623  0 13:17 pts/0    00:00:00 sh /etc/keepalived/check_nginx.sh
    
    #確認Nginx以及Keepalived服務是正常的
    [root@lb01 /]# netstat -antup | grep nginx
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      21620/nginx: master 
    [root@lb01 /]# service keepalived status
    Redirecting to /bin/systemctl status keepalived.service
    ● keepalived.service - LVS and VRRP High Availability Monitor
       Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
       Active: active (running) since 六 2019-08-31 13:31:51 CST; 44s ago
      Process: 22193 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
    
    
    #而後模擬Nginx服務掛掉,看IP是否發生切換。
    [root@lb01 /]# /usr/local/nginx/sbin/nginx -s stop
    [root@lb01 /]# service keepalived status
    Redirecting to /bin/systemctl status keepalived.service
    ● keepalived.service - LVS and VRRP High Availability Monitor
       Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
       Active: inactive (dead) since 六 2019-08-31 13:34:03 CST; 3s ago
      Process: 22193 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
     Main PID: 22195 (code=exited, status=0/SUCCESS)
    [root@lb01 /]# netstat -antup | grep nginx
    
    #此時,備節點已接管:
    [root@lb02 /]# ip a | egrep "192.168.103.120|192.168.103.130"
        inet 192.168.103.130/24 scope global secondary enp0s3:2
        inet 192.168.103.120/24 scope global secondary enp0s3:1
  • 第二個方法:可使用Keepalived的配置文件參數觸發寫好的監測服務腳本。首先要開發檢測服務腳本,注意這個腳本與上一個腳本的不一樣。
    [root@lb01 /]# vim /etc/keepalived/chk_nginx_proxy.sh
    
    #!/bin/bash
    
    if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then
        service keepalived stop
    fi
    
    
    # 修改屬性(可執行文件)
    [root@lb01 /]# chmod +x /etc/keepalived/chk_nginx_proxy.sh
    [root@lb01 /]# ls -l /etc/keepalived/chk_nginx_proxy.sh
    -rwxr-xr-x. 1 root root 100 8月  31 13:39 /etc/keepalived/chk_nginx_proxy.sh

    此時,Keepalived服務的完整配置爲:

    [root@lb01 /]# vim /etc/keepalived/keepalived.conf 
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         786744873@qq.com          # 郵箱隨便寫
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 127.0.0.1       # 郵件服務器IP
       smtp_connect_timeout 30
       router_id lb01              # id爲lb1,不能和其餘Keepalived節點相同(全局惟一)
    }
    
    vrrp_script chk_nginx_proxy { #定義vrrp腳本,檢測HTTP端口 script "/etc/keepalived/chk_nginx_proxy.sh"     #執行腳本,當Nginx服務有問題,就停掉Keepalived服務
        interval 2          #間隔2秒
        weight -60 }
    
    vrrp_instance VI_1 {           # 實例名字爲VI_1,相同實例的備節點名字要和這個相同
        state MASTER               # 狀態爲MASTER,備節點狀態須要爲BACKUP
        interface enp0s3           # 通訊(心跳)接口enp0s3,此參數備節點設置和主節點相同,其實是網卡名稱
        virtual_router_id 55       # 實例ID爲55,要和備節點相同
        priority 150               # 優先級爲150,備節點的優先級必須比此數字低
        advert_int 1               # 通訊檢查間隔時間1秒
        authentication {
            auth_type PASS         # PASS認證類型,此參數備節點設置和主節點相同
            auth_pass 1111         # 密碼1111,此參數備節點設置和主節點相同
        }
        virtual_ipaddress {
            192.168.103.120/24 dev enp0s3 label enp0s3:1 #虛擬IP,即VIP爲192.168.103.120,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:1,此參數備節點設置和主節點相同
        }
    
     track_script { chk_nginx_proxy # 觸發檢查 }
    
    }
    
    vrrp_instance VI_2 {
        state BACKUP
        interface enp0s3
        virtual_router_id 56
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.103.130/24 dev enp0s3 label enp0s3:2 #虛擬IP,即VIP爲192.168.103.130,子網掩碼爲24位,綁定接口爲enp0s3,別名爲enp0s3:2,此參數備節點設置和主節點相同
        }
    }

    下面測試接管結果

    #先殺掉以前的後臺進程腳本的運行,以後進行以下操做
    [root@lb01 /]# /usr/local/nginx/sbin/nginx 
    [root@lb01 /]# netstat -antup | grep nginx
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3937/nginx          
    [root@lb01 /]# service keepalived start
    Starting keepalived:                                       [  OK  ]
    [root@lb01 /]# service keepalived status
    keepalived (pid  3949) is running...
    [root@lb01 /]# ip a | grep 192.168.103.120
        inet 192.168.103.120/24 scope global secondary eth0:1
    [root@lb01 /]# /usr/local/nginx/sbin/nginx -s stop
    [root@lb01 /]# ip a | grep 192.168.103.120
    [root@lb01 /]# service keepalived status
    keepalived is stopped
    
    #當停掉Nginx的時候,Keepalived 2秒鐘內會被自動停掉,VIP被釋放,由對端接管,這樣就實現了即便服務宕機也會進行IP漂移,業務切換。

    注意:本人測試後發現方法2不會中止keepalived,只會進行MASTER轉移

八、解決多組Keepalived服務器在一個局域網的衝突問題

當在同一個局域網內部署了多組Keepalived服務器對,而又未使用專門的心跳線通訊時,可能會發生高可用接管的嚴重故障問題。以前已經講解過Keepalived高可用功能是經過VRRP協議實現的,VRRP協議默認經過IP多播的形式實現高可用對之間的通訊,若是同一個局域網內存在多組Keepalived服務器對,就會形成IP多播地址衝突問題,致使接管錯亂,不一樣組的Keepalived都會使用默認的224.0.0.18做爲多播地址。此時的解決辦法是,在同組的Keepalived服務器全部的配置文件裏指定獨一無二的多播地址,配置以下:

global_defs 
    router_id LVS_19
    vrrp_mcast_group4 224.0.0.19    #這個就是指定多播地址的配置
}

#提示:
1)不一樣實例的通訊認證密碼也最好不一樣,以確保接管正常。
2)另外一款高可用軟件Heartbeat,若是採用多播方式實現主備通訊,一樣會有多播地址衝突問題。

九、開發檢測Keepalived裂腦的腳本

檢測思路:在備節點上執行腳本,若是能夠ping通主節點而且備節點有VIP就報警,讓人員介入檢查是否裂腦。

  1. 在lb02備節點開發腳本並執行
    [root@lb02 /]# vim /etc/keepalived/check_split_brain.sh
    
    #!/bin/bash
    
    lb01_vip=192.168.103.120
    lb01_ip=192.168.103.121
    
    while true
    do
        ping -c 2 -W 3 $lb01_ip &>/dev/null
        if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then
            echo "ha is split brain.warning."
        else
            echo "ha is OK"
        fi
        sleep 5
    done
    
    [root@lb02 /]# sh /etc/keepalived/check_split_brain.sh
    ha is OK
    ha is OK
    ha is OK
    
    #正常狀況下,主節點活着,VIP 192.168.103.121在主節點,所以不會報警,提示「ha is OK」
  2. 中止Keepalived服務看lb02腳本執行狀況。
    // lb01
    [root@lb01 /]# service keepalived stop
    Redirecting to /bin/systemctl stop keepalived.service
    [root@lb01 /]# ip a | grep 192.168.103.120
    [root@lb01 /]# 
    
    // lb02
    [root@lb02 /]# sh /etc/keepalived/check_split_brain.sh
    ha is split brain.warning.
    ha is split brain.warning.
    ha is split brain.warning.
  3. 關掉lb01服務器,而後再觀察lb02腳本的輸出。
    // lb02
    [root@lb02 /]# sh /etc/keepalived/check_split_brain.sh
    ha is split brain.warning.
    ha is split brain.warning.
    ha is split brain.warning.
    ha is split brain.warning.
    ha is split brain.warning.
    ha is split brain.warning.
    ha is split brain.warning.
    ha is OK
    ha is OK
    ha is OK
    
    #裂腦報警恢復了。
  4. 能夠將此腳本整合到Nagios或Zabbix監控服務裏,進行監控報警。
相關文章
相關標籤/搜索