1. 程式人生 > >Nginx + Keepalived 實現服務高可用

Nginx + Keepalived 實現服務高可用

這一篇,主要介紹下 Nginx + KeepAlived 如何配置 HA(高可用性”(High Availability)通常來描述一個系統經過專門的設計,從而減少停工時間,而保持其服務的高度可用性)。

在專案部署過程中,代理伺服器 Nginx 要做到線上高可用,避免出現單點故障,因此需要至少 2 臺伺服器才行。所以計劃使用 2 臺 nginx 代理伺服器,通過 Keepalived 來實現 nginx 的 HA,實現一臺 nginx 代理伺服器宕機,另一臺備機自動接管服務的效果。在這裡 nginx 做反向代理,實現後端應用伺服器(如 Tomcat 等)的負載均衡。

1 KeepAlived介紹

Keepalived 是一個基於 VRRP 協議來實現的服務高可用方案,可以利用其來避免 IP 單點故障,類似的工具還有 heartbeat、corosync、pacemaker。但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到叢集的高可用。

2. 安裝軟體

2.1 測試環境

代理機器 2 臺:CentOS release 6.9 (Final)  2.6.32-696.el6.x86_64

機器 IP:192.168.220.58(web58,做BACKUP)、192.168.220.59(web59,做MASTER)

虛擬 IP:192.168.220.60

2.2 安裝 Nginx

在 2 臺機器上,安裝 Nginx。

安裝命令:yum install -y nginx

檢視安裝的 Nginx 版本:nginx -v

版本資訊如下:

nginx version: nginx/1.10.2

另:一些軟體常規配置命令:

chkconfig nginx --list

chkconfig nginx on

service nginx status

service nginx start

2.3 測試 Nginx

在瀏覽器中,直接輸入地址 http://192.168.220.58 和 192.168.220.59,如果開啟主頁面正常,說明 Nginx 安裝並啟動成功。

2.4 安裝 Keepalived

在 2 臺機器上,安裝 Keepalived。

安裝命令:yum install -y keepalived

檢視安裝的 Keepalived 版本:keepalived -v

版本資訊如下:

Keepalived v1.2.13 (03/19,2015)

另:一些軟體常規配置命令:

chkconfig keepalived --list

chkconfig keepalived on

service keepalived status

service keepalived start

3 Keepalived 實現 nginx 高可用

3.1 nginx 監控指令碼

該指令碼檢測 ngnix 的執行狀態,並在 nginx 程序不存在時嘗試重新啟動 ngnix,如果啟動失敗則停止 keepalived,準備讓其它機器接管。

路徑:/etc/keepalived/check_nginx.sh:

#! /bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /etc/rc.d/init.d/nginx start
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/rc.d/init.d/keepalived stop
    fi
fi

3.2 keepalived.conf 配置

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
#    script "killall -0 nginx"
    script "/etc/keepalived/check_nginx.sh" 
    interval 2 
    weight -5 
    fall 3  
    rise 2 
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 192.168.220.59
    virtual_router_id 51
    priority 101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.220.60
    }
    track_script {
       chk_nginx 
    }
}

在另外一臺代理伺服器上,只需要改變 state MASTER -> state BACKUP,priority 101 -> priority 100,mcast_src_ip 192.168.220.59 -> mcast_src_ip 192.168.220.58 即可。

4 測試

4.1 檢視網路

在兩臺機器上輸入命令 ip a |grep eth0,則看到如下結果:

[[email protected] html]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.220.59/24 brd 192.168.220.255 scope global eth0
    inet 192.168.220.60/32 scope global eth0

[[email protected] html]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.220.58/24 brd 192.168.220.255 scope global eth0

瀏覽器訪問 192.168.220.60,正常且走的是 59 機器上的 nginx。

4.2 停掉 Keepalived MASTER

停掉 59 機器上的 Keepalived 服務,就相當於機器直接掛掉的情況,可以看到 58 會自動接管 MASTER,這是訪問 192.168.220.60,正常且走的是 58 機器上的 nginx。

再次啟動 59 機器的 Keepalived,可以看到虛擬 IP 又漂移到了 59 機器上。

4.3 停掉 MASTER 機器上的 Nginx

如果停掉 59 機器上的 Nginx,相當於只是代理伺服器掛掉了,可以看到 Keepalived 會自動執行自定義的檢查指令碼,會嘗試重啟 Nginx 服務,如果啟動成功,則虛擬 IP 不會漂移;如果嘗試啟動失敗,則虛擬 IP 將漂移到 58 機器上。