高可用系列之Nginx


1.1Keepalived高可用軟件

Keepalived起初是專為LVS設計的,專門用來監控LVS集群系統中各個服務節點的狀態,后來又加入了VRRP的功能,因此除了配合LVS服務外,也可以作為其他服務(Nginx,Haproxy)的高可用軟件,VRRPVirtual Router Redundancy Protocol(虛擬路由器冗余協議)的縮寫,VRRP出現的目的就是為了解決靜態路由出現的單點故障問題,它能夠保證網絡的不間斷、穩定的運行。所以,keepalived以方面具有LVS Cluster nodes healthchecks功能,另一方面也具有LVS directors failover功能。

1.1.1 LVS Directors failover功能

Ha failover功能:實現LB Master主機和Backup主機之間故障轉義和自動切換。

這是針對有兩個負載均衡器Director同時工作而采取的故障轉移措施。當主負載均衡器(MASTER)失效或出現故障時,備份負載均衡器(BACKUP)將自動接管主負載均衡的所有工作(vip資源及相應服務)一旦主負載均衡器(MASTER)故障修復,MASTER又會接管回它原來處理的工作,而備份負載均衡器(BACKUP)會釋放master失效時它接管的工作,此時兩者將恢復到最初各自的角色狀態。

1.1.2 Lvs cluster nodes healthchecks功能

1keepalived.conf里配置就可以實現LVS功能。

2keeplaived可以對LVS下面的集群節點做健康檢查。

Rs healthcheck功能:負載均衡定期檢查RS的可用性決定是否給其分發請求。

當虛擬服務器中的某一個甚至是幾個真實服務器同時發生故障無法提供服務時,負載均衡器會自動將失效的RS服務器從轉發隊列中清除出去,從而保證用戶的訪問不受影響:當故障的RS服務器被修復以后,系統又會自動地把它們加入轉發隊列,分發請求提供正常服務。

1.2 Keeplaived故障切換轉移原理介紹

Keepalived Directors高可用對之間的故障切換轉移,是通過VRRP協議Virtual Router Redundancy Protocol 中文虛擬路由器冗余協議)來實現的。

Keepalived Directors正常工作時,主Director節點會不斷的向備節點廣播心跳消息,用以告訴備節點自己還活着,當主節點發生故障時,備節點就無法繼續檢測到主節點的心跳,進而調用自身的接管程序,接管主節點的IP資源及服務。而當主節點恢復故障時,備節點會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的自身備用角色。

1.3 VRRP協議簡單介紹

VRRP虛擬路由器中,有多台物理的VRRP路由器,但是這多台物理的機器並不同時工作,而是由一台稱為Master的負責路由工作,其他的都是BackupMaster並非一成不變,VRRP協議讓每個VRRP路由器參與競選,最終獲勝的就是MasterMaster有一些特權,比如擁有虛擬路由器的IP地址,我們的主機就是用這個IP地址作為靜態路由的。擁有特權的Master要負責轉發發送給網關地址的包和響應ARP請求。

VRRP通過競選協議來實現虛擬路由器的功能,所有的協議報文都是通過IP多播(multicast)包(多播地址224.0.0.18)形式發送的。虛擬路由器由VRID(范圍0-255)和一組IP地址組成,對外表現為一個周知的MAC地址。所以,在一個虛擬路由器中,不管誰是Master,對外都是相同的MACIP(稱為VIP)。客戶端主機並不需要因為Master的改變而修改自己的路由配置,對他們來說,這種主從的切換是透明的。

在一個虛擬路由器中,只有作為MasterVRRP路由器會一直發送VRRP廣告包(VRRP Advertisement message),Backup不會槍占Master,除非它的優先級(priority)更高。當Master不可用時(Backup收不到廣告包),多台Backup中優先級最高的這台會被槍占為Master。這種槍占是非常快速的(<1s),以保證服務的連續性。

由於安全性考慮,VRRP包使用了加密協議進行加密。

1.4 Keepalived工作原理小結

1.4.1 VRRP協議介紹

1VRRP協議,全稱Virtual Router Redundancy Protocol,中文名,虛擬路由器冗余協議,VRRP的出現就是為了解決靜態 的單點故障。

2VRRP是通過一種競選協議機制來將路由任務交給某台VRRP路由器。

3VRRP是通過IP多播的方式實現通信。

4、主發包,備接包,當備接不到主發的包的時候,就啟動接管程序接管主的資源。備可以由多個,通過優先級競選。

5VRRP使用加密協議。

1.4.2 Keepalived工作原理

Keepalived高可用之間是通過VRRP協議通信的,VRRP協議是通過競選機制來確定主備的,主的優先級高於備,因此,工作時主會獲得所有的資源,備節點處於等待狀態,當主掛了時候,備節點,接管主節點的資源,然后頂替主節點對外提供服務。

VRRP協議是通過IP多播包的方式(224.0.0.18)發送。

