Linux架構之Nginx 高可用

第53章 Nginx之高可用Keepalived

1、Keepalived高可用基本概述

 

 

1.1)什麼是高可用

通常是指2臺機器啓動着徹底相同的業務系統,當有一臺機器down機了,另一臺服務器就能快速的接管,對於訪問的用戶是無感知的。

現實例子關於keepalived,好比,在公司裏,每一個部門都有正副經理。平時副經理什麼都無論,當經理請假或者不在公司的時候,此時副經理就接替經理的工做。

keepalived軟件起初是專爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點狀態,後來又加入了能夠實現高可用的VRRP功能。

keepalived除了可以管理LVS軟件外,還能夠做爲其餘服務(例如:Nginx,Haproxy,MySQL等)的高可用解決方案軟件。

keepalived軟件主要是經過VRRP協議實現高可用功能的。VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗餘協議)的縮寫,VRRP出現的目的就是爲了解決靜態路由單點故障問題的,它可以保證當個別節點宕機時,整個網絡能夠不間斷地運行。Keepalived一方面具備配置管理LVS的功能,同時還具備對LVS下面節點進行健康檢查的功能,另外一方面也可實現系統網絡服務的高可用功能。

 

1.2)高可用一般使用什麼軟件?

硬件一般使用 F5,軟件一般使用 keepalived

 

1.3)keepalived服務的重要功能

keepalived服務的重要功能:做爲系統網絡服務的高可用功能(failover,失效備援)。

keepalived高可用功能實現的基本原理爲:

兩臺主機同時安裝好keepalived軟件並啓動服務,開始正常工做時,角色爲Master的主機得到全部資源並對用戶提供服務,角色爲Backup的主機做爲Master主機的熱備;

當角色爲Master的主機失效或出現故障時,角色爲Backup的主機將自動接管Master主機的全部工做,包括接管VIP資源及相應資源服務;

而當角色爲Master的主機故障修復後,又會自動接管回他原來處理的工做,角色爲Backup的主機則同時釋放Master主機失效時他接管的工做,此時,兩臺主機將恢復到啓動時各自的原始角色及工做狀態。

 

1.4)keepalived是如何實現高可用的?

keepalived軟件是基於VRRP協議實現的,VRRP虛擬路由冗餘協議,主要用於解決單點故障問題

 

1.5) 什麼是VRRP?原理又是什麼?

好比公司的網絡是經過網關進行上網的,那麼若是該路由器故障了,網關沒法轉發報文了,此時全部人都沒法上網了,怎麼辦?

 

 

 

一般作法是給路由器增長一臺備節點,可是問題是,若是咱們的主網關master故障了,用戶是須要手動指向backup的,若是用戶過多修改起來會很是麻煩。

問題一:假設用戶將指向都修改成backup路由器,那麼master路由器修好了怎麼辦?

問題二:假設Master網關故障,咱們將backup網關配置爲master網關的ip是否能夠?

實際上是不行的,由於PC第一次經過ARP廣播尋找到Master網關的MAC地址與IP地址後,會將信息寫到ARP的緩存表中,那麼PC以後鏈接都是經過那個緩存表的信息去鏈接,而後進行數據包的轉發,即便咱們修改了IP可是Mac地址是惟一的,pc的數據包依然會發送給master。(除非是PC的ARP緩存表過時,再次發起ARP廣播的時候才能獲取新的backup對應的Mac地址與IP地址)

 

 

如何才能作到出現故障自動轉移,此時VRRP就出現了,咱們的VRRP實際上是經過軟件或者硬件的形式在Master和Backup外面增長一個虛擬的MAC地址(VMAC)與虛擬IP地址(VIP),那麼在這種狀況下,PC請求VIP的時候,不管是Master處理仍是Backup處理,PC僅會在ARP緩存表中記錄VMAC與VIP的信息。

VRRP,全稱Virtual Router Redundancy Protocol,中文名爲虛擬路由冗餘協議。

VRRP的出現就是爲了解決靜態路由的單點故障問題,VRRP是經過一種競選機制來將路由的任務交給某臺VRRP路由器的。

