nginx负载均衡高可用
?
1.1?? 什么是負載均衡高可用
???????? nginx作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx服務器宕機后端web服務將無法提供服務,影響嚴重。
???????? 為了屏蔽負載均衡服務器的宕機,需要建立一個備份機。主服務器和備份機上都運行高可用(High Availability)監(jiān)控程序,通過傳送諸如“I am alive”這樣的信息來監(jiān)控對方的運行狀況。當備份機不能在一定的時間內(nèi)收到這樣的信息時,它就接管主服務器的服務IP并繼續(xù)提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。
?
?
?
1.2?? keepalived+nginx實現(xiàn)主備
1.2.1? 什么是keepalived
???????? keepalived是集群管理中保證集群高可用的一個服務軟件,用來防止單點故障。
??????? Keepalived的作用是檢測web服務器的狀態(tài),如果有一臺web服務器死機,或工作出現(xiàn)故障,Keepalived將檢測到,并將有故障的web服務器從系統(tǒng)中剔除,當web服務器工作正常后Keepalived自動將web服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。
?
1.2.2? keepalived工作原理
???????? keepalived是以VRRP協(xié)議為實現(xiàn)基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議。
???????? 虛擬路由冗余協(xié)議,可以認為是實現(xiàn)路由器高可用的協(xié)議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛擬IP地址,該路由器所在局域網(wǎng)內(nèi)其他機器的默認路由為該vip),master會發(fā)組播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據(jù)VRRP的優(yōu)先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
???????? keepalived主要有三個模塊,分別是core、check和VRRP。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。VRRP模塊是來實現(xiàn)VRRP協(xié)議的。
?
詳細參考:Keepalived權威指南中文.pdf
?
1.2.3? keepalived+nginx實現(xiàn)主備過程
?
1.2.3.1???????? 初始狀態(tài)
?
?
?
?
?
1.2.3.2???????? 主機宕機
?
?
?
1.2.3.3???????? 主機恢復
?
?
?
1.2.4? 高可用環(huán)境
兩臺nginx,一主一備:192.168.101.3和192.168.101.4
兩臺tomcat服務器:192.168.101.5、192.168.101.6
?
?
1.2.5? 安裝keepalived
?
???????? 分別在主備nginx上安裝keepalived,參考“安裝手冊”進行安裝:
?
?
1.2.6? 配置keepalived
1.2.6.1???????? 主nginx
修改主nginx下/etc/keepalived/keepalived.conf文件
?
! Configuration File for keepalived
?
#全局配置
global_defs {
?? notification_email {? #指定keepalived在發(fā)生切換時需要發(fā)送email到的對象,一行一個
???? XXX@XXX.com
?? }
? ?notification_email_from XXX@XXX.com? #指定發(fā)件人
?? #smtp_server XXX.smtp.com???????????????????????????? #指定smtp服務器地址
?? #smtp_connect_timeout 30?????????????????????????????? #指定smtp連接超時時間
?? router_id LVS_DEVEL??????????????????????????????????? #運行keepalived機器的一個標識
}
?
vrrp_instance VI_1 {
??? state MASTER?????????? #標示狀態(tài)為MASTER 備份機為BACKUP
??? interface eth0???????? #設置實例綁定的網(wǎng)卡
??? virtual_router_id 51?? #同一實例下virtual_router_id必須相同
??? priority 100?????????? #MASTER權重要高于BACKUP 比如BACKUP為99?
??? advert_int 1 ??????????#MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
??? authentication {?????? #設置認證
??????? auth_type PASS???? #主從服務器驗證方式
??????? auth_pass 8888
??? }
??? virtual_ipaddress {??? #設置vip
??????? 192.168.101.100?????? #可以多個虛擬IP,換行即可
??? }
}
?
?
1.2.6.2???????? 備nginx
修改備nginx下/etc/keepalived/keepalived.conf文件
配置備nginx時需要注意:需要修改state為BACKUP , priority比MASTER低,virtual_router_id和master的值一致
?
! Configuration File for keepalived
?
#全局配置
global_defs {
?? notification_email {? #指定keepalived在發(fā)生切換時需要發(fā)送email到的對象,一行一個
??? XXX@XXX.com
?? }
?? notification_email_from XXX@XXX.com? ??????? ???????? ???????? ???????? #指定發(fā)件人
?? #smtp_server XXX.smtp.com???????????????????????????? #指定smtp服務器地址
?? #smtp_connect_timeout 30?????????????????????????????? #指定smtp連接超時時間
?? router_id LVS_DEVEL??????????????????????????????????? #運行keepalived機器的一個標識
}
?
vrrp_instance VI_1 {
??? state BACKUP?????????? #標示狀態(tài)為MASTER 備份機為BACKUP
??? interface eth0???????? #設置實例綁定的網(wǎng)卡
?? ?virtual_router_id 51?? #同一實例下virtual_router_id必須相同
??? priority 99??????????? #MASTER權重要高于BACKUP 比如BACKUP為99?
??? advert_int 1?????????? #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
??? authentication {?????? #設置認證
??????? auth_type PASS???? #主從服務器驗證方式
??????? auth_pass 8888
??? }
??? virtual_ipaddress {??? #設置vip
??????? 192.168.101.100?????? #可以多個虛擬IP,換行即可
??? }
}
?
1.2.7? 測試
主備nginx都啟動keepalived及nginx。
service keepalived start
./nginx
?
1.2.7.1???????? 初始狀態(tài)
查看主nginx的eth0設置:
vip綁定在主nginx的eth0上。
?
?
?
查看備nginx的eth0設置:
vip沒有綁定在備nginx的eth0上。
?
?
?
訪問ccc.test.com,可以訪問。
?
1.2.7.2???????? 主機宕機
將主nginx的keepalived停止或?qū)⒅鱪ginx關機(相當于模擬宕機),查看主nginx的eth0:
eth0沒有綁定vip
?
?
注意這里模擬的是停止 keepalived進程沒有模擬宕機,所以還要將nginx進程也停止表示主nginx服務無法提供。
?
查看備nginx的eth0:
vip已經(jīng)漂移到備nginx。
?
?
?
訪問ccc.test.com,可以訪問。
?
1.2.7.3???????? 主機恢復
將主nginx的keepalived和nginx都啟動。
查看主nginx的eth0:
?
查看備nginx的eth0:
vip漂移到主nginx。
?
?
?
查看備nginx的eth0:
eth0沒有綁定vip
?
?
?
?
訪問:ccc.test.com,正常訪問。
注意:主nginx恢復時一定要將nginx也啟動(通常nginx啟動要加在開機啟動中),否則即使vip漂移到主nginx也無法訪問。
?
1.2.8? 解決nginx進程和keepalived不同時存在問題
1.2.8.1???????? 問題描述
???????? keepalived是通過檢測keepalived進程是否存在判斷服務器是否宕機,如果keepalived進程在但是nginx進程不在了那么keepalived是不會做主備切換,所以我們需要寫個腳本來監(jiān)控nginx進程是否存在,如果nginx不存在就將keepalived進程殺掉。
?
1.2.8.2???????? nginx進程檢測腳本
???????? 在主nginx上需要編寫nginx進程檢測腳本(check_nginx.sh),判斷nginx進程是否存在,如果nginx不存在就將keepalived進程殺掉,check_nginx.sh內(nèi)容如下:
?
#!/bin/bash
# 如果進程中沒有nginx則將keepalived進程kill掉
A=`ps -C nginx --no-header |wc -l`????? ## 查看是否有 nginx進程 把值賦給變量A
if [ $A -eq 0 ];then??????????????????? ## 如果沒有進程值得為 零
?????? service keepalived stop????????? ## 則結(jié)束 keepalived 進程
fi
?
將check_nginx.sh拷貝至/etc/keepalived下,
腳本測試:
將nginx停止,將keepalived啟動,執(zhí)行腳本:sh /etc/keepalived/check_nginx.sh
?
?
?
從執(zhí)行可以看出自動將keepalived進程kill掉了。
?
1.2.8.3???????? 修改keepalived.conf
修改主nginx的keepalived.conf,添加腳本定義檢測:
注意下邊紅色標識地方:
?
#全局配置
global_defs {
?? notification_email {? #指定keepalived在發(fā)生切換時需要發(fā)送email到的對象,一行一個
???? XXX@XXX.com
?? }
?? notification_email_from miaoruntu@itcast.cn? #指定發(fā)件人
?? #smtp_server XXX.smtp.com???????????????????????????? #指定smtp服務器地址
?? #smtp_connect_timeout 30? ?????????????????????????????#指定smtp連接超時時間
?? router_id LVS_DEVEL??????????????????????????????????? #運行keepalived機器的一個標識
}
vrrp_script check_nginx {
??? script "/etc/keepalived/check_nginx.sh"???????? ##監(jiān)控腳本
??? interval 2???????????????????????????????? ?????##時間間隔,2秒
??? weight 2??????????????????????????????????????? ##權重
}
vrrp_instance VI_1 {
??? state MASTER?????????? #標示狀態(tài)為MASTER 備份機為BACKUP
??? interface eth0???????? #設置實例綁定的網(wǎng)卡
??? virtual_router_id 51?? #同一實例下virtual_router_id必須相同
??? priority 100 ??????????#MASTER權重要高于BACKUP 比如BACKUP為99
??? advert_int 1?????????? #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
??? authentication {?????? #設置認證
??????? auth_type PASS???? #主從服務器驗證方式
??????? auth_pass 8888
??? }
?? track_script {
??????? check_nginx??????? #監(jiān)控腳本
?? }
??? virtual_ipaddress {??? #設置vip
??????? 192.168.101.100?????? #可以多個虛擬IP,換行即可
??? }
?
}
?
修改后重啟keepalived
?
1.2.8.4???????? 測試
回到負載均衡高可用的初始狀態(tài),保證主、備上的keepalived、nginx全部啟動。
停止主nginx服務
?
觀察keepalived日志:
tail -f /var/log/keepalived.log
?
查看keepalived進程已經(jīng)不存在。
查看eth0已經(jīng)沒有綁定vip。
?
轉(zhuǎn)載于:https://www.cnblogs.com/chinaifae/p/10576046.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的nginx负载均衡高可用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序服务(功能)直达是什么?有什么
- 下一篇: 2018视频人物识别挑战赛冠军经验分享: