大數據教程(2.13):keepalived+nginx(多主多活)高可用集羣搭建教程【自動化腳本】

    上一章節博主爲你們介紹了目前大型互聯網項目的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多主多活架構搭建的全過程,若是你們以爲博主的文章還不錯,請點贊;若是您對博主其它服務器技術或者博主本人感興趣,請關注博主博客,而且歡迎隨時跟博主溝通交流。

相關文章
相關標籤/搜索