VRRP經過競選機制來實現虛擬路由器的功能,全部的協議報文都是經過IP多播(Multicast)包(默認的多播地址224。0。0。18)形式發送的。

虛擬路由器由VRID(範圍0-255)和一組IP地址組成,對外表現爲一個周知的MAC地址,:00-00-5E-00-01-{VRID}。

因此,在一個虛擬路由器中,無論誰是Master,對外都是相同的MAC和IP(稱之爲VIP)。

客戶端主機並不須要因Master的改變修改本身的路由配置。對它們來講,這種切換是透明的。

在一組虛擬路由器中,只有做爲Master的VRRP路由器會一直髮送VRRP廣播包,此時Backup不會搶佔Master。

當Master不可用時,Backup就收不到來自Master的廣播包了,此時多臺Backup中優先級最高的路由器會搶佔爲Master。

這種搶佔是很是快速的(可能只有1秒甚至更少),以保證服務的連續性,處於安全性考慮,VRRP數據包使用了加密協議進行了加密。

 

1.6)面試的時候怎麼說?

keepalived高可用對之間是經過VRRP通訊的,所以,我從VRRP開始給您講起.
1)VRRP,全稱Virtual Router Reduancy Protocol,中文名爲虛擬路由器冗餘協議,VRRP的出現是爲了解決靜態路由的單點故障;
2)VRRP是經過一種競選協議來將路由任務交給某臺VRRP路由器的;
3)VRRP用IP多播的方式,(默認多播地址(224.0.0.18))實現高可用對之間通訊;
4)工做時主節點發包,備節點接包,當備節點接收不到主節點發的包的時候,就啓動接管程序接管主節點的資源。備節點能夠有多個,經過優先級競選,但通常keepalived系統運維工做中都是一對。
5)VRRP使用了加密協議加密數據,但keepalived官方目前仍是推薦用明文的方式配置認證類型和密碼。
介紹完了VRRP,接下來我在介紹一下keepalived服務的工做原理;
keepalived高可用對之間是經過VRRP進行通訊的,VRRP是經過競選機制來肯定主備的,主的優先級高於備,所以,工做時會優先得到全部的資源,備節點處於等待狀態,當主掛了的時候,備節點就會接管主節點的資源,而後頂替主節點對外提供服務。
在keepalived服務對之間,只有做爲主的服務器會一直髮送VRRP廣播包,告訴備它還活着,此時備不會搶佔主。當主不可用時,即備監聽不到主發送的廣播包時,就會啓動相關服務接管資源,保證業務的連續性,接管速度最快能夠小於一秒。

 

 

1.7)高可用keepalived使用場景

一般業務系統須要保證7×24小時不DOWN機,好比公司內部的OA系統,天天公司人員都須要使用,則不容許Down機,做爲業務系統來講隨時均可用。

 

 

 

1.8) 高可用keepalived使用場景

1)如何肯定誰是主節點誰是背節點(選舉投票,優先級)

2)若是Master故障,Backup自動接管,那麼Master回覆後會奪權嗎(搶佔試、非搶佔式)

3)若是兩臺服務器都認爲本身是Master會出現什麼問題(腦裂)

 

2、keepalived高可用服務搭建準備

通過了前面對Keepalived的介紹和原理講解,相信讀者已經初步瞭解了Keepalived這個高可用軟件,下面開始實施之旅。

2.1)安裝keepalived環境說明

這裏使用前面已經搭建完成的Nginx負載均衡的系統環境來安裝Keepalived服務,由於後面的實戰案例是實現Nginx負載均衡的高可用案例。

安裝Keepalived的基礎準備環境以下:

準備5臺物理服務器兩臺作Keepalived服務,3臺作測試的web節點。

Keepalived高可用實驗環境準備

 

 

 

2.2)安裝keepalived軟件

注意:lb01和lb02都須要安裝。

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

2.3)啓動keepalived服務並檢查

