在上文中使用 LVS 实现负载均衡,实现了利用LVS实现更高的并发,但是显然也存在单点故障,LVS挂了就不能响应请求。这时,我们可以利用 Keepalived 这一工具来实现自动的主备切换。
配置keepalived
这里,我们选择node2 和 node3 作为RS机器,node1 和 作为主LVS,新建容器node4在作为备LVS。
# docker run -dit --name node3 --hostname node3 --privileged centos /usr/sbin/init
# node1IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node1`
# node2IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node2`
# node3IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node3`
# node4IP=`docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' node4`
# nodeVIP='172.17.0.100'
# docker exec -it node1 bash -c "echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
# docker exec -it node2 bash -c "echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
# docker exec -it node3 bash -c "echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
# docker exec -it node4 bash -c "echo node1IP=$node1IP >> ~/.bashrc && echo node2IP=$node2IP >> ~/.bashrc && echo node3IP=$node3IP >> ~/.bashrc && echo node4IP=$node4IP >> ~/.bashrc && echo nodeVIP=$nodeVIP >> ~/.bashrc && source ~/.bashrc"
node2 和 node3 其余配置保持不变。
进入node1 和 node 4 配置keepalived:
# yum install -y net-tools ipvsadm keepalived
// 备份配置文件
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
// 修改配置文件
# cat > /etc/keepalived/keepalived.conf <<EOF
vrrp_instance VI_1 {
state MASTER # 如果是备机的话这里使用 BACKUP
interface eth0
virtual_router_id 51
priority 100 # 优先级,主机优先级肯定要比备机高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
${nodeVIP}/16 dev eth0 label eth0:vip # VIP的设置
}
}
virtual_server ${nodeVIP} 80 {
delay_loop 6
lb_algo rr # 轮询
lb_kind DR # DR模式
persistence_timeout 0 # 持久化时间超时,避免三次握手打散在不同的RS上,根据具体情况设置,本例实验所以设置为0
protocol TCP
# RS1
real_server ${node2IP} 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200 # 健康检查状态码为200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
# RS2
real_server ${node3IP} 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
EOF
可以通过man keepalived.conf了解更多配置文件的细节
测试
另外我们通过抓包可以发现keepalived 主备健康检测实现原理:
主主动给所有备广播健康包,当备一段时间没收到主发的健康包就认为主挂了,自己顶上去。
参考资料
1、https://www.cnblogs.com/Sinte-Beuve/p/13392747.html
2、https://zhuanlan.zhihu.com/p/356436234
网友评论