一、場景需求
解決Nginx的高可用集群問題
1、 阿里云: SLB
2簸喂、 硬件負載均衡器(如: F5、 Radware)
3燎潮、 軟件方式實現(xiàn)高可用或負載均衡
Keepalive喻鳄、 LVS……
二、Keepalived 簡要介紹
Keepalived 是一種高性能的服務(wù)器高可用或熱備解決方案确封, Keepalived 可以用來防止服務(wù)器單點故障的發(fā)生除呵,通過配合 Nginx 可以實現(xiàn) web 前端服務(wù)的高可用。
Keepalived 以 VRRP 協(xié)議為實現(xiàn)基礎(chǔ)爪喘,用 VRRP 協(xié)議來實現(xiàn)高可用性(HA)颜曾。 VRRP(Virtual RouterRedundancy Protocol)協(xié)議是用于實現(xiàn)路由器冗余的協(xié)議, VRRP 協(xié)議將兩臺或多臺路由器設(shè)備虛擬成一個設(shè)備腥放,對外提供虛擬路由器 IP(一個或多個)泛啸,而在路由器組內(nèi)部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER秃症,或者是通過算法選舉產(chǎn)生候址, MASTER 實現(xiàn)針對虛擬路由器 IP 的各種網(wǎng)絡(luò)功能,如 ARP 請求种柑, ICMP岗仑,以及數(shù)據(jù)的轉(zhuǎn)發(fā)等;其他設(shè)備不擁有該虛擬 IP聚请,狀態(tài)是 BACKUP荠雕,除了接收 MASTER 的VRRP 狀態(tài)通告信息外稳其,不執(zhí)行對外的網(wǎng)絡(luò)功能。當主機失效時炸卑, BACKUP 將接管原先 MASTER 的網(wǎng)絡(luò)功能既鞠。
VRRP 協(xié)議使用多播數(shù)據(jù)來傳輸 VRRP 數(shù)據(jù), VRRP 數(shù)據(jù)使用特殊的虛擬源 MAC 地址發(fā)送數(shù)據(jù)而不是自身網(wǎng)卡的 MAC 地址盖文, VRRP 運行時只有 MASTER 路由器定時發(fā)送 VRRP 通告信息嘱蛋,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 數(shù)據(jù)五续,不發(fā)送數(shù)據(jù)洒敏,如果一定時間內(nèi)沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告自己成為 MASTER疙驾,發(fā)送通告信息凶伙,重新進行 MASTER 選舉狀態(tài)。
三它碎、規(guī)劃方案
四函荣、安裝 Nginx
1、 安裝編譯 Nginx 所需的依賴包
#yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel
openssl openssl-devel
2链韭、 上傳 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src目錄
3偏竟、 編譯安裝 Nginx
#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
#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 歡迎首頁內(nèi)容(用于后面測試敞峭, 用于區(qū)分兩個節(jié)點的 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踊谋、系統(tǒng)防火墻打開對應(yīng)的端口 88
#vi /etc/sysconfig/iptables
## Nginx
-A INPUT -m state --state NEW -m tcp -p tcp --dport88-j ACCEPT
#service iptables restart
6、 測試 Nginx 是否安裝成功
#/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
#/usr/local/nginx/sbin/nginx
重啟 Nginx
#/usr/local/nginx/sbin/nginx -s reload
8殖蚕、 設(shè)置 Nginx 開機啟動
#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、 解壓安裝
#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 系統(tǒng)服務(wù):
因為沒有使用 keepalived 的默認路徑安裝(默認是/usr/local) ,安裝完成之后蛤育,需要做一些工作
復制默認配置文件到默認路徑
#mkdir /etc/keepalived
#cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
復制 keepalived 服務(wù)腳本到默認的地址
#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/
設(shè)置 keepalived 服務(wù)開機啟動
#chkconfig keepalived on
4、 修改 Keepalived 配置文件
(1) MASTER 節(jié)點配置文件(192.168.1.51)
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
## keepalived 自帶的郵件提醒需要開啟 sendmail 服務(wù)葫松。 建議用獨立的監(jiān)控或第三方 SMTP
router_idedu-proxy-01## 標識本節(jié)點的字條串瓦糕,通常為 hostname
}
## keepalived 會定時執(zhí)行腳本并對腳本執(zhí)行的結(jié)果進行分析,動態(tài)調(diào)整 vrrp_instance 的優(yōu)先級腋么。如果
腳本執(zhí)行結(jié)果為 0咕娄,并且 weight 配置的值大于 0,則優(yōu)先級相應(yīng)的增加珊擂。如果腳本執(zhí)行結(jié)果非 0圣勒,并且 weight
配置的值小于 0费变,則優(yōu)先級相應(yīng)的減少。其他情況圣贸,維持原本配置的優(yōu)先級挚歧,即配置文件中 priority 對應(yīng)
的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態(tài)的腳本路徑
interval 2 ## 檢測時間間隔
weight -20 ## 如果條件成立旁趟,權(quán)重-20
}
## 定義虛擬路由昼激, VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
stateMASTER## 主節(jié)點為 MASTER锡搜, 對應(yīng)的備份節(jié)點為 BACKUP
interface eth1 ## 綁定虛擬 IP 的網(wǎng)絡(luò)接口,與本機 IP 地址所在的網(wǎng)絡(luò)接口相同瞧掺, 我的是 eth1
virtual_router_id 51 ## 虛擬路由的 ID 號耕餐, 兩個節(jié)點設(shè)置必須一樣, 可選 IP 最后一段使用, 相同的 VRID 為一個組辟狈,他將決定多播的 MAC 地址
mcast_src_ip192.168.1.51## 本機 IP 地址
priority100## 節(jié)點優(yōu)先級肠缔, 值范圍 0-254,MASTER 要比 BACKUP 高
nopreempt## 優(yōu)先級高的設(shè)置 nopreempt 解決異澈咦恢復后再次搶占的問題
advert_int 1 ## 組播信息發(fā)送間隔明未,兩個節(jié)點設(shè)置必須一樣, 默認 1s
## 設(shè)置驗證信息壹蔓,兩個節(jié)點必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實生產(chǎn)趟妥,按需求對應(yīng)該過來
}
## 將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx ## 執(zhí)行 Nginx 監(jiān)控的服務(wù)
}
## 虛擬 IP 池, 兩個節(jié)點設(shè)置必須一樣
virtual_ipaddress {
192.168.1.50 ## 虛擬 ip,可以定義多個
}
}
(2)BACKUP 節(jié)點配置文件(192.168.1.52)
#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 狀態(tài)檢測腳本/etc/keepalived/nginx_check.sh(已在 keepalived.conf 中配置)
腳本要求:如果 nginx 停止運行覆劈,嘗試啟動戴差,如果無法啟動則殺死本機的 keepalived 進程, keepalied將虛擬 ip 綁定到 BACKUP 機器上。 內(nèi)容如下:
# 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
---------------------------------------------------------------------------------------------------------------------
保存后,給腳本賦執(zhí)行權(quán)限:
#chmod +x /etc/keepalived/nginx_check.sh
6淮阐、 啟動 Keepalived
#service keepalived start
Starting keepalived: [OK]
7辣垒、 Keepalived+Nginx 的高可用測試
(1)關(guān)閉 192.168.1.51 中的 Nginx, Keepalived 會將它重新啟動
#/usr/local/nginx/sbin/nginx -s stop
(2)關(guān)閉 192.168.1.51 中的 Keepalived璧函, VIP 會切換到 192.168.1.52 中
#service keepalived stop
Keepalived 停止后傀蚌,該節(jié)點的網(wǎng)絡(luò)接口中的 VIP 將消失
查看此時 VIP 對應(yīng)的 MAC, Windows 下使用 CMD 命令查看:
說明此時 VIP 已經(jīng)漂移到物理主機 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 狀態(tài)
#ip add
Keepalived 啟動后, 網(wǎng)絡(luò)接口上又會創(chuàng)建出 VIP 192.168.1.50
Keepalived 服務(wù)管理命令:
停止:service keepalived stop
啟動:service keepalived start
重啟:service keepalived restart
查看狀態(tài):service keepalived status
其他參考資料:
keepalived 之 vrrp_script 總結(jié):http://my.oschina.net/hncscwc/blog/158746
keepalived 雙機熱備實現(xiàn)故障時發(fā)送郵件通知:http://www.2cto.com/os/201407/317795.html
基于 keepalived 實現(xiàn) VIP 轉(zhuǎn)移美澳, lvs销部, nginx 的高可用:http://www.tuicool.com/articles/eu26Vz