[root@lb02-e ~]# systemctl start keepalived
[root@lb02-e ~]# ps -ef|grep keepalived
root     10039     1 0 12:21 ?       00:00:00 /usr/sbin/keepalived -D
root     10040 10039 0 12:21 ?       00:00:00 /usr/sbin/keepalived -D
root     10041 10039 0 12:21 ?       00:00:03 /usr/sbin/keepalived -D
###提示:啓動後有三個keepalived進程表示安裝正確
[root@lb02 ~]# ip a | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  inet 10.0.0.6/24 brd 10.0.0.255 scope global noprefixroute eth0
  inet 192.168.200.16/32 scope global eth0
  inet 192.168.200.17/32 scope global eth0
  inet 192.168.200.18/32 scope global eth0
###提示:默認狀況會啓動三個VIP地址
[root@lb02-e ~]# systemctl stop keepalived
###提示: 測試完畢後關閉服務,上述測試須要在lb01和lb02兩臺服務器上進行

2.4)keepalived配置文件說明

和其餘yum安裝的軟件同樣,keepalived軟件的配置文件默認路徑及配置文件名爲:

[root@lb02 ~]# rpm -qc keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived

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

(1)全局變量(Global Definitions)部分

這部分主要用來設置keepalived的故障通知機制和Router ID標識。示例配置以下:

[root@lb02 ~]# cat -n /etc/keepalived/keepalived.conf 
1 ! Configuration File for keepalived
    2
    3 global_defs {
    4   notification_email {
    5     acassen@firewall.loc
    6     failover@firewall.loc
    7     sysadmin@firewall.loc
    8   }
    9   notification_email_from Alexandre.Cassen@firewall.loc
  10   smtp_server 192.168.200.1
  11   smtp_connect_timeout 30
  12   router_id LVS_DEVEL
  13   vrrp_skip_check_adv_addr
  14   vrrp_strict
  15   vrrp_garp_interval 0
  16   vrrp_gna_interval 0
  17 }

基礎參數說明:

第1行是註釋,!開頭和#號開頭同樣,都是註釋。前端

第2行是空行。linux

第3行—8行是定義故障服務報警的Email地址。做用是服務發生切換或RS節點等有故障時,須要發送的Email地址,能夠有多個,每行一個。nginx

第9行是制定發送郵件的發送人,即發送人地址,也是可選配置。web

第10行smtp_server指定發送郵件的smtp服務器,若是本機開啓了sendmail或postfix。就可使用上面默認配置實現郵件發送,也是可選配置。面試

第11行smtp_connect_timeout是鏈接smtp的超時時間,也是可選配置。數據庫

第12行是Keepalived服務器的路由標識{route_id}。在一個局域網內,這個標識{route_id}應該是惟一的。vim

大括號{}用來區分區塊,要成對出現。若是漏寫了半個大括號,keepalived運行時,不會報錯,可是也不會獲得預期的結果。另外,因爲區塊間存在多層嵌套關係,所以很容易遺漏區塊結尾處的大括號,須要特別注意。windows

 

(2)VRRP實例定義區域(VRRP instance(s))部分

這部分主要用來定義具體服務實例配置,包括Keepalived主備狀態,接口,優先級,認證方式和IP信息等,配置以下:

 19 vrrp_instance VI_1 {
  20   state MASTER
  21   interface eth0
  22   virtual_router_id 51
  23   priority 100
  24   advert_int 1
  25   authentication {
  26       auth_type PASS
  27       auth_pass 1111
  28   }
  29   virtual_ipaddress {
  30       192.168.200.16
  31       192.168.200.17
  32       192.168.200.18
  33   }
  34 }

參數說明:

第19行表示定義一個vrrp_instance實例,名字爲VI_1,每一個vrrp_instance實例能夠認爲是Keepalived服務的一個實例或者做爲一個業務服務,在Keepalived服務配置中,這樣的vrrp_instance實例能夠有多個。 注意,存在於主節點中的vrrp_isntance實例在備節點也要存在,這樣才能實現故障切換接管。緩存

第20行state MASTER表示當前示例VI_1的角色狀態,當前角色爲MASTER,這個狀態只能有MASTER和BACKUP兩種狀態,而且須要大寫這些字符。其中MASTER爲正式工做的狀態,BACKUP爲備用的狀態。當MASTER所在的服務器故障或失效時,BACKUP所在的服務器會接管故障的MASTER繼續提供服務。安全

