Nginx+keepalive做雙機熱備(主主模式)實現負載均衡

keepalive:

    簡單一點來說,keepalive就是一個在TCP中可以檢測死連接的機制。

    原理:

    keepalive的原理很簡單,TCP會在空閒的時候發送數據給對方:

    如果主機可達,對方就會響應ACK應答,就會認爲是該主機是存活的;

    如果主機可達,但應用程序退出,對方就會發RST應答,發送TCP撤銷連接;

    如果可達,但應用程序崩潰了,對方主機就會發送FIN消息;

    如果對方主機不響應ACK、RST,則會繼續發送,直到超時,就會撤銷連接。(默認是2個小時)

雙機熱備:

        特指基於高可用系統中的兩臺服務器的熱備(或高可用)。

        雙機高可用按工作中的切換方式分爲:主-備方式(Active-Standby方式)和雙主機方式(Active-Active方式),主-備方式即指的是一臺服務器處於某種業務的激活狀態(即Active狀態),另一臺服務器處於該業務的備用狀態(即Standby狀態)。而雙主機方式即指兩種不同業務分別在兩臺服務器上互爲主備狀態(即Active-Standby和Standby-Active狀態)。


開始搭建實驗環境(CentOS 7)


一、大致拓撲圖:


a32eba90c0bf79ff9ff129ce4229d9f5.jpg-wh_

拓撲圖



主機ip地址主機角色vip
keepalive-110.0.0.11keepalive+Nginx

vip1:10.0.0.100

vip2:10.0.0.200

keepalive-210.0.0.12keepalive+Nginx
web-110.0.0.13web服務器
web-210.0.0.14web服務器

說明:

負載均衡器(keepalive-1):

10.0.0.11(通過keepalived配置了vip:10.0.0.100和10.0.0.200供外使用)
負載均衡器(keepalive-2):

10.0.0.12(通過keepalived配置了VIP:10.0.0.100和10.0.0.200供外使用)

後端代理的web服務器(這裏爲了簡單就使用Apache作爲web服務):
10.0.0.13:80(web-1)
10.0.0.14:80(web-2)


二、實驗步驟:


2.1、先弄好各主機的配置

    1、配好ip地址,把selinux設置爲disabled,在這裏,我把firewalld防火牆也關掉了,設置爲開機不啓動,把yum源配置爲阿里雲的源。

    2、在web-1和web-2,先用yum裝好Apache服務,並配置好網頁,這裏就不寫出來了。

    3、爲防止各臺主機的時間不同步,在這裏先同步一下時間

    yum install -y ntpdate
    ntpdate -u 0.pool.ntp.org


2.2、在主機keepalive-1和keepalive-2上安裝Nginx和keepalive(注:Nginx是源碼編譯安裝的)

    1、安裝軟件依賴包:

    yum-y groupinstall "Development Tools" "Server PlatformDeveopment"
    yum-y install openssl-devel pcre-devel

    2、下載Nginx安裝包

     cd /usr/local/src
     yum install -y wget
     wget http://nginx.org/download/nginx-1.2.8.tar.gz

    3、添加Nginx用戶和解壓Nginx安裝包

      useradd nginx
      cd /usr/local/src
      tar zxvf nginx-1.2.8.tar.gz
      cd nginx-1.2.8

    4、安裝nginx包

        
       ./configure--prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module--with-http_flv_module --with-http_stub_status_module--with-http_gzip_static_module --with-pcre

    5、開始編譯    

       make  && make install

    6、編譯完成後,我們就可以啓動Nginx了

        /usr/local/nginx/sbin/nginx -t   ##檢測Nginx配置是否正確
        /usr/local/nginx/sbin/nginx      ##啓動Nginx
        ##注:
        ##如果Nginx進程已經存在了,則可以先殺死該進程再啓動
        ps -ef | grep nginx | awk '{print $2}'| xargs kill -9

    7、啓動成功後,我們就可以看到以下的web頁面了

