一、环境:
主机名 |
镜像 |
私有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 |
二、主机热备架构
三、创建虚拟机安装nginx,keepalived
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 {
## 设置lvs的id,在一个网络内唯一,可以自定义,保持唯一性
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 {
## 设置lvs的id,在一个网络内唯一,可以自定义,保持唯一性,且两机器保持一致
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
注:虚拟机IP:192.168.0.100
NignxA-IP:192.168.0.72
NignxB-IP:192.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:
可以看到虚拟IP:192.168.0.100/32已经绑定到了NginxA上
7.申请虚拟IP,并绑定虚拟机
四、验证
在同一子网内创建一台windows虚拟机,并通过游览器访问Nginx服务器,来验证访问虚拟IP时是访问的哪个主机。
1.初始情况虚拟IP分配到master主节点---NginxA
访问私有IP:192.168.0.72
访问私有IP:192.168.0.160
访问虚拟IP:192.168.0.100
结论:实验成功,游览器访问虚拟IP:192.168.0.100时,能够访问到Master主节点NginxA。
2.关闭NginxA的nginx服务,观察虚拟IP是否漂移到NginxB
在NginxA操作:
#systemctl stop nginx
查看NginxA的ip address
Eth0下已无虚拟IP(对比 5.重启keepalived 中之前的图片)
产看NginxB的ip address
#ip address
Eth0下除了原私有IP,还有虚拟机IP。
访问虚拟IP地址:
发现跳转到了NginxB节点,验证成功。
结论:master节点NginxA主机的nginx服务down掉时,虚拟机ip地址漂移到backup节点NginxB。
3.当Master主节点NginxA的nginx服务恢复时,由于NginxA的优先级高,抢占回主节点,虚拟ip又漂移回NginxA。
启动NginxA的nginx服务:
#systemctl start nginx
产看NginxA的ip address
发现虚拟IP:192.168.0.100并没有漂移回来。
原因:需要重启keepalived服务,因为当nginx服务down掉后,keepalived进程被脚本给杀死了,所以需要手动重启keepalived服务,才能和备节点通信,抢回虚拟IP。
重启NginxA的keepalived服务并产看ip address
发现虚拟ip漂移回NginxA节点。
访问虚拟IP:192.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.虚拟IP在console上解绑了服务器,但是服务器后端没有手动在虚拟机上解绑虚拟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 |
二、主机热备架构
三、创建虚拟机安装nginx,keepalived
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 {
## 设置lvs的id,在一个网络内唯一,可以自定义,保持唯一性
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 {
## 设置lvs的id,在一个网络内唯一,可以自定义,保持唯一性,且两机器保持一致
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
注:虚拟机IP:192.168.0.100
NignxA-IP:192.168.0.72
NignxB-IP:192.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:
可以看到虚拟IP:192.168.0.100/32已经绑定到了NginxA上
7.申请虚拟IP,并绑定虚拟机
四、验证
在同一子网内创建一台windows虚拟机,并通过游览器访问Nginx服务器,来验证访问虚拟IP时是访问的哪个主机。
1.初始情况虚拟IP分配到master主节点---NginxA
访问私有IP:192.168.0.72
访问私有IP:192.168.0.160
访问虚拟IP:192.168.0.100
结论:实验成功,游览器访问虚拟IP:192.168.0.100时,能够访问到Master主节点NginxA。
2.关闭NginxA的nginx服务,观察虚拟IP是否漂移到NginxB
在NginxA操作:
#systemctl stop nginx
查看NginxA的ip address
Eth0下已无虚拟机IP(对比 5.重启keepalived 中之前的图片)
产看NginxB的ip address
#ip address
Eth0下除了原私有IP,还有虚拟机IP。
访问虚拟IP地址:
发现跳转到了NginxB节点,验证成功。
结论:master节点NginxA主机的nginx服务down掉时,虚拟机ip地址漂移到backup节点NginxB。
3.当Master主节点NginxA的nginx服务恢复时,由于NginxA的优先级高,抢占回主节点,虚拟ip又漂移回NginxA。
启动NginxA的nginx服务:
#systemctl start nginx
产看NginxA的ip address
发现虚拟IP:192.168.0.100并没有漂移回来。
原因:需要重启keepalived服务,因为当nginx服务down掉后,keepalived进程被脚本给杀死了,所以需要手动重启keepalived服务,才能和备节点通信,抢回虚拟IP。
重启NginxA的keepalived服务并产看ip address
发现虚拟ip漂移回NginxA节点。
访问虚拟IP:192.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.虚拟IP在console上解绑了服务器,但是服务器后端没有手动在虚拟机上解绑虚拟IP,则仍然能够通过虚拟IP访问!(两端服务器没有配置keepalived)
重启虚拟机,ip address没有变化,仍然可以访问,需要手动解绑虚拟IP
# nmcli connection modify "System eth0" ipv4.addresses 192.168.0.10/24
重启生效