Docker+keepalived+nginx搭建高可用集群

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命令

2.安装nginx、keepalived、vim、net-tools、initscripts

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

1269262184-c2b126fd67ce895d_fix732

825873155-98546f3f4735f425_fix732

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节点

1
ip a

2072617212-fbf4b38345f1e8fd_fix732

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

1
curl 172.17.0.200

2228696458-5310ccd351c591da_fix732

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

103544577-7bfbcef4d16225dc_fix732