f9a8df6126f4eec5ad29cfd48073e314.png-wh_

       到此Nginx就已經編譯安裝完成了。

    8、然後開始配置Nginx反向代理服務。

         vim /usr/local/nginx/conf/nginx.conf
         ##找到server,並在server前面添加upstream,配置如下:
         upstream web{
                 server 10.0.0.13:80  max_fails=3 fail_timeout=20s weight=2;
                 server 10.0.0.14:80  max_fails=3 fail_timeout=20s weight=2;
         }
         server {
                 listen       80;
                 server_name  localhost;
                 #charset koi8-r;
                 #access_log logs/host.access.log  main;
                 location / {
                 #    root   html;
                 #    index  index.html index.htm;
                 proxy_pass http://web;               
                 proxy_set_header Host $host;  
                 proxy_set_header X-Real-IP $remote_addr;  
                 proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;  
                 }
          }

       然後檢查配置是否正確,如果沒有錯誤就重新讀取Nginx的配置文件(如果之前沒有啓動Nginx,就直接啓動Nginx就好了)

          [root@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -t
          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
          [root@keepalive-1 ~]# /usr/local/nginx/sbin/nginx -s reload

           訪問Nginx,查看Nginx反向代理是否成功(Nginx反向代理成功)     

            [root@keepalive-1 ~]# curl 10.0.0.11

            It is web1

            [root@keepalive-1 ~]# curl 10.0.0.11

            It is web2

            [root@keepalive-1 ~]# curl 10.0.0.11

            It is web1

            [root@keepalive-1 ~]# curl 10.0.0.11

            It is web2

       到此Nginx就算配置好了,另外一臺(keepalive-2)也是一樣的配置。


2.3、開始配置keepalive

    安裝keepalive(這裏使用yum安裝就好了) 

   yum install -y keepalived

    開始配置keepalive文件(可以把原來的配置文件重命名爲.bak作爲備份,重新編輯一份配置文件)       

    ##主機keepalive-1的配置文件:
    [root@keepalive-1 ~]# cat /etc/keepalived/keepalived.conf  ##主機keepalive-1
    ! Configuration File for keepalived    
    global_defs {  
       notification_email {
         [email protected]
         #[email protected]
         #[email protected]
       }
    }       
    vrrp_script nginx_check {     ##定義監控Nginx的腳本
        script "/etc/keepalived/nginx_check.sh" 
        interval 1    ##沒1s檢測一次
        weight -5     ##優先級減去5
        fall 2                   
        rise 1
    }   
    vrrp_instance VI_1 {        ##定義vrrptest實例
        state MASTER            ##服務器狀態
        interface ens33         ##使用的接口
        virtual_router_id 51    ##虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換
        priority 150            ##服務啓動優先級,值越大,優先級越高,BACKUP 不能大於MASTER
        advert_int 1            ##服務器之間的存活檢查時間
        authentication {
            auth_type PASS      ##認證類型 
            auth_pass 123456    ##認證密碼,一組lvs 服務器的認證密碼必須一致   
        }
        virtual_ipaddress {     ##虛擬IP地址
            10.0.0.100  
        }
        track_script {           ##執行監控nginx進程的腳本
            nginx_check
        }
    }
    vrrp_instance VI_2 {
        state BACKUP
        interface ens33
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            10.0.0.200     
        }
        track_script {
            nginx_check
        }
    }
    ##主機keepalive-2的配置文件:
    [root@keepalive-1 ~]# cat /etc/keepalived/keepalived.conf  ##主機keepalive-2
    ! Configuration File for keepalived    
    global_defs {  
       notification_email {
         [email protected]
         #[email protected]
         #[email protected]
       }
    }       
    vrrp_script nginx_check {     ##定義監控Nginx的腳本
        script "/etc/keepalived/nginx_check.sh" 
        interval 1    ##沒1s檢測一次
        weight -5     ##優先級減去5
        fall 2                   
        rise 1
    }   
    vrrp_instance VI_1 {        ##定義vrrptest實例
        state BACKUP            ##服務器狀態
        interface ens33         ##使用的接口
        virtual_router_id 51    ##虛擬路由的標誌,一組lvs的虛擬路由標識必須相同,這樣才能切換
        priority 100            ##服務啓動優先級,值越大,優先級越高,BACKUP 不能大於MASTER
        advert_int 1            ##服務器之間的存活檢查時間
        authentication {
            auth_type PASS      ##認證類型 
            auth_pass 123456    ##認證密碼,一組lvs 服務器的認證密碼必須一致   
        }
        virtual_ipaddress {     ##虛擬IP地址
            10.0.0.100  
        }
        track_script {           ##執行監控nginx進程的腳本
            nginx_check
        }
    }    vrrp_instance VI_2 {
        state MASTER
        interface ens33
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            10.0.0.200     
        }
        track_script {
            nginx_check
        }
    }

    配置Nginx檢查腳本,如果Nginx服務停掉了,自動關掉keepalive服務

   [root@keepalive-1 ~]# cat /etc/keepalived/nginx_check.sh 
    #!/bin/bash
    HOST=`hostname`
    [email protected]          ##自己的郵箱地址
    date=`date "+%F %H:%M:%S"`
    pgrep nginx
    if [ "$?" -ne "0" ]
    then
        systemctl stop keepalived
        echo "Your nginx:$HOST in $date is dowm" | mail -s "Your nginx is dowm" $mail
    fi
    
    chmod a+x /etc/keepalived/nginx_check.sh
    
    ##加入計劃任務
    crontab -e
    */1 * * * *  bash /etc/keepalived/nginx_check.sh >> /dev/null

    在兩臺主機分別啓動keepalive,可以看到VIP已經起來了


