1. 程式人生 > >Nginx雙機主備(Keepalived實現)

Nginx雙機主備(Keepalived實現)

前言
首先介紹一下Keepalived,它是一個高效能的伺服器高可用或熱備解決方案,起初是專為LVS負載均衡軟體設計的,Keepalived主要來防止伺服器單點故障的發生問題,可以通過其與Nginx的配合實現web服務端的高可用。

Keepalived以VRRP協議為實現基礎,VRRP是Virtual Router Redundancy Protocol(虛擬路由冗餘協議)的縮寫,VRRP協議將兩臺或多臺路由器裝置虛擬成一個裝置,對外提供虛擬路由器IP(一個或多個)。

VRRP出現的目的就是為了解決靜態路由的單點故障問題的,它能保證當個別節點宕機時,整個網路可以不間斷地執行。

下面我們介紹一下nginx keepalived高可用方案的部署安裝。

環境準備
在兩臺主機上準備如下壓縮檔案:

keepalived-2.0.20.tar.gz
nginx-1.16.1.tar.gz
虛擬IP 真實IP nginx埠 主從
192.168.124.20 192.168.124.13 80 MASTER
192.168.124.20 192.168.124.14 80 BACKUP
安裝nginx
file 新建一個使用者:

useradd tianyan
確定安裝目錄,我這裡的安裝目錄是:/home/tianyan/tianyan_soft/nginx.install。

在這個目錄下分別新建兩個目錄用於安裝nginx和keepalived,解壓兩個壓縮包。

執行安裝命令:

./configure --prefix=/home/tianyan/tianyan_soft/nginx.install --sbin-path=/home/tianyan/tianyan_soft/nginx.install/sbin/nginx --conf-path=/home/tianyan/tianyan_soft/nginx.install/conf/nginx.conf --error-log-path=/home/tianyan/tianyan_soft/nginx.install/error.log --http-log-path=/home/tianyan/tianyan_soft/nginx.install/access.log --pid-path=/home/tianyan/tianyan_soft/nginx.install/nginx.pid --lock-path=/home/tianyan/tianyan_soft/nginx.install/nginx.lock --user=tianyan --group=tianyan --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-http_realip_module --with-threads --with-pcre --http-client-body-temp-path=/home/tianyan/tianyan_soft/nginx.install/client/ --http-proxy-temp-path=/home/tianyan/tianyan_soft/nginx.install/proxy/ --http-fastcgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/fcgi/ --http-uwsgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/uwsgi --http-scgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/scgi
如果報錯,記得安裝相關依賴:

yum install gcc gcc-c++
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)。
注:以非root許可權啟動時,會出現 nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 錯誤。

原因:Linux只有root使用者可以使用1024一下的埠

解決辦法:

1.按照root許可權啟動

2.將 /usr/local/nginx/conf/nginx.conf 檔案中的80埠改為1024以上。

安裝keepalived
./configure --prefix=/usr/local/keepalived
上述命令執行完畢後繼續執行:

make && make install
安裝完畢後,目錄是這個樣子:

file

將配置檔案拷貝到系統對應的目錄下

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
編輯 master 節點的 keepalived.conf
vim /etc/keepalived/keepalived.conf
內容參考如下:

! Configuration File for keepalived

global_defs {
#一個沒重複的名字即可
router_id hyq_slave
}

ng是否執行

vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}

vrrp_instance VI_1 {
state BACKUP # 必填,可以是MASTER或BACKUP

interface ens33
virtual_router_id 101
priority 90
advert_int 1

# 如果兩節點的上聯交換機禁用了組播,則採用vrrp單播通告的方式
# 本機ip
unicast_src_ip 192.168.124.14
unicast_peer {
    # 其他機器ip
    192.168.124.13
}
# 設定nopreempt防止搶佔資源
nopreempt

authentication {
    auth_type PASS
    auth_pass 1111
}

# 與上方nginx執行狀況檢測呼應
track_script {
    chk_nginx
}
virtual_ipaddress {
    192.168.124.20
}

}
編輯 slave 節點的 keepalived.conf
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
#一個沒重複的名字即可
router_id hyq_slave
}