第21行interface爲網路通訊接口。爲對外提供服務的網絡接口,如eth0,eth1當前主流的服務器都有2~4個網絡接口,在選擇服務接口時,要搞清楚。

第22行virtual_router_id爲虛擬路由ID標識,這個標識最好是一個數字。

第23行priority爲優先級,其後面的數值也是一個數字,數字越大,表示實例優先級越高。在同一個vrrp_instance實例裏,MASTER的優先級配置要高於BACKUP的。若MASTER的priority值爲150,那麼BACKUP的priority必須小於150,通常建議隔50以上爲佳。

第24行advent_int爲同步通知間隔。MASTER與BACKUP之間通訊檢查的時間間隔,默認爲1秒。

第25-27行authentication爲權限認證配置。包含認證類型(auth_type)和認證密碼(auth_pass) 。認證類型有PASS(simple passwd),AH(IPSEC)兩種,官方推薦使用的類型爲PASS。驗證密碼爲明文方式,最好長度不能超過8個字符,建議四位數字,同一vrrp實例的MASTER與BACKUP使用相同的密碼才能正常通訊。

第29-32行virtual_ipaddress爲虛擬IP地址。能夠配置多個IP地址,每一個地址佔一行,配置時最好明確指定子網掩碼以及虛擬IP綁定的網絡接口。不然,子網掩碼默認是32位,綁定的接口和前面的interface參數配置的一致。注意,這裏的虛擬IP就是在工做中須要和域名綁定的IP,即和配置的高可用服務監聽的IP要保持一致。

 

3、配置keepalived實現單IP自動漂移接管

實際上能夠將高可用對的兩臺機器應用服務同時開啓,可是隻讓VIP一段的服務器提供服務,若主的服務器宕機,VIP會自動漂移到備用服務器,此時用戶的請求直接發送到備用服務器上,而無須臨時啓動對應服務(事先開啓應用服務)。下面來說解VIP自動漂移實戰案例。

 

 

4、實戰配置keepalived主服務器lb01 MASTER

0、準備工做

#優化基本源
[root@lb01-e ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[root@lb02-e ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[root@lb03-e ~]# vim /etc/yum.repos.d/CentOS-Base.repo

 

一、keepalived安裝

 [root@lb01 ~]# yum install keepalived -y

[root@lb02 ~]# yum install keepalived -y

 

二、查看配置文件的路徑

[root@lb01 ~]# rpm -qc keepalived

/etc/keepalived/keepalived.conf

/etc/sysconfig/keepalived

 

三、配置一臺機器的nginx,配置keepalived主服務器lb01 MASTER

#配置keepalived主服務器lb01 MASTER
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf

global_defs {                   #全局配置
  router_id lb01             #keepalived服務器的路由標識(route_id)
}

vrrp_instance VI_1 {           #vrrp實例,命名叫VI_1
  state MASTER               #當前實例VI_1的角色狀態
  interface eth0             #是對外提供服務的網絡接口
  virtual_router_id 50       #虛擬路由ID標識
  priority 150               #優先級
  advert_int 1               #同步通知間隔時間
  authentication {           #權限認證配置
      auth_type PASS         #認證方式
      auth_pass 1111         #認證密碼
  }
  virtual_ipaddress {
      10.0.0.4               #虛擬的VIP地址
  }
}

配置完畢後,啓動keepalived服務,以下:

#啓動keepalived(lb01)
[root@lb01 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@lb01 ~]# systemctl start keepalived

而後檢查配置結果,查看是否有虛擬IP10.0.0.4

[root@lb01-e ~]# ip addr | egrep 10.0.0.4
  inet 10.0.0.4/32 scope global eth0

出現上述帶有vip:10.0.0.3行的結果表示lb01的keepalived服務單實例配置成功。

 

四、配置另外一臺機器的nginx,實戰配置keepalived備服務器lb02 BACKUP

#實戰配置keepalived備服務器lb02 BACKUP
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
  router_id lb02
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 50
  priority 100
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
      10.0.0.4
  }
}

啓動lb02的keepalived服務

