Keepalived+Nginx實(shí)現(xiàn)高可用Web負(fù)載均衡

一、需求場(chǎng)景:

Paste_Image.png

通過(guò)之前的一篇文章:
Nginx+Tomcat實(shí)現(xiàn)負(fù)載均衡,我們已經(jīng)能通過(guò)Nginx來(lái)實(shí)現(xiàn)Tomcat應(yīng)用的負(fù)載均衡,但是單個(gè)的Nginx會(huì)存在單點(diǎn)隱患,如果Nginx掛掉,那么全部的Tomcat應(yīng)用都將變得不可用,所以實(shí)現(xiàn)Nginx的高可用是必不可少的一步。

二、Keepalived 簡(jiǎn)要介紹

Keepalived 是一種高性能的服務(wù)器高可用或熱備解決方案,Keepalived 可以用來(lái)防止服務(wù)器單點(diǎn)故障的發(fā)生,通過(guò)配合 Nginx 可以實(shí)現(xiàn) web 前端服務(wù)的高可用。
Keepalived 以 VRRP 協(xié)議為實(shí)現(xiàn)基礎(chǔ),用 VRRP 協(xié)議來(lái)實(shí)現(xiàn)高可用性(HA)。VRRP(Virtual RouterRedundancy Protocol)協(xié)議是用于實(shí)現(xiàn)路由器冗余的協(xié)議,
VRRP 協(xié)議將兩臺(tái)或多臺(tái)路由器設(shè)備虛擬成一個(gè) 設(shè)備,對(duì)外提供虛擬路由器 IP(一個(gè)或多個(gè)),而在路由器組內(nèi)部,如果實(shí)際擁有這個(gè)對(duì)外 IP 的路由器如果工作正常的話就是 MASTER,
或者是通過(guò)算法選舉產(chǎn)生,MASTER 實(shí)現(xiàn)針對(duì)虛擬路由器 IP 的各種網(wǎng)絡(luò)功能, 如 ARP 請(qǐng)求,ICMP,以及數(shù)據(jù)的轉(zhuǎn)發(fā)等;其他設(shè)備不擁有該虛擬 IP,狀態(tài)是 BACKUP,
除了接收 MASTER 的 VRRP 狀態(tài)通告信息外,不執(zhí)行對(duì)外的網(wǎng)絡(luò)功能。當(dāng)主機(jī)失效時(shí),BACKUP 將接管原先 MASTER 的網(wǎng)絡(luò)功能。
VRRP 協(xié)議使用多播數(shù)據(jù)來(lái)傳輸 VRRP 數(shù)據(jù),VRRP 數(shù)據(jù)使用特殊的虛擬源 MAC 地址發(fā)送數(shù)據(jù)而不是自身 網(wǎng)卡的 MAC 地址,VRRP 運(yùn)行時(shí)只有 MASTER 路由器定時(shí)發(fā)送 VRRP 通告信息,
表示 MASTER 工作正常以及虛 擬路由器 IP(組),BACKUP 只接收 VRRP 數(shù)據(jù),不發(fā)送數(shù)據(jù),如果一定時(shí)間內(nèi)沒(méi)有接收到 MASTER 的通告信 息,各 BACKUP 將宣告自己成為 MASTER,
發(fā)送通告信息,重新進(jìn)行 MASTER 選舉狀態(tài)。


三、環(huán)境以及方案規(guī)劃

Paste_Image.png

四、Nginx的安裝(在192.168.31.146和192.168.31.154中分別安裝Nginx,安裝用戶:root)

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)到/usr/local/src目錄

<p>

3、編譯安裝Nginx

進(jìn)入Nginx的上傳目錄:
# cd /usr/local/src/
解壓安裝包:
# tar -zxvf nginx-1.6.2.tar.gz
進(jìn)入解壓后的文件夾:
# cd nginx-1.6.2
指定編譯位置:
# ./configure --prefix=/usr/local/nginx
編譯:
# make && make install

4、配置Nginx

通過(guò)修改/conf/nginx.conf文件來(lái)修改Nginx的配置信息
# vi /usr/local/nginx/conf/nginx.conf

5、系統(tǒng)防火墻中打開(kāi)對(duì)應(yīng)的端口80(默認(rèn)80)

# vi /etc/sysconfig/iptables
添加:
## nginx -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
添加后重啟防火墻:
# service iptables restart

6、檢測(cè)Nginx的配置文件是否正確。建議每次修改/conf/nginx.conf文件之后,都手動(dòng)執(zhí)行該命令以檢測(cè)此次修改的正確性

# /usr/local/nginx/sbin/nginx -t
出現(xiàn)以下信息,代表成功
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、啟動(dòng)Nginx

# /usr/local/nginx/sbin/nginx
通過(guò)http://ip可以訪問(wèn)nginx的默認(rèn)頁(yè)面

Paste_Image.png

查看Nginx進(jìn)程
# ps -ef|grep nginx
停止Nginx
# /usr/local/nginx/sbin/nginx -s stop
重啟Nginx
# /usr/local/nginx/sbin/nginx -s reload

8、設(shè)置Nginx開(kāi)機(jī)啟動(dòng)

編輯/etc下的rc.local文件
# vi /etc/rc.local
添加:
/usr/local/nginx/sbin/nginx

五、Keepalived的安裝

1、上傳或下載 keepalived(keepalived-1.2.18.tar.gz)到 /usr/local/src 目錄

2、解壓安裝
進(jìn)入安裝包目錄:
# cd /usr/local/src/
解壓:
# tar -zxvf keepalived-1.2.18.tar.gz
進(jìn)入解壓后的目錄:
# cd keepalived-1.2.18
指定編譯路徑:
# ./configure --prefix=/usr/local/keepalived
編譯安裝:
# make && make install

3、將keepalived安裝成Linux系統(tǒng)服務(wù)
因?yàn)闆](méi)有使用keepalived的默認(rèn)路徑安裝(默認(rèn)是/usr/local),安裝完成后,需要手動(dòng)復(fù)制默認(rèn)的配置文件到默認(rèn)路徑
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
復(fù)制keepalived服務(wù)腳本到默認(rèn)的地址
# 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ù)開(kāi)機(jī)啟動(dòng)
# chkconfig keepalived on

4、修改keepalived配置文件
# vi /etc/keepalived/keepalived.conf
配置說(shuō)明:
<pre><code>
! Configuration File for keepalived
global_defs {

keepalived 自帶的郵件提醒需要開(kāi)啟 sendmail 服務(wù)。建議用獨(dú)立的監(jiān)控或第三方 SMTP

router_id edu-proxy-01 ## 標(biāo)識(shí)本節(jié)點(diǎn)的字條串,通常為 hostname }

keepalived 會(huì)定時(shí)執(zhí)行腳本并對(duì)腳本執(zhí)行的結(jié)果進(jìn)行分析,動(dòng)態(tài)調(diào)整 vrrp_instance 的優(yōu)先級(jí)。如果 腳本執(zhí)行結(jié)果為 0,并且 weight 配置的值大于 0,則優(yōu)先級(jí)相應(yīng)的增加。如果腳本執(zhí)行結(jié)果非 0,并且 weight 配置的值小于 0,則優(yōu)先級(jí)相應(yīng)的減少。其他情況,維持原本配置的優(yōu)先級(jí),即配置文件中 priority 對(duì)應(yīng) 的值。

vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" interval 2 ## 檢測(cè)時(shí)間間隔
weight -20 ## 如果條件成立,權(quán)重-20
}

檢測(cè) nginx 狀態(tài)的腳本路徑

定義虛擬路由,VI_1 為虛擬路由的標(biāo)示符,自己定義名稱

vrrp_instance VI_1 {
state MASTER ## 主節(jié)點(diǎn)為 MASTER,對(duì)應(yīng)的備份節(jié)點(diǎn)為 BACKUP
interface eth1 ## 綁定虛擬 IP 的網(wǎng)絡(luò)接口,與本機(jī) IP 地址所在的網(wǎng)絡(luò)接口相同,我的是 eth1 virtual_router_id 51 ## 虛擬路由的 ID 號(hào),兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣,可選 IP 最后一段使用, 相同的 VRID 為一個(gè)組,他將決定多播的 MAC 地址,eth1值的獲取可以在機(jī)器上執(zhí)行ifconfig命令得到
mcast_src_ip 192.168.1.51 ## 本機(jī) IP 地址
priority 100 ## 節(jié)點(diǎn)優(yōu)先級(jí),值范圍 0-254,MASTER 要比 BACKUP 高 nopreempt ## 優(yōu)先級(jí)高的設(shè)置 nopreempt 解決異常恢復(fù)后再次搶占的問(wèn)題 advert_int 1 ## 組播信息發(fā)送間隔,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣,默認(rèn) 1s ## 設(shè)置驗(yàn)證信息,兩個(gè)節(jié)點(diǎn)必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實(shí)生產(chǎn),按需求對(duì)應(yīng)該過(guò)來(lái) }

將 track_script 塊加入 instance 配置塊

track_script {
chk_nginx ## 執(zhí)行 Nginx 監(jiān)控的服務(wù)
}

虛擬 IP 池, 兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣

virtual_ipaddress {
192.168.1.50 ## 虛擬 ip,可以定義多個(gè)
} }</code></pre>
附錄:
192.168.31.146(MASTER節(jié)點(diǎn))的keepalived.conf

