华为云中使用Vip+keepalived实现业务系统在线热备的操作方法

时间:2024-02-23 14:00:32

一、环境:

主机名

镜像

私有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

重启生效