ng是否執行

vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}

vrrp_instance VI_1 {
state BACKUP # 必填,可以是MASTER或BACKUP

interface ens33
virtual_router_id 101
priority 90
advert_int 1

# 如果兩節點的上聯交換機禁用了組播,則採用vrrp單播通告的方式
# 本機ip
unicast_src_ip 192.168.124.14
unicast_peer {
    # 其他機器ip
    192.168.124.13
}
# 設定nopreempt防止搶佔資源
nopreempt

authentication {
    auth_type PASS
    auth_pass 1111
}

# 與上方nginx執行狀況檢測呼應
track_script {
    chk_nginx
}
virtual_ipaddress {
    192.168.124.20
}

}
編寫nginx_check.sh指令碼
在/etc/keepalived目錄下新建nginx_check.sh指令碼

touch nginx_check.sh
編輯其內容為:

!/bin/sh

A=ps -C nginx --no-header |wc -l
if [ $A -eq 0 ]
then
/usr/sbin/nginx
sleep 1
A2=ps -C nginx --no-header |wc -l
if [ $A2 -eq 0 ]
then
systemctl stop keepalived
fi
fi
含義是:如果 nginx 停止執行,嘗試啟動,但是如果無法啟動,則殺死本機的 keepalived 程序, keepalied將會把虛擬 ip 繫結到 BACKUP 機器上。 注意: /usr/sbin/nginx是nginx的啟動命令,如果你安裝到其他目錄,則相應的替換。

Keepalived的日誌
Keepalived日誌預設位置是在/var/log/messages目錄下。我們將其修改一下。

由於系統是centos7,修改位置為:/lib/systemd/system/keepalived.service

原內容:

EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
修改為:

file

修改完畢後重新載入service

systemctl daemon-reload
建立命令軟連線:

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
執行:

keepalived -D -f /etc/keepalived/keepalived.conf
-D 將日誌輸出到message日誌,預設日誌也在message
-f 是指定配置檔案
修改/etc/sysconfig/keepalived

把KEEPALIVED_OPTIONS="-D" 修改為:KEEPALIVED_OPTIONS="-D -d -S 0"

file

在/etc/rsyslog.conf 末尾新增

local0.* /var/log/keepalived.log
file

最後執行命令:

service rsyslog restart
重啟keepalived後就可以看到日誌在/var/log/keepalived.log下了。

測試驗證VIP
當keepalived和nginx都啟動後,我們來測試一下。

首先在瀏覽器裡面訪問三個地址

http://192.168.124.20 (vip)
http://192.168.124.13 (master)
http://192.168.124.14 (slave)
我修改了一下nginx的index.html,可以看到當前vip指向是13的master節點:

file

然後,我們手動停止13上的nginx,再次訪問http://192.168.124.20。

file

說明安裝成功。

其中通過ip address命令可以觀察到網絡卡的變化 file

實驗到這裡,我們就完成了keepalived + nginx 主從配置的安裝部署了。

思考:如何開啟雙主模式
什麼是雙主模式?

分別介紹一下兩種配置

1、Nginx+keepalived 主從配置

file

這種方案就是上文介紹過的,使用一個vip地址,前端使用2臺機器,一臺做主,一臺做備,但同時只有一臺機器工作,另一臺備份機器在主機器不出現故障的時候,永遠處於浪費狀態,僅僅用於災備,平時都是空閒著的。

2、Nginx+keepalived 雙主配置

這種方案,使用兩個vip地址,前端使用2臺機器,互為主備,同時有兩臺機器工作,當其中一臺機器出現故障,兩臺機器的請求轉移到一臺機器負擔,如下圖:

file

【實戰】 elasticsearch 寫入速度提升的案例分享

用java做一個能賺錢的微信群聊機器人(PC協議)

Mysql百萬量級資料高效匯入Redis

視覺化介面線上生成JVM引數

java線上故障分析+效能調優

ELK實踐攻