上一章節博主爲你們介紹了目前大型互聯網項目的keepalived+nginx(主備)高可用系統架構體系,相信你們應該看了博主的文章對keepalived/nginx技術已經有必定的瞭解,在本節博主將爲你們分享keepalived+nginx(多主多活)高可用架構體系的相關技術以及配置過程。nginx
因爲前面的文章已經介紹了keepalived、nginx的安裝過程,本節就再也不重複累贅,直接開始講多活的配置以及自動化腳本監控內容。shell
配置步驟(本次以三臺nginx服務器的三主配置爲例):bash
1、先按照前一章節安裝好keepalived、nginx等軟件服務器
2、keepalived修改配置文件網絡
(2.1)第一臺服務器架構
keepalived.config配置文件(目錄/etc/keepalived/keepalived.conf)ssh
! Configuration File for keepalived global_defs { } vrrp_script chk_nginx { #script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" script "/usr/local/keepalived/sbin/check_ng_pid.sh" interval 1 #每隔1秒執行上述的腳本,去檢查用戶的程序ngnix weight -10 } vrrp_instance VI_1 { state MASTER #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 52 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 200 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.191/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } vrrp_instance VI_2 { state BACKUP #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 53 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 150 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.192/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } vrrp_instance VI_3 { state BACKUP #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 54 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 100 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.193/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" }
(2.2)第二臺服務器ide
keepalived.config配置文件(目錄/etc/keepalived/keepalived.conf)工具
! Configuration File for keepalived global_defs { } vrrp_script chk_nginx { #script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" script "/usr/local/keepalived/sbin/check_ng_pid.sh" interval 1 #每隔1秒執行上述的腳本,去檢查用戶的程序ngnix weight -10 } vrrp_instance VI_1 { state BACKUP #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 52 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 100 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.191/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } vrrp_instance VI_2 { state MASTER #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 53 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 200 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.192/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } vrrp_instance VI_3 { state BACKUP #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 54 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 150 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.193/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" }
(2.3)第三臺服務器oop
keepalived.config配置文件(目錄/etc/keepalived/keepalived.conf)
! Configuration File for keepalived global_defs { } vrrp_script chk_nginx { #script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" script "/usr/local/keepalived/sbin/check_ng_pid.sh" interval 1 #每隔1秒執行上述的腳本,去檢查用戶的程序ngnix weight -10 } vrrp_instance VI_1 { state BACKUP #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 52 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 150 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.191/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } vrrp_instance VI_2 { state BACKUP #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 53 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 100 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.192/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" } vrrp_instance VI_3 { state MASTER #指定A節點爲主節點 備用節點上設置爲BACKUP便可 interface eth0 #綁定虛擬IP的網絡接口 virtual_router_id 54 #VRRP組名,在同一個instance中一致,在整個vrrp中惟一,以指明各個節點屬於同一VRRP組 priority 200 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { #指定虛擬IP,同一個instance中一致,整個vrrp中惟一 192.168.29.193/24 #若是兩個nginx的ip分別是192.168.33.61,,...62,則此處的虛擬ip跟它倆同一個網段便可 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" }
(2.4)每臺服務器上都須要的腳本,全部腳本都須要有執行權限:chmod 777 /usr/local/keepalived/sbin/notify.sh
通知腳本配置/usr/local/keepalived/sbin/notify.sh
#!/bin/bash case "$1" in master) /usr/local/nginx/sbin/nginx exit 0 ;; backup) /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx exit 0 ;; fault) /usr/local/nginx/sbin/nginx -s stop exit 0 ;; *) echo 'Usage: notify.sh {master|backup|fault}' exit 1 ;; esac
nginx服務檢查腳本/usr/local/keepalived/sbin/check_ng_pid.sh
#監控nginx進程,若nginx主進程不存在則啓動nginx # 若5s後nginx進程仍是不存在的話kill掉keepalived進程,防止nginx沒運行該主機的keepalived還接管虛擬IP #!/bin/bash SERVER=127.0.0.1 PASSWORD=hadoop #獲取ssh公鑰 get_rsa(){ expect -c "set timeout -1; spawn ssh-keygen -t rsa; expect { *Enter* {send -- \r;exp_continue;} {Overwrite (y/n)*} {send -- n\r;exp_continue} eof {exit 0;} }"; } auto_ssh_copy_id() { expect -c "set timeout -1; spawn ssh-copy-id $1; expect { *(yes/no)* {send -- yes\r;exp_continue;} *assword:* {send -- $2\r;exp_continue;} # *ERROR: No identities found* {get_rsa;ssh_copy_id_to_all ;exp_continue; } eof {exit 0;} }"; } ssh_copy_id_to_all() { auto_ssh_copy_id $SERVER $PASSWORD } #在遠程主機上執行delay_stop.sh execute_sh(){ expect -c "set timeout -1; spawn ssh root@$SERVER nohup /usr/local/keepalived/sbin/delay_stop.sh > /dev/null 2>&1 & expect { *(yes/no)* {send -- yes\r;exp_continue;} *password:* {send -- $1\r;exp_continue;} eof {exit 0;} }"; } get_rsa ssh_copy_id_to_all c1=`netstat -antp |grep -v grep |grep nginx |wc -l` if [ $c1 -eq 0 ]; then #/usr/local/nginx/sbin/nginx #sleep 2 c2=`netstat -antp |grep -v grep |grep nginx |wc -l` if [ $c2 -eq 0 ]; then execute_sh $PASSWORD # ssh root@$SERVER > /dev/null 2>&1 <<eeooff #nohup service keepalived stop & # nohup /usr/local/keepalived/sbin/delay_stop.sh > /dev/null 2>&1 & # exit #eeooff exit 0 # ssh root@$SERVER "/etc/init.d/keepalived stop" > /usr/local/keepalived/sbin/a.txt # service keepalived stop # killall keepalived # /etc/init.d/keepalived stop #ps -ef | grep keepalived | grep -v grep | awk '{print $8}' | xargs kill else exit 0 fi else exit 0 fi
關閉keepalived服務,實現vip飄移的腳本/usr/local/keepalived/sbin/delay_stop.sh
#bin/bash sleep 3 ssh root@127.0.0.1 service keepalived stop #service keepalived stop
(2.5)配置好,檢查openssh-server、openssh-clients、expect(自動化腳本中使用命令)是否已經安裝
#安裝ssh rpm -qa|grep openssh 查看openssh組件是否已經安裝 yum list|grep openssh 列出yum庫中可用於安裝的openssh軟件包 yum install -y openssh-server 使用yum安裝 yum install -y openssh-clients 使用yum安裝 #安裝expect rpm -qa|grep expect yum list|grep expect yum install -y expect
(2.6)啓動ssh服務,命令service sshd start,檢查root用戶是否可用鏈接
ssh root@127.0.0.1 若是報權限限制,須要改vi /etc/ssh/sshd_config,將PermitRootLogin yes 這行的註釋」#「去掉;
注意:此處博主偷懶就直接使用root用戶了,在生產環境通常會使用專門的用戶來作自動化腳本的執行。
(2.7) 測試keepalived+nginx的高可用多主多活集羣是否可用
a.停掉三臺服務器上的防火牆 :service iptables stop
b.啓動三臺服務器上的keepalived命令(keepalived會自動啓動nginx):service keepalived start
c.查看三臺服務器網卡地址vip是否綁定正常
d.關閉其中一臺服務器上的nginx服務執行命令:killall nginx,查看網卡vip綁定變化是否改變,
vip已經不在此臺服務器上,
e.訪問vip飄逸的那臺機器的虛擬vip:http://192.168.29.191,發現是能夠訪問到nginx的,說明vip已經漂移到其餘機器(可經過ip addr命令查看)
f.檢查關閉nginx的這臺服務器的keepalived進程,keepalived已經自動關閉完成漂移
g.重啓關閉的這臺keepalived,並檢查vip綁定是否回到本機
h.檢查該vip虛擬機,nginx是否可訪問:http://192.168.29.191
i.vip漂移,從新綁定都順利完成,教程結束
最後總結:因爲本章節博主在錄製教程的時候,花費了太多時間,此處就不配置防火牆了。博主在編寫腳本時遇到不少問題,都經過shell腳本調試工具解決:sh -vx check_ng_pid.sh;若是你們配置中,遇到問題,經過shell調試命令執行一次便可完成。以上是nginx多主多活架構搭建的全過程,若是你們以爲博主的文章還不錯,請點贊;若是您對博主其它服務器技術或者博主本人感興趣,請關注博主博客,而且歡迎隨時跟博主溝通交流。