1.Docker环境来模拟多服务器环境
1 2 3 4 5 6
| docker run -d --name web1 --privileged=true centos /usr/sbin/init docker exec -it web1 /bin/bash docker run -d --name web2 --privileged=true centos /usr/sbin/init docker exec -it web2 /bin/bash docker run -d --name webtest --privileged=true centos /usr/sbin/init docker exec -it webtest /bin/bash
|
- –privileged=true:可以docker内真正拥有root权限
- /usr/sbin/init:可以在docker内使用systemctl命令
1
| yum install -y nginx keepalived vim net-tools initscripts
|
- initscripts:可以使用service命令
3.修改nginx默认html页面(方便查看主备切换)
1 2
| cd /usr/share/nginx/html vim index.html
|


4.创建nginx进程检测脚本
1 2 3 4
| cd /etc/keepalived touch check_nginx.sh chmod +x check_nginx.sh vim check_nginx.sh
|
1 2 3 4 5 6 7 8 9
| #!/bin/bash A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ];then /usr/sbin/nginx sleep 2 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then killall keepalived fi fi
|
5.配置keepalived
master节点配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| global_defs { router_id LVS_DEVEL #节点名,一般使用默认的就可以 }
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" #检测nginx脚本的路径 interval 2 #运行脚本的间隔时间 weight -20 #变更的权重 }
vrrp_instance VI_1 { state MASTER #此节点为MASTER,如果此节点down掉,再重启时,会立即抢占回主节点 #mcast_src_ip 172.17.0.2 本机ip,不声明则默认绑定本机ip interface eth0 #绑定的网卡,可以通过ifconfig查看网卡信息 virtual_router_id 70 #虚拟路由标识,同一组的必须相同 priority 100 #权重 nopreempt #定义为非抢占式,因为多次主备切换对请求量大的服务器不太好 advert_int 1 #与组内其他节点发送心跳的间隔:s virtual_ipaddress { 172.17.0.200 } #绑定的虚拟ip组 track_script { chk_nginx } #执行前面声明的脚本 }
|
backup节点配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| global_defs { router_id LVS_DEVEL #节点名,一般使用默认的就可以 }
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" #检测nginx脚本的路径 interval 2 #运行脚本的间隔时间 weight -20 #变更的权重 }
vrrp_instance VI_1 { state BACKUP #此节点为backup # mcast_src_ip 172.17.0.3 本机ip,不声明则默认绑定本机ip interface eth0 #绑定的网卡,可以通过ifconfig查看网卡信息 virtual_router_id 70 #虚拟路由标识,同一组的必须相同 priority 90 #权重,备节点的权重要比主节点小 advert_int 1 #与组内其他节点发送心跳的间隔:s。组内间隔必须相同 virtual_ipaddress { 172.17.0.200 } #绑定的虚拟ip组 track_script { chk_nginx } #执行前面声明的脚本 }
|
6.测试
启动web1、web2内的nginx及keepalived服务
1 2
| nginx systemctl start keepalived
|
查看虚拟ip是否绑定在master节点

使用webtest容器作为客户端访问nginx服务

停止web1容器,模拟宕机。再次访问nginx服务,成功迁移到backup节点
