華為雲中使用Vip+keepalived實現業務系統在線熱備的操作方法


一、環境:

主機名

鏡像

私有IP

虛擬IP

軟件

Nginx-serverA

CentOS7.6--64

192.168.0.72

192.168.0.100

Nginx+keepalived

Nginx-serverB

CentOS7.6--64

192.168.0.160

192.168.0.100

Nginx+keepalived

 

 

二、主機熱備架構

 

 

 

 

三、創建虛擬機安裝nginxkeepalived

1.創建虛擬機

 

 NginxA 和 NginxB

2.安裝 Nginx Keepalive 軟件(兩台機器一致)

# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# sudo yum install -y nginx

# sudo systemctl start nginx.service

# sudo systemctl enable nginx.service

# sudo yum install keepalived -y

# sudo systemctl start keepalived.service

# sudo systemctl enable keepalived.service

 

3.編寫 nginx 服務存活檢測腳本(兩台機器一致)

腳本路徑:/usr/bin/check_nginx_alive.sh

 

# vim /usr/bin/check_nginx_alive.sh

內容:

#!/bin/sh

 

PATH=/bin:/sbin:/usr/bin:/usr/sbin

 

A=`ps -C nginx --no-header |wc -l`

 

if [ $A -eq 0 ]

   then

     echo 'nginx server is died'

     killall keepalived

fi

 

修改腳本權限:

#chmod +x /usr/bin/check_nginx_alive.sh

 

4.配置keepalive(兩台機器參數不同,根據實際修改參數)

先刪除原有配置文件:

#rm –rf /etc/keepalived/keepalived.conf

然后創建並編輯文件:

#vim /etc/keepalived/keepalived.conf

內容:NginxA

################################################

vrrp_script check_nginx_alive {

    ##腳本路徑

    script "/usr/bin/check_nginx_alive.sh"

    interval 3

    weight -10

}

global_defs {

    ## 設置lvsid,在一個網絡內唯一,可以自定義,保持唯一性

    router_id LVS_DEVEL

}

 ##實例名,可修改

vrrp_instance VI_1 {

    ## 主機配置,從機為BACKUP

    state MASTER

    ## 網卡名稱,虛擬機一般都是使用eth0

interface eth0

##虛擬路由ID,兩機器保持一致即可

    virtual_router_id 51  

    ## 權重值,值越大,優先級越高,backup設置比master,這樣就能在master宕機后講backup變為master,master回復后就可以恢復.

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        ## 同一網段虛擬IP

        192.168.0.100

}

##與檢測腳本一起使用

    track_script {

        check_nginx_alive

    }

 

}

 