! Configuration File for keepalived global_defs { router_id dreyer-zk-03 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 146 mcast_src_ip 192.168.31.146 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.31.111 } }
192.168.31.154(BACKUP節(jié)點(diǎn))的keepalived.conf
! Configuration File for keepalived global_defs { router_id dreyer-zk-01 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 146 mcast_src_ip 192.168.31.154 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.31.111 } }
nginx_check.sh(Nginx狀態(tài)檢測(cè)腳本)
#!/bin/bash A=ps -C nginx –no-header |wc -lif [ $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
腳本大意為:檢查是否有nginx進(jìn)程,如果沒(méi)有,那么就啟動(dòng)nginx,啟動(dòng)后睡眠2秒,再檢查是否有nginx的進(jìn)程,如果沒(méi)有的話,那么就殺掉keepalived的全部進(jìn)程(殺掉進(jìn)程后keepalived才能進(jìn)行重新選舉)

6、啟動(dòng)keepalived
# service keepalived start
出現(xiàn)以下,代表啟動(dòng)成功
Starting keepalived: [ OK ]

7、進(jìn)行高可用測(cè)試
7.1、關(guān)于虛擬IP
在192.168.31.146中執(zhí)行ip add命令查看
[root@MiWiFi-R1CM sbin]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:34:1c:e2 brd ff:ff:ff:ff:ff:ff inet 192.168.31.146/24 brd 192.168.31.255 scope global eth0 inet 192.168.31.111/32 scope global eth0 inet6 fe80::20c:29ff:fe34:1ce2/64 scope link valid_lft forever preferred_lft forever
在192.168.31.154中執(zhí)行ip add命名查看
[root@MiWiFi-R1CM conf]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:64:3d:2a brd ff:ff:ff:ff:ff:ff inet 192.168.31.154/24 brd 192.168.31.255 scope global eth0 inet 192.168.31.111/32 scope global eth0 inet6 fe80::20c:29ff:fe64:3d2a/64 scope link valid_lft forever preferred_lft forever
從輸出信息中,我們可以知道146和154機(jī)器上都有192.168.31.111這個(gè)虛擬IP,這個(gè)IP是由keepalived虛擬出來(lái)的(keepalived.conf中有配置),關(guān)掉一臺(tái)機(jī)器的keepalived再執(zhí)行ip add命令,那么192.168.31.111這個(gè)虛擬IP將不存在。我們可以通過(guò)192.168.31.111這個(gè)虛擬IP來(lái)訪問(wèn)146和154這兩臺(tái)機(jī)器,其中哪臺(tái)機(jī)器是master,虛擬IP就會(huì)映射到哪個(gè)地址。

7.2、我們修改兩個(gè)nginx的首頁(yè)信息,在首頁(yè)中加入各自的IP地址
# vi /usr/local/nginx/html/index.html

7.3、高可用切換

Paste_Image.png

我們可以看到由于146被我們?cè)O(shè)置為master,所以192.168.31.111這個(gè)虛擬IP會(huì)漂移到146這臺(tái)機(jī)器上,那我們把146的keepalived關(guān)掉再看。
停止keepalived:
# service keepalived stop

Paste_Image.png

這個(gè)時(shí)候192.168.31.111這個(gè)虛擬IP已經(jīng)漂移到154這個(gè)機(jī)器上了。
那如果我們?cè)賹?46的keepalived啟動(dòng),那192.168.31.111就會(huì)漂移到146這個(gè)機(jī)器上。
結(jié)論:通過(guò)keepalived來(lái)實(shí)現(xiàn)同一個(gè)虛擬IP映射到兩臺(tái)Nginx代理服務(wù)器,如果主服務(wù)器掛掉或者主服務(wù)器的keepalived掛掉又或者主服務(wù)器的Nginx掛掉(Nginx掛掉后會(huì)殺死keepalived的進(jìn)程,在腳本中有控制)那從服務(wù)器的keepalived會(huì)檢測(cè)到并會(huì)接管原先MASTER的網(wǎng)絡(luò)功能,這種方式來(lái)實(shí)現(xiàn)Nginx的高可用性(如上文中的keepalived簡(jiǎn)要介紹)

8、關(guān)于Nginx實(shí)現(xiàn)Tomcat應(yīng)用的負(fù)載均衡可以參考另一篇文章:http://www.itdecent.cn/p/3bac2861bd09

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容