#啓動lb02的keepalived
[root@lb02 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@lb02 ~]# systemctl start keepalived

檢查配置結果,查看是否有虛擬IP10.0.0.4

#能夠看到地址被lb02接管,即IP地址已發生漂移
[root@lb02 ~]# ip addr | grep 10.0.0.4

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

出現上述無任何結果的現象,表示lb02的keepailved服務單實例配置成功.若是lv02的配置過濾後有10.0.0.3的IP,則表示keepalived工做不正,同一個IP地址同一時刻應該只能出如今一臺服務器上。

若是查看BACKUP備節點VIP有,說明高可用裂腦了,裂腦是兩臺服務器爭搶統一資源致使的,例如:兩邊都配置了同一個VIP地址。

 

五、出現腦裂後的排查

出現上述兩臺服務器爭搶同一IP資源問題,通常要先考慮排查兩個地方:

(1)主備兩臺服務器之間是否通信正常,若是不正常是否有iptables防火牆阻擋?

(2)主備兩臺服務器對應的keepalived.conf配置文件是否有錯誤?例如是否同一實例的virtual_router_id配置不同。

 

六、進行高可用主備服務器切換

停掉主服務器上的keepalived服務或關閉主服務器,操做並檢查步驟

[root@lb01 keepalived]# ip addr|egrep 10.0.0.3
  inet 10.0.0.3/24 scope global secondary eth0:1
[root@lb01 ~]# systemctl start keepalived
[root@lb01 keepalived]# ip addr|egrep 10.0.0.3

能夠看到VIP 10.0.0.3消失了,此時查看BACKUP備服務器,看是否會有VIP 10.0.0.3出現,操做及檢查步驟以下:

[root@LVS-6 ~]# ip addr|egrep 10.0.0.3
[root@LVS-6 ~]# ip addr|egrep 10.0.0.3
  inet 10.0.0.3/24 scope global secondary eth0:1

能夠看到備節點lb02已經接管綁定了10.0.0.3這個VIP,這期間備節點還會發送ARP廣播,讓全部的客戶端更新本地的ARP表,以便客戶端訪問接管VIP服務的節點。

此時若是再啓動主服務器的keepalived服務,主服務器就會接管回VIP 10.0.0.3啓動後能夠觀察下主備的IP漂移狀況,備服務器是否釋放了IP?主服務器是否又接管了IP ?

主節點啓動keepalived服務後,發現很快就又接管了VIP 10.0.0.3,操做及檢查步驟以下:

[root@lb01 keepalived]# /etc/init.d/keepalived start    
Starting keepalived:                                       [ OK ]
[root@lb01 keepalived]# ip addr|egrep 10.0.0.3
  inet 10.0.0.3/24 scope global secondary eth0:1

與此同時,備節點上的VIP 10.0.0.3則被釋放了,以下:

[root@LVS-6 ~]# ip addr|egrep 10.0.0.3

 

七、 單實例主備模式keeplibed配置文件對比

能夠看到,上述keepalived單實例MASTER和BACKUP節點的配置差異項,只有3項是不一樣的。

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

 

5、keepalived高可用服務器的腦裂問題

5.1)什麼是腦裂

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

 

5.2)致使腦裂發生的緣由

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

高可用服務器對之間心跳線鏈路發生故障,致使沒法正常通訊

心跳線壞了(包括斷了,老化)

網卡及相關驅動壞了,IP配置及衝突問題(網卡直連)

心跳線之間鏈接的設備故障(網卡及交換機)

仲裁的機器出問題了(採用總裁的方案)

高可用服務器上開啓了iptables防火牆阻撓了心跳信息傳輸

高可用服務器上心跳網卡地址等信息配置不正確,致使發送心跳失敗

其餘服務配置不當等緣由,如心跳方式不一樣,心跳廣播衝突,軟件bug等。

 

5.3) 解決腦裂的常見方法

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

同時使用串行電纜和以太網電纜鏈接,同時用兩條心跳線,這樣一條線路壞了,另外一個仍是好的,依然能傳送心跳信息。

