目錄
項目架構
一,環境介紹
二,項目部署
在Web服務器上配置Web測試頁面
nginx負載均衡配置
配置Nginx_Master
通過vrrp_script實現對集群資源的監控(1>通過killall命令探測服務運行狀態)
通過vrrp_script實現對集群資源的監控(2、開發檢測nginx存活的shell腳本)
三,項目測試
四,實現不搶占模式
項目架構
Nginx+Keepalived實現高可用
在?Keepalived?+ Nginx 高可用負載均衡架構中,keepalived 負責實現高可用。它是一個高性能的服務器高可用或者熱備解決方案,Keepalived主要來防止服務器單點故障的發生問題,可以通過其與Nginx的配合實現Web服務器端的高可用。使用keepalived可以保證nginx的高可用,他能監控nginx的健康狀態,當nginx出現宕機時自動主備切換。
一,環境介紹
服務器名稱 | IP | 用途 |
Nginx_Master | 172.16.90.111 | 提供負載均衡 |
Nginx_Backup | 172.16.90.112 | 提供負載均衡 |
LVS-DR-VIP | 172.16.90.200 | 網站的VIP地址 |
Web1服務器 | 172.16.90.113 | 提供Web服務 |
Web2服務器 | 172.16.90.114 | 提供Web服務 |
二,項目部署
在Web服務器上配置Web測試頁面
web01配置:
cd /usr/share/nginx/html/
echo "web test page,`hostname -I`." > index.html
systemctl restart nginx
web02配置同上
nginx負載均衡配置
兩臺nginx做同樣配置
1、安裝nginx
yum install http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm
?2、配置nginx反向代理
[root@nginx_master ~]# cd /etc/nginx/conf.d/
[root@nginx_master conf.d]# mv default.conf{,.bak}
[root@nginx_master conf.d]# vim web.confupstream webpools {server 172.16.90.113;server 172.16.90.114;
}server {location / {proxy_pass http://webpools;index index.html;}
}
3,重啟nginx服務,并測試訪問nginx
nginx -t
systemctl restart nginx
客戶端訪問測試負載均衡:
for ((i=1;i<=10;i++)); do curl 172.16.90.111; done
配置Nginx_Master
安裝keepalived
yum install keepalived -y
通過vrrp_script實現對集群資源的監控(1>通過killall命令探測服務運行狀態)
配置keepalived
vim /etc/keepalived/keepalived.confvrrp_script chk_nginx {script "killall -0 nginx"#script "</dev/tcp/127.0.0.1/80"#script "if [ -f /var/run/httpd/httpd.pid ];then exit 0;else exit 1;fi"#script "/etc/keepalived/check_nginx.sh"interval 2fall 2rise 1}vrrp_instance VI_1 {state MASTERinterface ens32 //填你對應的網卡名稱virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}notify_master "/etc/keepalived/master.sh"notify_backup "/etc/keepalived/backup.sh"notify_fault "/etc/keepalived/fault.sh"track_script{chk_nginx}virtual_ipaddress {172.16.90.200/24 dev ens32}}
相關參數說明:
notify的用法:
notify_master:當當前節點成為master時,通知腳本執行任務(一般用于啟動某服務,比如 nginx,haproxy等)
notify_backup:當當前節點成為backup時,通知腳本執行任務(一般用于關閉某服務,比如nginx,haproxy等)
notify_fault:當當前節點出現故障,執行的任務;
根據提供的路徑腳本路徑,編寫提供日志記錄的腳本:
vim /etc/keepalived/master.sh
#!/bin/bash
LOGFILE=/etc/keepalived/nginx_state.log
echo "[master]" >> $LOGFILE
date >> $LOGFILEvim /etc/keepalived/backup.sh
#!/bin/bash
LOGFILE=/etc/keepalived/nginx_state.sh
echo "[backup]" >> $LOGFILE
date >> $LOGFILEvim /etc/keepalived/fault.sh
#!/bin/bash
LOGFILE=/etc/keepalived/nginx_state.log
echo "[dault]" >> $LOGFILE
date >> $LOGFILE
給文件賦予執行權限
chmod +x /etc/keepalived/*.sh
Nginx_Backup配置同上
通過vrrp_script實現對集群資源的監控(2、開發檢測nginx存活的shell腳本)
vim /etc/keepalived/check_nginx.sh#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];thensystemctl start nginxsleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
thensystemctl stop keepalivedfi
fi
給文件賦予執行權限
chmod +x /etc/keepalived/*.sh
配置keepalived
vim /etc/keepalived/keepalived.confvrrp_script chk_nginx {#script "killall -0 nginx"#script "</dev/tcp/127.0.0.1/80"#script "if [ -f /var/run/httpd/httpd.pid ];then exit 0;else exit 1;fi"script "/etc/keepalived/check_nginx.sh"interval 2fall 2rise 1}vrrp_instance VI_1 {state MASTERinterface ens32 //填你對應的網卡名稱virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}notify_master "/etc/keepalived/master.sh"notify_backup "/etc/keepalived/backup.sh"notify_fault "/etc/keepalived/fault.sh"track_script{chk_nginx}virtual_ipaddress {172.16.90.200/24 dev ens32}}
Nginx_Backup配置同上
三,項目測試
重啟主從調度的nginx和keepalived
[root@nginx_master ~]# systemctl restart nginx keepalived
[root@nginx_backup ~]# systemctl restart nginx keepalived
Master,Backup都正常,只有Master對外提供服務
[root@nginx_master ~]# ip a | grep "172.16.90.200"
inet 172.16.90.200/24 scope global ens32
Master宕機,Backup接替Master對外提供服務
模擬Master的keepalived服務器停止
[root@nginx_master ~]# systemctl stop keepalived.service
此時VIP在Backup上
[root@nginx_backup ~]# ip a | grep "172.16.90.200"
inet 172.16.90.200/24 scope global ens32
在客戶機上驗證是否Backup接管后還能實現負載均衡
for ((i=1;i<=10;i++)); do curl 172.16.90.200; done
Master恢復正常,Master繼續提供服務,Backup停止服務
模擬Master的keepalived服務恢復正常
[root@nginx_master ~]# systemctl start keepalived.service
此時VIP在Master上
[root@nginx_master ~]# ip a | grep "172.16.90.200"
inet 172.16.90.200/24 scope global ens32
四,實現不搶占模式
上述主節點一宕機,備節點就會接管,主節點修復好了,又會重新接管服務。服務的切換存在一定的風險和不穩定性,為了避免生產中多次網絡抖動,要實現不搶占模式
nopreempt 設置的是高可用集群中的不搶占功能:設置 nopreempt可以實現主節點故障恢復后不再切回到主節點,讓服務一直在備用節點下工作, 直到備用節點出現故障才會進行切換。在使用不搶占功能時,在“state” 狀態為 “BACKUP” 的節點上設置,而且這個節點的優先級必須高于其他節點
Nginx_Master上
vim /etc/keepalived/keepalived.confvrrp_script chk_nginx {#script "killall -0 nginx"#script "</dev/tcp/127.0.0.1/80"#script "if [ -f /var/run/httpd/httpd.pid ];then exit 0;else exit 1;fi"script "/etc/keepalived/check_nginx.sh"interval 2fall 2rise 1}vrrp_instance VI_1 {state BACKUP //原來的MASTER改為BACKUPinterface ens32 //填你對應的網卡名稱virtual_router_id 51priority 100nopreept //添加這行advert_int 1authentication {auth_type PASSauth_pass 1111}notify_master "/etc/keepalived/master.sh"notify_backup "/etc/keepalived/backup.sh"notify_fault "/etc/keepalived/fault.sh"track_script{chk_nginx}virtual_ipaddress {172.16.90.200/24 dev ens32}}