Keepalived 是 Linux 下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,
它与 HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat 是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,
与 HeartBeat 相比,Keepalived 主要是通过虚拟路由冗余来实现高可用功能,虽然它没有 HeartBeat 功能强大,但是 Keepalived 部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。
Keepalived 的高可用通过虚拟ip(vip)来实现,虚拟 ip 可以漂移。
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如果路径为非root可写,不要配置脚本为root用户执行。
}
vrrp_script chk_nginx_service { #VRRP 脚本声明
script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
interval 3 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 3 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
user keepalived_script #执行脚本的用户或组
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.130
}
track_script { #脚本监控状态
chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务
notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务
notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务;
}
## 虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。 该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。
virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
节点 | 网卡 | 主备节点 | Vip |
---|---|---|---|
192.168.56.100 | enp0s3 | 主节点 | 192.168.56.120 |
192.168.56.101 | enp0s3 | 备用节点 | 192.168.56.120 |
默认安装了docker 和docker-compose
2台机器都执行 开启防火墙新增目录
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" accept"
firewall-cmd --reload
firewall-cmd --list-all
systemctl restart docker
docker run -d \
--name keepalived-master \
--net=host \
-e KEEPALIVED_INTERFACE="enp0s3" \
-e KEEPALIVED_PRIORITY=100 \
-e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.56.100', '192.168.56.101']" \
-e KEEPALIVED_VIRTUAL_IPS="192.168.56.120" \
-e KEEPALIVED_STATE="MASTER" \
--privileged=true \
osixia/keepalived:stable --loglevel debug
docker run -d \
--name keepalived-backup \
--net=host \
-e KEEPALIVED_INTERFACE="enp0s3" \
-e KEEPALIVED_PRIORITY=50 \
-e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['192.168.56.100', '192.168.56.101']" \
-e KEEPALIVED_VIRTUAL_IPS="192.168.56.120" \
-e KEEPALIVED_STATE="BACKUP" \
--privileged=true \
osixia/keepalived:stable --loglevel debug
# 1. 创建配置文件
mkdir -p /home/keepalived/conf/ && \
cat > /home/keepalived/conf/keepalived.conf<<EOF
global_defs {
default_interface enp0s3
}
vrrp_instance VI_1 {
interface enp0s3
state MASTER
virtual_router_id 51
priority 100
nopreempt
unicast_peer {
192.168.56.100
192.168.56.101
}
virtual_ipaddress {
192.168.56.120
}
authentication {
auth_type PASS
auth_pass d0cker
}
notify "/container/service/keepalived/assets/notify.sh"
}
EOF
# 2. docker启动
docker run -d \
--name keepalived-master \
-v /home/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
--net=host \
--privileged=true \
osixia/keepalived:stable --loglevel debug --copy-service
日志
使用 ip a
命令,发现 enp0s3网卡多了个 ip。
# 1. 创建配置文件
mkdir -p /home/keepalived/conf/ && \
cat > /home/keepalived/conf/keepalived.conf<<EOF
global_defs {
default_interface enp0s3
}
vrrp_instance VI_1 {
interface enp0s3
state BACKUP
virtual_router_id 51
priority 100
nopreempt
unicast_peer {
192.168.56.100
192.168.56.101
}
virtual_ipaddress {
192.168.56.120
}
authentication {
auth_type PASS
auth_pass d0cker
}
notify "/container/service/keepalived/assets/notify.sh"
}
EOF
# 2. docker启动
docker run -d \
--name keepalived-backup \
-v /home/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
--net=host \
--privileged=true \
osixia/keepalived:stable --loglevel debug --copy-service
日志
此时通过 ip a
命令查看,发现并没有 vip。
通过在主节点上模拟 keepalived 故障,使用命令 docker stop keepalived-master
,可以看见 vip 漂移到备用节点。
osixia/keepalived
镜像的源码地址:docker-keepalived
如果出现两个节点都存在 vip ,且程序退出后都不自动释放 vip,使用命令 ip addr del 192.168.56.120/24 dev enp0s3
进行删除。
cat > check8080.sh << EOF
#!/bin/bash
count=`netstat -apn | grep 8080 | wc -l`
if [ $count -gt 0 ]; then
exit 0
else
sleep 2
count=`netstat -apn | grep 8080 | wc -l`
if [ $count -gt 0 ]; then
pkill keepalived
fi
exit 1
fi
EOF
cat > keepalived.conf << EOF
global_defs {
default_interface enp0s3
}
vrrp_script check8081
{
script "/checksh/check8081.sh"
# 这个地址写的事容器内脚本路径
interval 2
weight -30
}
vrrp_instance VI_1 {
interface enp0s3
state BACKUP
virtual_router_id 51
priority 100
nopreempt
advert_int 1
virtual_ipaddress {
192.168.56.120
}
authentication {
auth_type PASS
auth_pass d2cker
}
track_script {
script "/checksh/check8080.sh"
}
notify "/container/service/keepalived/assets/notify.sh"
}
EOF