1. 程式人生 > 其它 >nginx+keepalived 高可用

nginx+keepalived 高可用

搭建高可用

高可用叢集,即“HA叢集”,也常稱作“雙機熱備”,用於關鍵業務。常見實現高可用的開源軟體有heartbeat和keepalived,其中keepalived還有負載均衡的功能。這兩個軟體類似,核心原理都是通過心跳線連線兩臺伺服器,正常情況下由一臺伺服器提供服務,當這臺伺服器宕機,備用伺服器頂替。

準備

兩臺Centos 伺服器(一個為master:192.168.200.20,另一個為backup:192.168.200.21)。

安裝nginx

安裝nginx教程連線:nginx - 花花de程式碼生活 - 部落格園 (cnblogs.com)

兩個節點都需要安裝nginx

安裝keepalived

VRRP協議有1個master角色和至少1個backup角色,所以做本實驗需要準備至少兩臺Linux機器。這裡我們拿兩臺Linux虛擬機器(20和21,其中20作為master,21作為backup)來完成以下操作。

# yum install -y keepalived

CentOS預設的yum源裡就有keepalived包,安裝keepalived很簡單,但重點在於配置,下面我們拿一個實際案例來闡述 keepalived的高可用功能。

修改keepalived配置檔案

master節點

編輯master(192.168.200.20)的keepalived配置檔案:紅色:注意事項 

[root@master ~]# vim /etc/keepalived/keepalived.conf      //
內容如下 global_defs { #全域性配置標識,表明這個區域{}是全域性配置 notification_email { 1615134@qq.com #表示傳送通知郵件時郵件源地址是誰 } notification_email_from [email protected] #表示keepalived在發生諸如切換操作時需要傳送email通知,以及email傳送給哪些郵件地址,郵件地址可以多個,每行一個 smtp_server 127.0.0.1 #表示傳送email時使用的smtp伺服器地址,這裡可以用本地的sendmail來實現 smtp_connect_timeout
30 #連線smtp連線超時時間 router_id LVS_DEVEL #機器標識 } vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" #檢查服務是否正常,通過寫指令碼實現,指令碼檢查服務健康狀態 interval 3 #檢查時間間斷是3秒 } vrrp_instance VI_1 { #VRRP配置標識 VI_1是例項名稱 state MASTER #定義master相關 interface ens33 #通過vrrp協議去通訊、去發廣播。此為網絡卡名 virtual_router_id 51 #定義路由器ID ,配置的時候和從機器一致 priority 100 #權重,主角色和從角色的權重是不同的,一般主比從大 advert_int 1 #設定MASTER與BACKUP主機質檢同步檢查的時間間隔,單位為秒 authentication { #認證相關資訊 auth_type PASS #認證型別 auth_pass 5201314>g #密碼的形式是一個字串 } virtual_ipaddress { #設定虛擬IP地址 (VIP),又叫做漂移IP地址 192.168.200.100
} track_script { #載入指令碼 chk_nginx } } 【小技巧】全部刪除下面的時候:按123然後接著按dd後面的就全刪除了 !!!只做高可用的話先下面的必須刪掉 !!!只做高可用的話先下面的必須刪掉 !!!只做高可用的話先下面的必須刪掉 virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }

keepalived要實現高可用,監控Nginx服務是必不可少的,它本身沒有這個功能,需要藉助自定義指令碼實現,所以接下來我們還需要定義一個監控Nginx服務的指令碼,如下:

[root@master ~]# vim /usr/local/sbin/check_ng.sh  //新增如下內容
#!/bin/bash                                     
  #時間變數,用於記錄日誌
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx程序數量  
  n=`ps -C nginx --no-heading|wc -l`
#如果程序為0,則啟動nginx,並且再次檢測nginx程序數量    
  if [ $n -eq "0" ]; then      
         /etc/init.d/nginx start
          n2=`ps -C nginx --no-heading|wc -l`   
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
          if [ $n2 -eq "0"  ]; then
                  echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                  systemctl stop keepalived
          fi
 fi

編輯完監控Nginx服務的指令碼,還需要給它x許可權,否則無法被keepalived呼叫,命令如下:

[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh   

完成以上操作,就可以啟動master上的keepalived了,如果沒有啟動Nginx服務,它會幫我們自動拉動起來,並監聽VIP:

[root@master ~]# systemctl start keepalived
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f8:e3:b9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::a709:f89:6e2d:666a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::f47a:43ff:375e:c80/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

backup節點

[root@backup ~]# vim /etc/keepalived/keepalived.conf    //內容如下
global_defs {
   notification_email {
        1615134@qq.com
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_ng.sh"
    interval 3
    }

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5201314>g
    }
    virtual_ipaddress {
        192.168.200.100
    }
    track_script {
        chk_nginx
    }
}
!!!下面的也要刪掉

編輯監控指令碼,如下:

[root@backup ~]# vim /usr/local/sbin/check_ng.sh    //內容如下
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading|wc -l`
if [ $n -eq "0" ]; then
        systemctl start nginx
        n2=`ps -C nginx --no-heading|wc -l`
        if [ $n2 -eq "0"  ]; then
                echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                systemctl stop keepalived
        fi
fi

編輯完監控Nginx服務的指令碼,還需要給它x許可權,否則無法被keepalived呼叫,命令如下:

[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh 

啟動nginx跟keepalived

[root@backup ~]# nginx
[root@backup ~]# systemctl start keepalived
[root@backup ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:58:3f:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.21/24 brd 192.168.200.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::af2f:833c:2874:5380/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

開始測試

這是測試的master節點開啟keepalived的時候的樣子(下面這個master節點的是我改了nginx頁面後呈現的,nginx的html在:/usr/local/nginx/html/index.html)

關閉master節點關閉keepalived

[root@master ~]# systemctl stop keepalived

關閉後出現的頁面

從中得出的結論就是,關閉master節點的keepalived,那麼backup節點的就會頂上去