一、場景需求
解決Nginx的高可用集群問題
1、 阿里云: SLB
2、 硬件負載均衡器(如: F5、 Radware)
3、 軟件方式實現高可用或負載均衡
Keepalive、 LVS……
二、Keepalived 簡要介紹
Keepalived 是一種高性能的服務器高可用或熱備解決方案, Keepalived 可以用來防止服務器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。 VRRP(Virtual RouterRedundancy Protocol)協議是用于實現路由器冗余的協議, VRRP 協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,或者是通過算法選舉產生, MASTER 實現針對虛擬路由器 IP 的各種網絡功能,如 ARP 請求, ICMP,以及數據的轉發等;其他設備不擁有該虛擬 IP,狀態是 BACKUP,除了接收 MASTER 的VRRP 狀態通告信息外,不執行對外的網絡功能。當主機失效時, BACKUP 將接管原先 MASTER 的網絡功能。
VRRP 協議使用多播數據來傳輸 VRRP 數據, VRRP 數據使用特殊的虛擬源 MAC 地址發送數據而不是自身網卡的 MAC 地址, VRRP 運行時只有 MASTER 路由器定時發送 VRRP 通告信息,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 數據,不發送數據,如果一定時間內沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告自己成為 MASTER,發送通告信息,重新進行 MASTER 選舉狀態。
三、規劃方案
四、安裝 Nginx
1、 安裝編譯 Nginx 所需的依賴包
2、 上傳 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src目錄
3、 編譯安裝 Nginx
```shell
#cd /usr/local/src/
#tar -zxvf nginx-1.6.2.tar.gz
#cd nginx-1.6.2
#./configure --prefix=/usr/local/nginx
#make && make install
```
4、 配置 Nginx
```shell
#vi /usr/local/nginx/conf/nginx.conf
userroot;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen88;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
```
修改 Nginx 歡迎首頁內容(用于后面測試, 用于區分兩個節點的 Nginx):
# vi /usr/local/nginx/html/index.html
192.168.1.51 中的標題加 1
Welcome to nginx!1
192.168.1.52 中的標題加 2
Welcome to nginx!2
5、系統防火墻打開對應的端口 88
```
#vi /etc/sysconfig/iptables
## Nginx
-A INPUT -m state --state NEW -m tcp -p tcp --dport88-j ACCEPT
#service iptables restart
```
6、 測試 Nginx 是否安裝成功
```shell
#/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
```
7、啟動 Nginx
```shell
#/usr/local/nginx/sbin/nginx
```
重啟 Nginx
```shell
#/usr/local/nginx/sbin/nginx -s reload
```
8、 設置 Nginx 開機啟動
```shell
#vi /etc/rc.local
加入:
/usr/local/nginx/sbin/nginx
```
9、 分別訪問兩個 Nginx
五、安裝 Keepalived (http://www.keepalived.org/download.html)
1、 上傳或下載 keepalived(keepalived-1.2.18.tar.gz) 到/usr/local/src目錄
2、 解壓安裝
```shell
#cd /usr/local/src
#tar -zxvf keepalived-1.2.18.tar.gz
#cd keepalived-1.2.18
#./configure --prefix=/usr/local/keepalived
#make && make install
```
3、 將 keepalived 安裝成 Linux 系統服務:
因為沒有使用 keepalived 的默認路徑安裝(默認是/usr/local) ,安裝完成之后,需要做一些工作
復制默認配置文件到默認路徑
```shell
#mkdir /etc/keepalived
#cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
```
復制 keepalived 服務腳本到默認的地址
```shell
#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
#cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#ln -s /usr/local/sbin/keepalived /usr/sbin/
#ln -s /usr/local/keepalived/sbin/keepalived /sbin/
```
設置 keepalived 服務開機啟動
```shell
#chkconfig keepalived on
```
4、 修改 Keepalived 配置文件
(1) MASTER 節點配置文件(192.168.1.51)
```shell
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。 建議用獨立的監控或第三方 SMTP
router_idedu-proxy-01## 標識本節點的字條串,通常為 hostname
}
```
## keepalived 會定時執行腳本并對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先級。如果
腳本執行結果為 0,并且 weight 配置的值大于 0,則優先級相應的增加。如果腳本執行結果非 0,并且 weight
配置的值小于 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中 priority 對應
的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的腳本路徑
interval 2 ## 檢測時間間隔
weight -20 ## 如果條件成立,權重-20
}
## 定義虛擬路由, VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
stateMASTER## 主節點為 MASTER, 對應的備份節點為 BACKUP
interface eth1 ## 綁定虛擬 IP 的網絡接口,與本機 IP 地址所在的網絡接口相同, 我的是 eth1
virtual_router_id 51 ## 虛擬路由的 ID 號, 兩個節點設置必須一樣, 可選 IP 最后一段使用, 相同的 VRID 為一個組,他將決定多播的 MAC 地址
mcast_src_ip192.168.1.51## 本機 IP 地址
priority100## 節點優先級, 值范圍 0-254,MASTER 要比 BACKUP 高
nopreempt## 優先級高的設置 nopreempt 解決異常恢復后再次搶占的問題
advert_int 1 ## 組播信息發送間隔,兩個節點設置必須一樣, 默認 1s
## 設置驗證信息,兩個節點必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實生產,按需求對應該過來
}
## 將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx ## 執行 Nginx 監控的服務
}
## 虛擬 IP 池, 兩個節點設置必須一樣
virtual_ipaddress {
192.168.1.50 ## 虛擬 ip,可以定義多個
}
}
(2)BACKUP 節點配置文件(192.168.1.52)
```shell
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_idedu-proxy-02
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
stateBACKUP
interface eth1
virtual_router_id 51
mcast_src_ip192.168.1.52
priority90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.50
}
}
```
5、編寫 Nginx 狀態檢測腳本/etc/keepalived/nginx_check.sh(已在 keepalived.conf 中配置)
腳本要求:如果 nginx 停止運行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程, keepalied將虛擬 ip 綁定到 BACKUP 機器上。 內容如下:
# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
---------------------------------------------------------------------------------------------------------------------
保存后,給腳本賦執行權限:
#chmod +x /etc/keepalived/nginx_check.sh
6、 啟動 Keepalived
#service keepalived start
Starting keepalived: [OK]
7、 Keepalived+Nginx 的高可用測試
(1)關閉 192.168.1.51 中的 Nginx, Keepalived 會將它重新啟動
#/usr/local/nginx/sbin/nginx -s stop
(2)關閉 192.168.1.51 中的 Keepalived, VIP 會切換到 192.168.1.52 中
#service keepalived stop
Keepalived 停止后,該節點的網絡接口中的 VIP 將消失
查看此時 VIP 對應的 MAC, Windows 下使用 CMD 命令查看:
說明此時 VIP 已經漂移到物理主機 192.168.1.52 上了
再通過 VIP 來訪問 Nginx 集群, 訪問到的也是 192.168.1.52
(3)重新啟動 192.168.1.51 中的 Keepalived, VIP 又會切回到 192.168.1.51 中來
#service keepalived start
查看虛擬 IP 狀態
#ip add
Keepalived 啟動后, 網絡接口上又會創建出 VIP 192.168.1.50
Keepalived 服務管理命令:
停止:service keepalived stop
啟動:service keepalived start
重啟:service keepalived restart
查看狀態:service keepalived status
其他參考資料:
keepalived 之 vrrp_script 總結:http://my.oschina.net/hncscwc/blog/158746
keepalived 雙機熱備實現故障時發送郵件通知:http://www.2cto.com/os/201407/317795.html
基于 keepalived 實現 VIP 轉移, lvs, nginx 的高可用:http://www.tuicool.com/articles/eu26Vz