5e4427131d490f4a7ed369997e2d02ef.png-wh_

主機keepalive-1

827f0b0f0b478b2f2d4d7a2a5400260e.png-wh_

主機keepalive-2

    至此,所有服務就已經配置完成了,接下來就剩下測試了。


三、測試


1、先檢查一下寫的檢查Nginx服務啓用的腳本是否能夠正常使用

   [root@keepalive-1 ~]# bash -x /etc/keepalived/nginx_check.sh 
    ++ hostname
    + HOST=keepalive-1
    + [email protected]
    ++ date '+%F %H:%M:%S'
    + date='2017-10-22 17:21:36'
    + pgrep nginx
    999
    1005
    + '[' 0 -ne 0 ']'

    經檢查發現,該腳本是可以使用的(這裏我並沒有把Nginx服務停掉來測試)


2、在正常情況下使用vip來訪問web服務,我們發現是可以正常訪問的。

    [root@localhost ~]# curl 10.0.0.100
    It is web1
    [root@localhost ~]# curl 10.0.0.100
    It is web2
    [root@localhost ~]# curl 10.0.0.100
    It is web1
    [root@localhost ~]# curl 10.0.0.100
    It is web2
    [root@localhost ~]# 
    [root@localhost ~]# curl 10.0.0.200
    It is web1
    [root@localhost ~]# curl 10.0.0.200
    It is web2
    [root@localhost ~]# curl 10.0.0.200
     is web1
    [root@localhost ~]# curl 10.0.0.200
    It is web2


3、當我們把主機keepalive-1的Nginx服務停掉時,可以看到主機keepalive-1的keepalive服務已經停掉了,並且vip也遷移到了主機keepalive-2上了,主機keepalive-2出現了兩個vip,並且此時也還是能正常訪問web頁面,說明我們的實驗做成功了。

87c2e5868d4b4a7b371f5d3c156d6bd7.png-wh_

主機keepalive-1

c55921bf7bc1b8642c82cfc7ebde4c5d.png-wh_

主機keepalive-2

    訪問web頁面

    [root@localhost ~]# curl 10.0.0.100
    It is web1
    [root@localhost ~]# curl 10.0.0.100
    It is web2
    [root@localhost ~]# curl 10.0.0.100
    It is web1
    [root@localhost ~]# curl 10.0.0.100
    It is web2
    [root@localhost ~]# 
    [root@localhost ~]# curl 10.0.0.200
    It is web1
    [root@localhost ~]# curl 10.0.0.200
    It is web2
    [root@localhost ~]# curl 10.0.0.200
    It is web1
    [root@localhost ~]# curl 10.0.0.200
    It is web2


    到這裏,我們這次Nginx+keepalive雙主機熱備做負載均衡的實驗就結束了。











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章