virtual_server 192.168.0.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind NAT

    persistence_timeout 50

    protocol TCP

 

    real_server 192.168.0.72 80 {

        weight 1

        TCP_CHECK{

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

#####################################

 

內容:NginxB

#####################################

vrrp_script check_nginx_alive {

    ##腳本路徑

    script "/usr/bin/check_nginx_alive.sh"

    interval 3

    weight -10

}

global_defs {

    ## 設置lvsid,在一個網絡內唯一,可以自定義,保持唯一性,且兩機器保持一致

    router_id LVS_DEVEL

}

 ##實例名,可修改

vrrp_instance VI_1 {

    ## 主機配置MASTER,從機為BACKUP

    state BACKUP

    ## 網卡名稱,虛擬機一般都是使用eth0

interface eth0

##虛擬路由ID,兩機器保持一致即可

    virtual_router_id 51  

    ## 權重值,值越大,優先級越高,backup設置比master,這樣就能在master宕機后講backup變為master,master回復后就可以恢復.

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        ## 同一網段虛擬IP

        192.168.0.100

}

##與檢測腳本一起使用

    track_script {

        check_nginx_alive

    }

 

}

 

virtual_server 192.168.0.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind NAT

    persistence_timeout 50

    protocol TCP

 

    real_server 192.168.0.160 80 {

        weight 1

        TCP_CHECK{

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

###############################################3

注:虛擬機IP192.168.0.100

    NignxA-IP192.168.0.72

    NignxB-IP192.168.0.160

NignxA為主master        NignxA優先級priority 100     

NignxB為備backup        NignxB優先級priority 90

 

5.修改Nginx主頁信息,便於觀察虛擬IP的漂移

# vim /usr/share/nginx/html/index.html

內容:NginxA

#########################

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx! @Node A </h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>

 

<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

 

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

#########################################

 

內容:NginxB

##############################

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx! @Node B </h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>

 

<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

 

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

############################################

 

6.重啟keepalive服務(兩機器一致)

#systemctl restart keepalived

 

本別查看兩機器的ip address

#ip address

內容nginxA:

 

 

 

 

內容nginxB:

 

 

 

 

 

可以看到虛擬IP192.168.0.100/32已經綁定到了NginxA

 

7.申請虛擬IP,並綁定虛擬機

 

 

 

 

 

 

 

 

 

四、驗證

在同一子網內創建一台windows虛擬機,並通過游覽器訪問Nginx服務器,來驗證訪問虛擬IP時是訪問的哪個主機。

 

1.初始情況虛擬IP分配到master主節點---NginxA

訪問私有IP192.168.0.72

 

 

 

訪問私有IP192.168.0.160

 

 

 

訪問虛擬IP192.168.0.100

 

 

 

結論:實驗成功,游覽器訪問虛擬IP192.168.0.100時,能夠訪問到Master主節點NginxA

 

2.關閉NginxAnginx服務,觀察虛擬IP是否漂移到NginxB

NginxA操作:

#systemctl stop nginx

 

查看NginxAip address

 

 

 

Eth0下已無虛擬IP(對比  5.重啟keepalived     中之前的圖片)

 

 

 

 

產看NginxBip address

#ip address

 

 

 

 

Eth0下除了原私有IP,還有虛擬機IP

 

訪問虛擬IP地址:

 

 

 

發現跳轉到了NginxB節點,驗證成功。

結論:master節點NginxA主機的nginx服務down掉時,虛擬機ip地址漂移到backup節點NginxB

 

3.當Master主節點NginxAnginx服務恢復時,由於NginxA的優先級高,搶占回主節點,虛擬ip又漂移回NginxA

啟動NginxAnginx服務:

#systemctl start nginx

 

 

 

產看NginxAip address

 

 

 

發現虛擬IP192.168.0.100並沒有漂移回來。

原因:需要重啟keepalived服務,因為當nginx服務down掉后,keepalived進程被腳本給殺死了,所以需要手動重啟keepalived服務,才能和備節點通信,搶回虛擬IP

 

重啟NginxAkeepalived服務並產看ip address

 

 

 

 

發現虛擬ip漂移回NginxA節點。

 

訪問虛擬IP192.168.0.100

 

 

 

虛擬IP指向了主節點NginxA,驗證成功。

結論:當主節點服務恢復時,由於主節點的優先級高,所以搶占回虛擬IP

 

五、大坑小坑

1.必須要在控制台申請虛擬IP並綁定服務器,否則虛擬IP無法訪問!

 

2.華為官網上有手動給虛擬機綁定虛擬IP的操作指導,但是不適用於Keepalived的場景,適用keepalived來實現熱備,不需要手動綁定,如果手動綁定了,那么keepalived功能不會實現自動漂移虛擬ip,虛擬IP地址只能在一台虛擬機重啟后者關機的情況下,被另外一台搶占。

https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0067802474.html(為虛擬機綁定虛擬IP不適用於keepalived場景

 

3.虛擬IP創建后,即使解綁服務器或者刪除虛擬IP,不影響后台虛擬機keepalived功能(無感知),仍可以使用,目測是個產品bug。當其他虛擬機使用了此虛擬IP地址作為私網地址時,源Nginx服務不可用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

問題1.虛擬IPconsole上解綁了服務器,但是服務器后端沒有手動在虛擬機上解綁虛擬IP,則仍然能夠通過虛擬IP訪問!(兩端服務器沒有配置keepalived

 

 

重啟虛擬機,ip address沒有變化,仍然可以訪問,需要手動解綁虛擬IP

# nmcli connection modify "System eth0" ipv4.addresses 192.168.0.10/24

重啟生效

 

 

 

 

 

 

一、環境:

主機名

鏡像

私有IP

虛擬IP

軟件

Nginx-serverA

CentOS7.6--64

192.168.0.72

192.168.0.100

Nginx+keepalived

Nginx-serverB

CentOS7.6--64

192.168.0.160

192.168.0.100

Nginx+keepalived

 

 

二、主機熱備架構

 

三、創建虛擬機安裝nginxkeepalived

1.創建虛擬機

 

 

2.安裝 Nginx Keepalive 軟件(兩台機器一致)

# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# sudo yum install -y nginx

# sudo systemctl start nginx.service

# sudo systemctl enable nginx.service

# sudo yum install keepalived -y

# sudo systemctl start keepalived.service

# sudo systemctl enable keepalived.service

 

3.編寫 nginx 服務存活檢測腳本(兩台機器一致)

腳本路徑:/usr/bin/check_nginx_alive.sh

 

# vim /usr/bin/check_nginx_alive.sh

內容:

#!/bin/sh

 

PATH=/bin:/sbin:/usr/bin:/usr/sbin

 

A=`ps -C nginx --no-header |wc -l`

 

if [ $A -eq 0 ]

   then

     echo 'nginx server is died'

     killall keepalived

fi

 

修改腳本權限:

#chmod +x /usr/bin/check_nginx_alive.sh

 

4.配置keepalive(兩台機器參數不同,根據實際修改參數)

先刪除原有配置文件:

#rm –rf /etc/keepalived/keepalived.conf

然后創建並編輯文件:

#vim /etc/keepalived/keepalived.conf

內容:NginxA

################################################

vrrp_script check_nginx_alive {

    ##腳本路徑

    script "/usr/bin/check_nginx_alive.sh"

    interval 3

    weight -10

}

global_defs {

    ## 設置lvsid,在一個網絡內唯一,可以自定義,保持唯一性

    router_id LVS_DEVEL

}

 ##實例名,可修改

vrrp_instance VI_1 {

    ## 主機配置,從機為BACKUP

    state MASTER

    ## 網卡名稱,虛擬機一般都是使用eth0

interface eth0

##虛擬路由ID,兩機器保持一致即可

    virtual_router_id 51  

    ## 權重值,值越大,優先級越高,backup設置比master,這樣就能在master宕機后講backup變為master,master回復后就可以恢復.

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        ## 同一網段虛擬IP

        192.168.0.100

}

##與檢測腳本一起使用

    track_script {

        check_nginx_alive

    }

 

}

 

virtual_server 192.168.0.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind NAT

    persistence_timeout 50

    protocol TCP

 

    real_server 192.168.0.72 80 {

        weight 1

        TCP_CHECK{

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

#####################################

 

內容:NginxB

#####################################

vrrp_script check_nginx_alive {

    ##腳本路徑

    script "/usr/bin/check_nginx_alive.sh"

    interval 3

    weight -10

}

global_defs {

    ## 設置lvsid,在一個網絡內唯一,可以自定義,保持唯一性,且兩機器保持一致

    router_id LVS_DEVEL

}

 ##實例名,可修改

vrrp_instance VI_1 {

    ## 主機配置MASTER,從機為BACKUP

    state BACKUP

    ## 網卡名稱,虛擬機一般都是使用eth0

interface eth0

##虛擬路由ID,兩機器保持一致即可

    virtual_router_id 51  

    ## 權重值,值越大,優先級越高,backup設置比master,這樣就能在master宕機后講backup變為master,master回復后就可以恢復.

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        ## 同一網段虛擬IP

        192.168.0.100

}

##與檢測腳本一起使用

    track_script {

        check_nginx_alive

    }

 

}

 

virtual_server 192.168.0.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind NAT

    persistence_timeout 50

    protocol TCP

 

    real_server 192.168.0.160 80 {

        weight 1

        TCP_CHECK{

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

###############################################3

注:虛擬機IP192.168.0.100

    NignxA-IP192.168.0.72

    NignxB-IP192.168.0.160

NignxA為主master        NignxA優先級priority 100     

NignxB為備backup        NignxB優先級priority 90

 

5.修改Nginx主頁信息,便於觀察虛擬IP的漂移

# vim /usr/share/nginx/html/index.html

內容:NginxA

#########################

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx! @Node A </h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>

 

<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

 

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

#########################################

 

內容:NginxB

##############################

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx! @Node B </h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>

 

<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>

 

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

############################################

 

6.重啟keepalive服務(兩機器一致)

#systemctl restart keepalived

 

本別查看兩機器的ip address

#ip address

內容nginxA:

 

內容nginxB:

 

 

可以看到虛擬IP192.168.0.100/32已經綁定到了NginxA

 

7.申請虛擬IP,並綁定虛擬機

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

四、驗證

在同一子網內創建一台windows虛擬機,並通過游覽器訪問Nginx服務器,來驗證訪問虛擬IP時是訪問的哪個主機。

 

1.初始情況虛擬IP分配到master主節點---NginxA

訪問私有IP192.168.0.72

 

訪問私有IP192.168.0.160

 

訪問虛擬IP192.168.0.100

 

結論:實驗成功,游覽器訪問虛擬IP192.168.0.100時,能夠訪問到Master主節點NginxA

 

2.關閉NginxAnginx服務,觀察虛擬IP是否漂移到NginxB

NginxA操作:

#systemctl stop nginx

 

查看NginxAip address

 

Eth0下已無虛擬機IP(對比  5.重啟keepalived     中之前的圖片)

 

 

產看NginxBip address

#ip address

 

 

Eth0下除了原私有IP,還有虛擬機IP

 

訪問虛擬IP地址:

 

發現跳轉到了NginxB節點,驗證成功。

結論:master節點NginxA主機的nginx服務down掉時,虛擬機ip地址漂移到backup節點NginxB

 

3.當Master主節點NginxAnginx服務恢復時,由於NginxA的優先級高,搶占回主節點,虛擬ip又漂移回NginxA

啟動NginxAnginx服務:

#systemctl start nginx

 

產看NginxAip address

 

發現虛擬IP192.168.0.100並沒有漂移回來。

原因:需要重啟keepalived服務,因為當nginx服務down掉后,keepalived進程被腳本給殺死了,所以需要手動重啟keepalived服務,才能和備節點通信,搶回虛擬IP

 

重啟NginxAkeepalived服務並產看ip address

 

 

發現虛擬ip漂移回NginxA節點。

 

訪問虛擬IP192.168.0.100

 

虛擬IP指向了主節點NginxA,驗證成功。

結論:當主節點服務恢復時,由於主節點的優先級高,所以搶占回虛擬IP

 

五、大坑小坑

1.必須要在控制台申請虛擬IP並綁定服務器,否則虛擬IP無法訪問!

 

2.華為官網上有手動給虛擬機綁定虛擬IP的操作指導,但是不適用於Keepalived的場景,適用keepalived來實現熱備,不需要手動綁定,如果手動綁定了,那么keepalived功能不會實現自動漂移虛擬ip,虛擬IP地址只能在一台虛擬機重啟后者關機的情況下,被另外一台搶占。

https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0067802474.html(為虛擬機綁定虛擬IP不適用於keepalived場景

 

3.虛擬IP創建后,即使解綁服務器或者刪除虛擬IP,不影響后台虛擬機keepalived功能(無感知),仍可以使用,目測是個產品bug。當其他虛擬機使用了此虛擬IP地址作為私網地址時,源Nginx服務不可用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

問題1.虛擬IPconsole上解綁了服務器,但是服務器后端沒有手動在虛擬機上解綁虛擬IP,則仍然能夠通過虛擬IP訪問!(兩端服務器沒有配置keepalived

 

 

重啟虛擬機,ip address沒有變化,仍然可以訪問,需要手動解綁虛擬IP

# nmcli connection modify "System eth0" ipv4.addresses 192.168.0.10/24

重啟生效

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM