Nginx 高可用方案

準備工作

192.168.16.128

192.168.16.129

兩臺虛擬機。安裝好 Nginx

安裝 Nginx

更新 yum 源文件:

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

安裝 Nginx:

yum -y install  nginx

操作命令:

systemctl start nginx; #啓動Nginx
systemctl stop nginx; #停止Nginx

什麼是高可用?

高可用 HA(High Availability)是分佈式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。如果一個系統能夠一直提供服務,那麼這個可用性則是百分之百,但是天有不測風雲。所以我們只能儘可能的去減少服務的故障。

解決的問題?

在生產環境上很多時候是以 Nginx 做反向代理對外提供服務,但是一天 Nginx 難免遇見故障,如:服務器宕機。當 Nginx 宕機那麼所有對外提供的接口都將導致無法訪問。

雖然我們無法保證服務器百分之百可用,但是也得想辦法避免這種悲劇,今天我們使用 keepalived 來實現 Nginx 的高可用。

雙機熱備方案

這種方案是國內企業中最爲普遍的一種高可用方案,雙機熱備其實就是指一臺服務器在提供服務,另一臺爲某服務的備用狀態,當一臺服務器不可用另外一臺就會頂替上去。

keepalived 是什麼?

Keepalived 軟件起初是專爲 LVS 負載均衡軟件設計的,用來管理並監控 LVS 集羣系統中各個服務節點的狀態,後來又加入了可以實現高可用的 VRRP (Virtual Router Redundancy Protocol , 虛擬路由器冗餘協議)功能。因此,Keepalived 除了能夠管理 LVS 軟件外,還可以作爲其他服務(例如:Nginx、Haproxy、MySQL 等)的高可用解決方案軟件

故障轉移機制

Keepalived 高可用服務之間的故障切換轉移,是通過 VRRP 來實現的。在 Keepalived 服務正常工作時,主 Master 節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備 Backup 節點自己還活着,當主 Master 節點發生故障時,就無法發送心跳消息,備節點也就因此無法繼續檢測到來自主 Master 節點的心跳了,於是調用自身的接管程序,接管主 Master 節點的 IP 資源及服務。而當主 Master 節點恢復時,備 Backup 節點又會釋放主節點故障時自身接管的 IP 資源及服務,恢復到原來的備用角色。

實現過程

安裝 keepalived

yum 方式直接安裝即可,該方式會自動安裝依賴:

yum -y install keepalived

修改主機(192.168.16.128)keepalived 配置文件

yum 方式安裝的會生產配置文件在 / etc/keepalived 下:

keepalived.conf:

#檢測腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啓動
    interval 2                          #(檢測腳本執行的間隔,單位是秒)
    weight 2                            #權重
}
#vrrp 實例定義部分
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER爲主,BACKUP爲備
    interface ens33         # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡
    virtual_router_id 66    # 虛擬路由編號,主從要一直
    priority 100            # 優先級,數值越大,獲取處理請求的優先級越高
    advert_int 1            # 檢查間隔,默認爲1s(vrrp組播週期秒數)
    #授權訪問
    authentication {
        auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_http_port            #(調用檢測腳本)
    }
    virtual_ipaddress {
        192.168.16.130            # 定義虛擬ip(VIP),可多設,每行一個
    }
}

virtual_ipaddress 裏面可以配置 vip, 在線上通過 vip 來訪問服務。

interface 需要根據服務器網卡進行設置通常查看方式 ip addr

authentication 配置授權訪問後備機也需要相同配置

修改備機(192.168.16.129)keepalived 配置文件

keepalived.conf:

#檢測腳本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啓動
    interval 2                          #(檢測腳本執行的間隔)
    weight 2                            #權重
}
#vrrp 實例定義部分
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER爲主,BACKUP爲備
    interface ens33                      # 當前進行vrrp通訊的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡
    virtual_router_id 66                # 虛擬路由編號,主從要一直
    priority 99                         # 優先級,數值越大,獲取處理請求的優先級越高
    advert_int 1                        # 檢查間隔,默認爲1s(vrrp組播週期秒數)
    #授權訪問
    authentication {
        auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_http_port                   #(調用檢測腳本)
    }
    virtual_ipaddress {
        192.168.16.130                   # 定義虛擬ip(VIP),可多設,每行一個
    }
}

檢測腳本:

#!/bin/bash
#檢測nginx是否啓動了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx沒有啓動就啓動nginx                        
      systemctl start nginx                #重啓nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重啓失敗,則停掉keepalived服務,進行VIP轉移
              killall keepalived                    
      fi
fi

腳本授權: chmod 775 check_nginx_pid.sh

說明:腳本必須通過授權,不然沒權限訪問啊,在這裏我們兩條服務器執行、VIP(virtual_ipaddress:192.168.16.130), 我們在生產環境是直接通過 vip 來訪問服務。

模擬 nginx 故障:

修改兩個服務器默認訪問的 Nginx 的 html 頁面作爲區別。

首先訪問 192.168.16.130, 通過 vip 進行訪問,頁面顯示 192.168.16.128;說明當前是主服務器提供的服務。

這個時候 192.168.16.128 主服務器執行命令:

systemctl stop nginx; #停止nginx

再次訪問 vip(192.168.16.130) 發現這個時候頁面顯示的還是:192.168.16.128,這是腳本里面自動重啓。

現在直接將 192.168.16.128 服務器關閉,在此訪問 vip(192.168.16.130) 現在發現頁面顯示 192.168.16.129 這個時候 keepalived 就自動故障轉移了,一套企業級生產環境的高可用方案就搭建好了。

來源:https://www.cnblogs.com/SimpleWu/p/11004902.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/VwjZAqELFEoRyZXe1VhIhA