之前的文章中提到了 Nginx 作為反向代理服務器是把多個來自不同客戶端的請求轉發(fā)到私有網絡下的各個對應的服務下,這么看來朱浴, Nginx 就是一個中轉器吊圾,所有的請求都要從 Nginx 中通過。那么 Nginx 的穩(wěn)定性和可用性就必然有很高的要求翰蠢。
此文將介紹使用 Keepalived 對 Nginx 進行主備的高可用配置项乒。
一、Keepalived 簡要介紹
Keepalived 是一種高性能的服務器高可用或熱備解決方案梁沧, Keepalived 可以用來防止服務器單點故障的發(fā)生檀何,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協(xié)議為實現基礎趁尼,用 VRRP 協(xié)議來實現高可用性(HA)埃碱。 VRRP(Virtual Router Redundancy Protocol) 協(xié)議是用于實現路由器冗余的協(xié)議, VRRP 協(xié)議將兩臺或多臺路由器設備虛擬成一個設備酥泞,對外提供虛擬路由器 IP(一個或多個)砚殿,而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER芝囤,或者是通過算法選舉產生似炎, MASTER 實現針對虛擬路由器 IP 的各種網絡功能,如 ARP 請求悯姊, ICMP羡藐,以及數據的轉發(fā)等;其他設備不擁有該虛擬 IP悯许,狀態(tài)是 BACKUP仆嗦,除了接收 MASTER 的 VRRP 狀態(tài)通告信息外,不執(zhí)行對外的網絡功能先壕。
當主機失效時瘩扼, BACKUP 將接管原先 MASTER 的網絡功能。VRRP 協(xié)議使用多播數據來傳輸 VRRP 數據垃僚, VRRP 數據使用特殊的虛擬源 MAC 地址發(fā)送數據而不是自身網卡的 MAC 地址集绰, VRRP 運行時只有 MASTER 路由器定時發(fā)送 VRRP 通告信息,表示 MASTER 工作正常以及虛擬路由器 IP (組)谆棺, BACKUP 只接收 VRRP 數據栽燕,不發(fā)送數據,如果一定時間內沒有接收到 MASTER 的通告信息改淑,各 BACKUP 將宣告自己成為 MASTER碍岔,發(fā)送通告信息,重新進行 MASTER 選舉狀態(tài)溅固。
二付秕、方案規(guī)劃
VIP | IP | HOSTANME | Nginx 端口 | 默認主從 |
---|---|---|---|---|
192.168.174.110 | 192.168.174.200 | hadoop1 | 80 | MASTER |
192.168.174.110 | 192.168.174.201 | hadoop2 | 80 | BACKUP |
CentOS 6.9 x64
keepalived-1.2.24
nginx-1.13.0
三、Nginx 安裝
四侍郭、Keepalived 安裝
需在 hadoop1/hadoop2 兩個節(jié)點均進行如下安裝
1 下載 Keepalived
官方下載地址
http://www.keepalived.org/download.html
下載 1.2.24 版本程序到服務器
[root@hadoop1 keepalived]# pwd
/data/software/keepalived
[root@hadoop1 keepalived]# wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
2 解壓程序
[root@hadoop1 keepalived]# pwd
/data/software/keepalived
[root@hadoop1 keepalived]# ll
total 812
-rw-r--r--. 1 root root 829602 May 27 03:21 keepalived-1.2.24.tar.gz
[root@hadoop1 keepalived]# tar zxvf keepalived-2.0.0.tar.gz
3 編譯安裝
[root@hadoop1 keepalived]# cd keepalived-1.2.24
[root@hadoop1 keepalived-1.2.24]# pwd
/data/software/keepalived/keepalived-1.2.24
[root@hadoop1 keepalived-1.2.24]# ./configure --prefix=/usr/local/keepalived
[root@hadoop1 keepalived-1.2.24]# make && make install
4 將 keepalived 安裝成 Linux 系統(tǒng)服務
因為沒有使用 keepalived 的默認路徑安裝(默認是/usr/local) ,安裝完成之后询吴,需要做一些工作復制默認配置文件到默認路徑
[root@hadoop1 keepalived-1.2.24]# mkdir /etc/keepalived
[root@hadoop1 keepalived-1.2.24]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
復制 keepalived 服務腳本到默認的地址
[root@hadoop1 keepalived-1.2.24]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@hadoop1 keepalived-1.2.24]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@hadoop1 keepalived-1.2.24]# ln -s /usr/local/sbin/keepalived /usr/sbin/
[root@hadoop1 keepalived-1.2.24]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
賦予權限
[root@hadoop1 init.d]# chmod 755 /etc/init.d/keepalived
設置 keepalived 服務開機啟動
chkconfig keepalived on
五掠河、Keepalived 配置
1 MASTER 節(jié)點配置 - (hadoop1/192.168.174.200):
備份默認配置文件:
[root@hadoop1 keepalived]# pwd
/etc/keepalived
[root@hadoop1 keepalived]# cp keepalived.conf keepalived.conf.bak
清除默認配置并編輯 keepalived 配置文件:
[root@hadoop1 keepalived]#>keepalived.conf
[root@hadoop1 keepalived]# vi keepalived.conf
配置如下內容并保存退出:
! Configuration File for keepalived
global_defs {
router_id hadoop1 # hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 檢測 nginx 的腳本
interval 2 # 每 2 秒檢測一次
weight -20 # 如果某一個 nginx 宕機 則權重減 20
}
vrrp_instance VI_1 {
state MASTER # 狀態(tài) MASTER BACKUP
interface eth0 # 綁定的網卡
virtual_router_id 51 # 虛擬路由的 ID 號,兩個節(jié)點設置必須一樣
mcast_src_ip 192.168.174.200 # 本機的 IP
priority 100 # 節(jié)點優(yōu)先級,值范圍 0-254猛计,MASTER 要比 BACKUP 高唠摹,按優(yōu)先級值大小優(yōu)先訪問優(yōu)先級高的
nopreempt # 優(yōu)先級高的設置 nopreempt 解決異常恢復后再次搶占的問題
advert_int 1 # 組播信息發(fā)送間隔奉瘤,兩個節(jié)點設置必須一樣勾拉,默認 1s
# 設置驗證信息,兩個節(jié)點必須一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬 IP盗温,兩個節(jié)點設置必須一樣藕赞。
virtual_ipaddress {
192.168.174.110
}
# nginx 存活狀態(tài)檢測腳本
track_script {
chk_nginx
}
}
2 BACKUP 節(jié)點配置 - (hadoop2/192.168.174.201):
備份默認配置文件:
[root@hadoop2 keepalived]# pwd
/etc/keepalived
[root@hadoop2 keepalived]# cp keepalived.conf keepalived.conf.bak
清除默認配置并編輯 keepalived 配置文件:
[root@hadoop2 keepalived]#>keepalived.conf
[root@hadoop2 keepalived]# vi keepalived.conf
配置如下內容并保存退出:
! Configuration File for keepalived
global_defs {
router_id hadoop2 # hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 檢測 nginx 的腳本
interval 2 # 每 2 秒檢測一次
weight -20 # 如果某一個 nginx 宕機 則權重減 20
}
vrrp_instance VI_1 {
state BACKUP # 狀態(tài) MASTER BACKUP
interface eth0 # 綁定的網卡
virtual_router_id 51 # 虛擬路由的 ID 號,兩個節(jié)點設置必須一樣
mcast_src_ip 192.168.174.201 # 本機的 IP
priority 90 # 節(jié)點優(yōu)先級,值范圍 0-254卖局,MASTER 要比 BACKUP 高斧蜕,按優(yōu)先級值大小優(yōu)先訪問優(yōu)先級高的
advert_int 1 # 組播信息發(fā)送間隔,兩個節(jié)點設置必須一樣砚偶,默認 1s
# 設置驗證信息批销,兩個節(jié)點必須一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬 IP,兩個節(jié)點設置必須一樣染坯。
virtual_ipaddress {
192.168.174.110
}
# nginx 存活狀態(tài)檢測腳本
track_script {
chk_nginx
}
}
注:上方的配置文件中有幾處必須要改動的內容
(1) router_id hadoop1 將 hadoop1 改為配置的 MASTER 節(jié)點的主機名均芽。
(2) mcast_src_ip 192.168.174.200 將 192.168.174.200 改為 配置的 MASTER 節(jié)點的 IP。
(3) virtual_ipaddress {192.168.174.110} 將 192.168.174.110 改為配置 keepalived 集群的兩臺服務器同網段且可用的 IP 作為虛擬 IP单鹿,此 IP 作為負載均衡的訪問 IP掀宋,且可以配置多個。
六仲锄、編寫 Nginx 狀態(tài)檢測腳本
編寫 Nginx 狀態(tài)檢測腳本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)腳本要求:如果 nginx 停止運行布朦,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程昼窗, keepalied將虛擬 ip 綁定到 BACKUP 機器上。
新建并編譯 nginx_check.sh 文件
[root@hadoop1 keepalived]# vim /etc/keepalived/nginx_check.sh
添加如下內容:
#!/bin/bash
# 設置當前服務器的 nginx 的監(jiān)聽端口涛舍,用于下方腳本通過端口號來準確校驗 nginx 的運行狀態(tài)
NGINX_PORT=80
# 校驗指定端口的 nginx 服務的運行情況
function check_nginx() {
PROCESS_COUNT=`netstat -anp | grep "\<${NGINX_PORT}\>" | grep nginx | wc -l`
return ${PROCESS_COUNT}
}
check_nginx
if [ $? -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
check_nginx
if [ $? -eq 0 ];then
killall keepalived
fi
fi
注:如果你的 nginx 服務的監(jiān)聽端口設置的不是 80 (/usr/local/nginx/conf/nginx.conf 中默認配置為 80)澄惊,將 NGINX_PORT 改為對應的監(jiān)聽端口。
賦予執(zhí)行權限
[root@hadoop1 keepalived]# chmod 755 /etc/keepalived/nginx_check.sh
七富雅、服務啟停
分別在兩臺服務器執(zhí)行如下命令啟動 keepalived
[root@hadoop1 keepalived]# service keepalived start
Starting keepalived: [ OK ]
[root@hadoop2 keepalived]# service keepalived start
Starting keepalived: [ OK ]
注:
由于在 nginx_check.sh 腳本中已經加入了 nginx 檢測及啟動掸驱。因此,此處可以不用啟動 nginx没佑,由 keepalived 來校驗及啟動毕贼。
常用命令
service keepalived start #啟動服務
service keepalived stop #停止服務
service keepalived restart #重啟服務
八、驗證
8.1 校驗 nginx/keepalived 進程
hadoop1:
[root@hadoop1 keepalived]# netstat -anp | grep nginx | grep "\<80\>"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 48008/nginx
[root@hadoop1 keepalived]# ps -ef | grep keepalived | grep -v grep
root 53267 1 0 02:35 ? 00:00:00 keepalived -D
root 53268 53267 0 02:35 ? 00:00:00 keepalived -D
root 53269 53267 0 02:35 ? 00:00:00 keepalived -D
hadoop2:
[root@hadoop2 keepalived]# netstat -anp|grep nginx | grep "\<80\>"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 25778/nginx
[root@hadoop2 keepalived]# ps -ef | grep keepalived | grep -v grep
root 29559 1 0 02:18 ? 00:00:00 keepalived -D
root 29560 29559 0 02:18 ? 00:00:00 keepalived -D
root 29561 29559 0 02:18 ? 00:00:00 keepalived -D
8.2 校驗虛擬 IP 綁定情況
hadoop1:
[root@hadoop1 keepalived]# ip addr
hadoop2:
[root@hadoop2 keepalived]# ip addr
8.3 校驗訪問
修改兩臺服務器的 nginx 的 index.html 文件
hadoop1:
[root@hadoop1 keepalived]# cd /usr/local/nginx/html
[root@hadoop1 html]# vim index.html
<h1>Welcome to nginx</h1>
改為
<h1>Welcome to nginx -> hadoop1!</h1>
保存退出
hadoop2:
[root@hadoop2 keepalived]# cd /usr/local/nginx/html
[root@hadoop2 html]# vim index.html
<h1>Welcome to nginx</h1>
改為
<h1>Welcome to nginx -> hadoop2!</h1>
保存退出
HTTP 訪問
在瀏覽器中輸入 http://192.168.174.110:80 訪問蛤奢,如下顯示鬼癣,則表示訪問 keepalived 負載均衡正常陶贼,因為默認優(yōu)先訪問 master 節(jié)點,因此在 master 節(jié)點(hadoop1/192.168.174.130)nginx 服務正常情況下待秃,將一直訪問到的是 master 節(jié)點的服務
測試
停止 master 節(jié)點的 keepalived 服務
[root@hadoop1 html]# service keepalived stop
Stopping keepalived: [ OK ]
[root@hadoop1 html]# ps -ef | grep keepalived
root 58172 115469 0 02:51 pts/1 00:00:00 grep keepalived
再訪問 http://192.168.174.110/
啟動 master 節(jié)點的 keepalived 服務
[root@hadoop1 html]# service keepalived start
Starting keepalived: [ OK ]
[root@hadoop1 html]# ps -ef|grep keepalived | grep -v grep
root 58421 1 0 02:53 ? 00:00:00 keepalived -D
root 58423 58421 0 02:53 ? 00:00:00 keepalived -D
root 58424 58421 0 02:53 ? 00:00:00 keepalived -D
再次訪問 http://192.168.174.110/
可以看到拜秧,訪問到的又是 master 節(jié)點的 nginx 服務了。
至此章郁,Keepalived + Nginx 實現高可用 Web 負載均衡便安裝與配置完成了枉氮。
附錄:keepalived 配置文件說明
引用自:http://blog.csdn.net/xyang81/article/details/52554398
keepalived 服務安裝完成之后,后面的主要工作就是在 keepalived.conf 文件中配置 HA 和負載均衡暖庄。
一個功能比較完整的常用的 keepalived 配置文件聊替,主要包含三塊:
- 全局定義塊、VRRP實例定義塊和虛擬服務器定義塊培廓。
- 全局定義塊是必須的惹悄,如果keepalived只用來做ha,
- 虛擬服務器是可選的医舆。下面是一個功能比較完整的配置文件模板:
#全局定義塊
global_defs {
# 郵件通知配置
notification_email {
email1
email2
}
notification_email_from email
smtp_server host
smtp_connect_timeout num
lvs_id string
router_id string ## 標識本節(jié)點的字條串,通常為hostname
}
#VRRP 實例定義塊
vrrp_sync_group string {
group {
string
string
}
}
vrrp_instance string {
state MASTER|BACKUP
virtual_router_id num
interface string
mcast_src_ip @IP
priority num
advert_int num
nopreempt
smtp_alert
lvs_sync_daemon_interface string
authentication {
auth_type PASS|AH
auth_pass string
}
virtual_ipaddress { # Block limited to 20 IP addresses @IP
@IP
@IP
}
}
#虛擬服務器定義塊
virtual_server (@IP PORT)|(fwmark num) {
delay_loop num
lb_algo rr|wrr|lc|wlc|sh|dh|lblc
lb_kind NAT|DR|TUN
persistence_timeout num
protocol TCP|UDP
real_server @IP PORT {
weight num
notify_down /path/script.sh
TCP_CHECK {
connect_port num
connect_timeout num
}
}
real_server @IP PORT {
weight num
MISC_CHECK {
misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)
}
}
real_server @IP PORT {
weight num
HTTP_GET|SSL_GET {
url {
# You can add multiple url block path alphanum
digest alphanum
}
connect_port num
connect_timeout num
nb_get_retry num
delay_before_retry num
}
}
}
配置說明
一俘侠、全局定義塊
1、email通知(notification_email蔬将、smtp_server爷速、smtp_connect_timeout):
用于服務有故障時發(fā)送郵件報警,可選項霞怀,不建議用惫东。需要系統(tǒng)開啟sendmail服務,
建議用第三獨立監(jiān)控服務毙石,如用nagios全面監(jiān)控代替廉沮。
2、lvs_id:lvs負載均衡器標識徐矩,在一個網絡內滞时,它的值應該是唯一的。
3滤灯、router_id:用戶標識本節(jié)點的名稱坪稽,通常為hostname
4、花括號{}:用來分隔定義塊鳞骤,必須成對出現窒百。如果寫漏了,
keepalived運行時不會得到預期的結果豫尽。由于定義塊存在嵌套關系篙梢,
因此很容易遺漏結尾處的花括號,這點需要特別注意美旧。
二渤滞、VRRP實例定義塊
vrrp_sync_group:同步vrrp級贬墩,用于確定失敗切換(FailOver)包含的路由實例個數。
即在有2個負載均衡器的場景蔼水,一旦某個負載均衡器失效震糖,需要自動切換到另外一個負載均衡器的實例是哪
group:至少要包含一個vrrp實例,vrrp實例名稱必須和vrrp_instance定義的一致
vrrp_instance:vrrp實例名
1> state:實例狀態(tài)趴腋,只有MASTER 和 BACKUP兩種狀態(tài)吊说,并且需要全部大寫。
搶占模式下优炬,其中MASTER為工作狀態(tài)颁井,BACKUP為備用狀態(tài)。當MASTER所在的服務器失效時蠢护,
BACKUP所在的服務會自動把它的狀態(tài)由BACKUP切換到MASTER狀態(tài)雅宾。
當失效的MASTER所在的服務恢復時,BACKUP從MASTER恢復到BACKUP狀態(tài)葵硕。
2> interface:對外提供服務的網卡接口眉抬,即VIP綁定的網卡接口。
如:eth0懈凹,eth1蜀变。當前主流的服務器都有2個或2個以上的接口(分別對應外網和內網),在選擇網卡接口時介评,一定要核實清楚库北。
3> mcast_src_ip:本機IP地址
4> virtual_router_id:虛擬路由的ID號,每個節(jié)點設置必須一樣们陆,
可選擇IP最后一段使用寒瓦,相同的 VRID 為一個組,他將決定多播的 MAC 地址坪仇。
5> priority:節(jié)點優(yōu)先級杂腰,取值范圍0~254,MASTER要比BACKUP高
6> advert_int:MASTER與BACKUP節(jié)點間同步檢查的時間間隔椅文,單位為秒
7> lvs_sync_daemon_inteface:負載均衡器之間的監(jiān)控接口,
類似于 HA HeartBeat 的心跳線颈墅。但它的機制優(yōu)于 Heartbeat,因為它沒有“裂腦”這個問題,
它是以優(yōu)先級這個機制來規(guī)避這個麻煩的雾袱。在 DR 模式中,
lvs_sync_daemon_inteface與服務接口interface使用同一個網絡接口
8> authentication:驗證類型和驗證密碼官还。類型主要有 PASS芹橡、AH 兩種,通常使用PASS類型望伦,
據說AH使用時有問題林说。驗證密碼為明文煎殷,同一vrrp 實例MASTER與BACKUP使用相同的密碼才能正常通信。
9> smtp_alert:有故障時是否激活郵件通知
10> nopreempt:禁止搶占服務腿箩。默認情況豪直,當MASTER服務掛掉之后,
BACKUP自動升級為MASTER并接替它的任務珠移,當MASTER服務恢復后弓乙,
升級為MASTER的BACKUP服務又自動降為BACKUP,
把工作權交給原MASTER钧惧。當配置了nopreempt暇韧,
MASTER從掛掉到恢復,不再將服務搶占過來浓瞪。
11> virtual_ipaddress:虛擬IP地址池懈玻,可以有多個IP,每個IP占一行乾颁,不需要指定子網掩碼涂乌。注意:這個IP必須與我們的設定的vip保持一致。
三英岭、虛擬服務器virtual_server定義塊
virtual_server:定義一個虛擬服務器湾盒,這個ip是virtual_ipaddress中定義的其中一個,后面一個空格巴席,然后加上虛擬服務的端口號历涝。
1> delay_loop:健康檢查時間間隔推盛,單位:秒
2> lb_algo:負載均衡調度算法烛缔,互聯(lián)網應用常用方式為wlc或rr
3> lb_kind:負載均衡轉發(fā)規(guī)則。包括DR驾中、NAT赵刑、TUN 3種分衫,一般使用路由(DR)轉發(fā)規(guī)則。
4> persistence_timeout:http服務會話保持時間般此,單位:秒
5> protocol:轉發(fā)協(xié)議蚪战,分為TCP和UDP兩種
real_server:真實服務器IP和端口,可以定義多個
1> weight:負載權重铐懊,值越大邀桑,轉發(fā)的優(yōu)先級越高
2> notify_down:服務停止后執(zhí)行的腳本
3> TCP_CHECK:服務有效性檢測
* connect_port:服務連接端口
* connect_timeout:服務連接超時時長,單位:秒
* nb_get_retry:服務連接失敗重試次數
* delay_before_retry:重試連接間隔科乎,單位:秒