當檢測到裂腦時強行關閉一個心跳節點(這個功能須要特殊設備支持,如stonith,fence)至關於備節點接收不到心跳信息,經過單獨的線路發送命令關閉主節點的電源。

作好對裂腦的監控報警(如郵件及手機短信等或值班),在問題發生時人爲第一時間介入仲裁,下降損失。

 

5.4) 解決keepalived裂腦的常見方案

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

若是開啓防火牆,必定要讓心跳消息經過。通常經過容許IP段的形式解決。

能夠拉一條以太網網線或者串口線做爲主備節點心跳線路的冗餘。

開發檢測程序經過監控軟件檢測腦裂,如zabbix檢測若是主備都有VIP就報警。

比較嚴謹的判斷,備節點出現對應VIP,而且主節點及對應服務(若是能遠程鏈接主節點看是否有VIP就更好了)還活着,就說明發生腦裂了。

 

5.5)模擬keepalived腦裂場景

抓包

tcpdump -nn -c 20 -i any host 224.0.0.18

 

開啓防火牆

[root@lb02 scripts]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
[root@lb02 scripts]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

 

iptables

iptables -I INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -I OUTPUT -o eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT

 

再次抓包查看

tcpdump -nn -c 20 -i any host 224.0.0.18

 

6、Nginx負載均衡配合keepalived雙主模式實戰

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

HOSTNAME IP 說明
lb01 10.0.0.5 VIP:10.0.0.12(用於綁定A服務www.etiantian.org域名)
lb02 10.0.0.6 VIP:10.0.0.13(用於綁定B服務bbs.etiantian.org域名)
web01 10.0.0.8 Nginx web服務器1
web02 10.0.0.7 Nginx web服務器2

 

6.1)配置keepalived雙主

lb01配置

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
  router_id LVS_01
}
vrrp_instance VI_1 {
  state MASTER
      interface eth0
      virtual_router_id 51
      priority 150
      advert_int 1
      authentication {
          auth_type PASS
              auth_pass 1111
      }
  virtual_ipaddress {
      10.0.0.3/24 dev eth0 label eth0:1
  }
}
vrrp_instance VI_2 {
  state BACKUP
      interface eth0
      virtual_router_id 52
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
              auth_pass 1111
      }
  virtual_ipaddress {
      10.0.0.4/24 dev eth0 label eth0:2
  }
}

 

6.2)lb02配置

lb02配置

[root@lb01 ~]#  cat /etc/keepalived/keepalived.conf
global_defs {
  router_id LVS_02
}

vrrp_instance VI_1 {
  state BACKUP
      interface eth0
      virtual_router_id 51
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
              auth_pass 1111
      }
  virtual_ipaddress {
      10.0.0.3/24 dev eth0 label eth0:1
  }
}

vrrp_instance VI_2 {
  state MASTER
      interface eth0
      virtual_router_id 52
      priority 150
      advert_int 1
      authentication {
          auth_type PASS
              auth_pass 1111
      }  
  virtual_ipaddress {
      10.0.0.4/24 dev eth0 label eth0:2
  }  
}

 

6.3)Nginx負載均衡

worker_processes  1;
events {
  worker_connections 1024;
}
http {
  include       mime.types;
  default_type application/octet-stream;
  sendfile       on;
  keepalive_timeout 65;
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
                     
                     
  upstream server_pools {
      server 10.0.0.7;
      server 10.0.0.8;
      server 10.0.0.9;
  }

  server {
      listen 10.0.0.3:80;
      server_name www.etiantian.org;
      location / {
          proxy_pass http://server_pools;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
      }
      access_log logs/access_www.log main;
       
  }
server {
      listen 10.0.0.4:80;
      server_name blog.etiantian.org;
      location / {
          proxy_pass http://server_pools;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
      }
      access_log logs/access_blog.log main;
       
  }
}

 

6.4)重啓nginx和keepalived

systemctl restart keepalived
systemctl restart nginx

 

6.5)配置windows解析

10.0.0.3 www.etiantian.org
10.0.0.4 blog.etiantian.org

6.6)訪問測試

 

 

6.7)模擬keepalived故障

此時停掉lb01服務器或中止keepalived服務器,觀察結果是否正常,