keepalived之間,只有作為主的服務器會一直發送VRRP廣播包,告訴備他還活着,此時備不會槍占主,當主不可用時,即備監聽不到主發送的廣播包時,就會啟動相關服務接管資源,保證業務的連續性,接管的速度可以小於1秒,VRRP使用加密協議加密發送廣播包。

1.5 Keepalived+Nginx高可用實踐

1.5.1 高可用環境准備

[root@lb-node1 ~]# cat /etc/redhat-release  #查看系統版本

CentOS release 6.7 (Final)

[root@lb-node1 ~]# uname -r #查看內核版本

2.6.32-573.el6.x86_64

[root@lb-node1 ~]# getenforce #確認Selinux關閉狀態

Disabled

[root@lb-node1 ~]# /etc/init.d/iptables status#確認Iptables關閉狀態

iptables: Firewall is not running.

1.5.2 安裝Nginx web服務

yum install openssl openssl-devel pcre pcre-devel -y

mkdir -p /home/oldboy/tools

cd /home/oldboy/tools

wget -q http://nginx.org/download/nginx-1.6.3.tar.gz

ls -l nginx-1.6.3.tar.gz

useradd nginx -s /sbin/nologin -M

tar xf nginx-1.6.3.tar.gz

cd nginx-1.6.3

./configure--user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module--with-http_ssl_module

make

make install

ln -s /application/nginx-1.6.3 /application/nginx

1.5.3 安裝Keepalived高可用

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

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

1.5.4 配置Master_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf  #Master Keepalived配置文件

  ! Configuration File for keepalived

 

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

     }

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_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.11/24

      }

  }

1.5.5 配置Backup_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #Backup Keepalived配置文件

  ! Configuration File for keepalived

 

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

     }

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_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.11/24

      }

  }

1.5.6 Keepalived主備配置比較

主從單實例keepalived.conf配置差別項

Keepalived配置參數

Master點特殊參數

Backup點特殊參數

route_id(唯一標識)

route_id lb01

route_id lb02

state(角色狀)

state Master

state Backup

priority(競選優先級)

priority 150

priority 100

1.5.7 啟動keepalived服務

[root@lb01 ~]# /etc/init.d/keepalived start #啟動lb01Master_keepalived

[root@lb02 ~]# /etc/init.d/keepalived start #啟動lb02Master_keepalived

1.5.8 檢測IP地址是否漂移

[root@lb01 ~]# ip addr|grep 10.0.0.11 #查看是否有VIP地址

    inet 10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived stop #停止MasterKeepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #VIP已經從Master端移除

 

[root@lb02 ~]# ip addr|grep 10.0.0.11 #BackupKeepalived接管資源

    inet 10.0.0.11/24 scope global secondary eth0   

[root@lb01 ~]# /etc/init.d/keepalived start #啟動Master_keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #Master繼續接管資源           

    inet 10.0.0.11/24 scope global secondary eth0

1.5.9 Keepalived配置文件詳解

  1 ! Configuration File for keepalived #注釋

  2

  3 global_defs {

  4    notification_email {

  5      acassen@firewall.loc #5-7發郵件給誰

  8    }

  9    notification_email_from Alexandre.Cassen@firewall.lo #發郵件發件人

 10    smtp_server 192.168.200.1 #郵件服務器地址

 11    smtp_connect_timeout 30 #超時時間

 12    router_id Nginx_01 #主備ID不能一樣

 13 }

 

15 vrrp_instance VI_1 {  #實例名稱(建議不修)

 16     state MASTER #服務器的狀態(僅僅是傀儡)

 17     interface eth0 #通信端口

 18     virtual_router_id 51 #實例的ID

 19     priority 150 #優先級,主備之間最好相差50

 20     advert_int 1 #心跳間隔(如果一秒沒通信備節點馬上接管)

 21     authentication {

 22         auth_type PASS #PASS認證類型,此參數備節點設置和主節點相同

 23         auth_pass 1111 #密碼是1111,此參數備節點設置和主節點相同

 24     }

 25     virtual_ipaddress { #vip(可以多個)

 26       10.0.0.11/24 #26-28配置vIP地址,綁定在eth0  因為(interface eth0)

29     }

 30 }

 

q 全局定義塊部分:主要設置Keepalived的通知機制和標識

1、第4-9行是email通知參數。作用:當LVS發生切換或RS等有故障時,會發郵件報警。這是可選配,notifucation_email指定在keepalived發生事件時,需要發給的email地址,可以有多個,每行一個。

2smtp_server指定發送郵件的smtp服務器,如果本機開啟了sendmail,就可以使用上面默認配置實現郵件發送。

3、第10行是Lvs負載均衡器標示(rote_id)。在一個局域網內,它應該是唯一的。

4、大括號”{}” 用來分隔定義塊,因此必須成對出現。如果漏寫了,keepalived運行時,不會得到預期的結果。由於定義塊內存在嵌套關系,因此很容易遺漏結尾處的花括號,這點要特別注意。

 

q VRRP定義塊