而後觀察lb02備點是否接管了VIP 10.0.0.3。

 

6.8)恢復lb01的keepalived服務

查看是否恢復正常。

 

7、開發監控keepalived腦裂的腳本

檢測思路,VIP何時、什麼條件纔會飄走

因爲某些緣由,致使兩臺 keepalived 高可用服務器在指定時間內,沒法檢測到對方的心跳消息,各自取得資源及服務的全部權,而此時的兩臺高可用服務器又都還活着。

服務器網線鬆動等網絡故障

服務器硬件故障發生損壞現象而崩潰

主備都開啓 firewalld 防火牆

Nginx 服務死掉等

 

7.1)lb01檢查web腳本

#!/bin/bash
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判斷 Nginx 是否存活,若是不存活則嘗試啓動 Nginx
if [ $nginxpid -eq 0 ];then
  systemctl start nginx
  sleep 3
  #2.等待 3 秒後再次獲取一次 Nginx 狀態
  nginxpid=$(ps -C nginx --no-header|wc -l)
  #3.再次進行判斷, 如 Nginx 還不存活則中止 Keepalived,讓地址進行漂移,並退出腳本
  if [ $nginxpid -eq 0 ];then
      systemctl stop keepalived
  fi
fi

keepalived配置:

global_defs {
  router_id lb01
}

vrrp_script check_web {
  script "/server/scripts/check_web.sh"
  interval 5
  weight 50
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 50
  priority 150
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 1111
  }

  virtual_ipaddress {
      10.0.0.3
  }
}

vrrp_instance VI_2 {
  state BACKUP
  interface eth1
  virtual_router_id 55
  priority 100
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 2222
  }

  virtual_ipaddress {
      172.16.1.4
  }

  #2.調用並運行該腳本
  track_script {
      check_web
  }
}

7.2)lb02腳本

檢查VIP腳本

global_defs {
  router_id lb01
}

vrrp_script check_web {
  script "/server/scripts/check_web.sh"
  interval 5
  weight 50
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 50
  priority 150
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 1111
  }

  virtual_ipaddress {
      10.0.0.3
  }
}

vrrp_instance VI_2 {
  state BACKUP
  interface eth1
  virtual_router_id 55
  priority 100
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 2222
  }

  virtual_ipaddress {
      172.16.1.4
  }

  #2.調用並運行該腳本
  track_script {
      check_web
  }
}

檢查web腳本

[root@lb02 /server/scripts]# cat check_brain.sh 
#!/bin/bash

lb01_vip=10.0.1.3
lb01_nginx=$(curl -x 10.0.1.5:80 -I -s -w "%{http_code}\n" -o /dev/null blog.oldzhang.com)

#ping -c 1 -W 1 ${lb01_ip} &>/dev/null
#若是lb01的IP能ping通,可是我本身也存在VIP,我就認爲發生裂腦了,我就把本身的keep幹掉
if [ ${lb01_nginx} -eq 200 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
  echo "ha is bad" >> /tmp/check.txt
  systemctl stop keepalived
else
  echo "ha is ok" >> /tmp/check.txt
fi

檢查配置結果,查看是否有虛擬IP10.0.0.4

#lb01存在vip地址
[root@lb01 ~]# ip addr | grep 10.0.0.4
  inet 10.0.0.4/32 scope global eth0

#中止lb01上的keepalived,檢測vip已不存在
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr | grep 10.0.0.4

keepalived配置

global_defs {    router_id lb02}​vrrp_script check_web {    script "/server/scripts/check_web.sh"    interval 5    weight 50}​vrrp_script check_brain {    script "/server/scripts/check_split_brain.sh"    interval 5    weight 50}​vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 50    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }​    virtual_ipaddress {        10.0.0.3    }}​vrrp_instance VI_2 {    state MASTER    interface eth1    virtual_router_id 55    priority 150    advert_int 1    authentication {        auth_type PASS        auth_pass 2222    }​    virtual_ipaddress {        172.16.1.4    }​    #2.調用並運行該腳本    track_script {        check_web        check_brain    }}
相關文章
相關標籤/搜索