1、第13行為VRRP實例vrrp_instance,每個Vrrp實例可以認為是一個keepalived實例,在配置中VRRP實例可以有多個。

(1)14行實例狀態state.只有MasterBackup兩種狀態,並且需要大寫這些單詞。其中MASTER為工作狀態。BACKUP為備用狀態。當MASTER所在的服務器失效時,BACKUP所在的系統會自動把它的狀態有BACKUP變換成MASTER,當失效的MASTER所在的系統恢復時,BACKUPMASTER恢復到BACKUP狀態。

(2)通信接口interface。對外提供服務的網絡結構,如eth0,eth1當前主流的服務器有2個或2個以上的網絡接口,在選擇服務器接口時,一定要搞清楚了。

(3)lvs_sync_daemon_interface。負載均衡器之間的監控接口,類似於HA HeartBeat的心跳線。

(4)16行為虛擬路由標示virtual_route_id是一致的,同時在整個keepalived內是唯一的。

(5)17行為優先級priority,這是一個數字,數值愈大,優先級越高。在同一個vrrp_instance里,MASTER的優先級 BACKUP。若MASTERpriority值為150,那么BACKUPpriority只能在149或者跟小的數值(官方建議相差50)

(6)18行同步通知間隔advert_intMASTERBACKUP負載均衡器之間同步檢查的時間間隔,單位為秒。

(7)19-22行驗證authentication.包含驗證類型和驗證密碼。類型主要有PASSAH兩種,通常使用的類型為PASS,據說AH使用時有問題。驗證密碼為明文,同一vrrp實例MASTERBACKUP使用相同的密碼才能正常通信,這里官方推薦用明文即可。

 

2、第23-27行為虛擬ip地址virtual_ipaddress。可以配置多個IP地址,每個地址占一行,需要指定子網掩碼。

注意:這個ip必須與我們在lvs客戶端設定的vip相一致。

1.5.10 keepalived日志文件

[root@lb01 ~]#sed -i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S 0"#g' /etc/sysconfig/keepalived #指定文件接收Keepalived服務日志

[root@lb-node1 conf]# echo -e "local0.* \t /var/log/keepalived.log" >>/etc/rsyslog.conf  #配置至rsyslog

[root@lb-node1 conf]# tail -1 /etc/rsyslog.conf  #檢查是否配置成功

local0.*/var/log/keepalived.log

[root@lb-node1 conf]# /etc/init.d/rsyslog restart  #重新啟動rsyslog

Shutting down system logger:                               [  OK  ]

Starting system logger:                                [  OK  ]

1.6 Keepalived+Nginx高可用多實例實踐

1.6.1 Master_keepalived多實例

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #這上面第一個實例是Master 第二個實例修改為Backup

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.11/24

      }

  }

 

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.12/24

    }  

}

1.6.2 Backup_keepalived多實例

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf #這上面第一個實例是Backup,第二個實例修改為Backup

  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.11/24

      }

  }

 

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.12/24

    }  

}

1.6.3 檢測多實例IP地址是否漂移

[root@lb-node1 ~]# ip addr|grep 10.0.0.11

    inet 10.0.0.11/24 scope global secondary eth0

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

    inet 10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@lb-node1 ~]# ip addr|grep 10.0.0

    inet 10.0.0.11/24 scope global secondary eth0

    inet 10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@lb-node2 ~]# ip addr|grep 10.0.0.12     

    inet 10.0.0.12/24 scope global secondary eth0

[root@lb-node1 ~]# ip addr|grep 10.0.0

    inet 10.0.0.11/24 scope global secondary eth0

 

[root@lb-node1 ~]# tcpdump -n 'host 224.0.0.18'  抓包

1.7 keepalived列腦解決

由於某些原因,導致兩台高可用服務器對在指定時間內,無法檢測到對方的心跳消息,各自取得資源及服務的所有權,而此時的兩台高可用服務器對都還活着並

Nginx宕機keepalived是不會接管的,需要寫一個腳本檢測nginx是否存活 ,如果不存貨就kill nginxkeepalived

1、 可以ping通主,備節點還有VIP就認為列腦  (如果停止主,腳本也會報腦裂)

[root@lb02 ~]# cat check_split_brain.sh

#!/bin/sh

lb01_vip=10.0.0.12

lb01_ip=10.0.0.7

while true

do

ping -c 2 -W 3 $lb01_ip &>/dev/null

 if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]

  then

    echo "ha is split brain.warning."

else

    echo "ha is ok"

fi

sleep 5

done

1.8 Keepalived常見故障解決

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

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

Nginx服務死掉

[root@lb01 scripts]# cat nginx_pid.sh

#!/bin/sh

while true

do

nginxpid=`ps -C nginx --no-header|wc -l`

 

if [ $nginxpid -eq 0 ];then

/application/nginx/sbin/nginx

sleep 5

nginxpid=`ps -C nginx --no-header|wc -l`          

   if [ $nginxpid -eq 0 ];then

/etc/init.d/keepalived stop

   exit 1

   fi

fi

     sleep 5

done

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM