Docker nginx容器高可用(Keepalived)
概述
Keepalived主要作用:在多个服务器上安装Keepalived并且为各个服务器的Keepalived指定相同的虚拟IP。该虚拟IP根据服务器上Keepalived配置的角色、优先级 决定出现在其中一台服务器上,当拥有虚拟IP的服务器Keepalived进程被杀死后,那么此时虚拟IP会跳到其它服务器上。
nginx容器高可用原理:根据上述所说 Keepalived特性原理,那么我们在各个nginx容器所在服务器上安装Keepalived,用户访问nginx时使用虚拟IP进行访问。使用脚本定期检查,如果拥有虚拟IP的服务器的nginx挂掉了,那么此时将该服务器上的Keepalived进程杀死,从而让虚拟IP跳转至其它服务器,从而实现故障转移,该过程对用户层面是无感知。
安装配置信息如下:
名称 | IP | keepalve角色 |
---|---|---|
nginx1 | 192.168.25.61 | 主 |
nginx1 | 192.168.25.81 | 从 |
虚拟IP | 192.168.25.100 |
2.安装Keepalived
安装keepalived
yum install -y keepalived
3.修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
修改内容如下:
master节点配置:
! Configuration File for keepalived
global_defs {
script_user root # 执行检查脚本时使用的用户,别漏了!!!!!!!!!!
notification_email { # 配置邮件通知列表
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 配置邮件发送人的邮件信息
smtp_server 192.168.200.1 # 邮件服务器
smtp_connect_timeout 30 # 设置了SMTP服务器连接超时时间,这里是30秒。
router_id LVS_DEVEL # 为Keepalived实例指定了一个唯一的路由器ID,这里是LVS_DEVEL。这个ID在集群中是唯一的,
vrrp_skip_check_adv_addr # 这个选项通常用于性能优化,它会跳过对VRRP广播地址的检查。
vrrp_strict # 启用严格模式,这要求VRRP配置中的某些字段必须严格匹配
vrrp_garp_interval 0 # vrrp_garp_interval、vrrp_gna_interval 这两个选项与GRATUITOUS ARP(免费ARP)相关,用于加速VIP的故障转移过程。这里都设置为0,表示不发送GRATUITOUS ARP。
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/root/keepalived_check_nginx.sh" # 指定keepalved nginx检查脚本路径
interval 1 # 检查周期/秒
}
vrrp_instance VI_1 {
state MASTER # 定义了Keepalived实例的初始状态,这里是MASTER。在HA配置中,通常会有一个主节点(MASTER)和一个或多个备节点(BACKUP)。
interface ens33 # 指定了Keepalived将绑定哪个网络接口来发送和接收VRRP广播,这里是ens33。这个值需要结合你电脑实际网卡而定
virtual_router_id 51 # 为VRRP实例指定了一个虚拟路由器ID,这里是51。在VRRP配置中,这个ID用于标识虚拟路由器。
priority 100 # 设置了Keepalived实例的优先级,这里是100。优先级较高的实例将成为MASTER。
advert_int 1 # 设置了VRRP广告间隔(秒),这里是1秒。MASTER会定期发送VRRP广告来通知BACKUP节点其存在。
authentication {
auth_type PASS # 配置了VRRP认证信息,包括认证类型和认证密码。这里使用的是PASS类型
auth_pass 123456 # 认证的密码
}
virtual_ipaddress {
192.168.25.100 # 定义了要绑定的虚拟IP地址列表。这里只列出了一个地址192.168.25.100。当MASTER节点失效时,这个VIP会自动转移到BACKUP节点上。
}
track_script {
chk_nginx # 指定健康检查脚本
}
}
slave节点配置:
和主节点的差异部分为:state 、priority
! Configuration File for keepalived
global_defs {
script_user root # 执行检查脚本时使用的用户,别漏了!!!!!!!!!!
notification_email { # 配置邮件通知列表
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 配置邮件发送人的邮件信息
smtp_server 192.168.200.1 # 邮件服务器
smtp_connect_timeout 30 # 设置了SMTP服务器连接超时时间,这里是30秒。
router_id LVS_DEVEL # 为Keepalived实例指定了一个唯一的路由器ID,这里是LVS_DEVEL。这个ID在集群中是唯一的,
vrrp_skip_check_adv_addr # 这个选项通常用于性能优化,它会跳过对VRRP广播地址的检查。
vrrp_strict # 启用严格模式,这要求VRRP配置中的某些字段必须严格匹配
vrrp_garp_interval 0 # vrrp_garp_interval、vrrp_gna_interval 这两个选项与GRATUITOUS ARP(免费ARP)相关,用于加速VIP的故障转移过程。这里都设置为0,表示不发送GRATUITOUS ARP。
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/root/keepalived_check_nginx.sh" # 指定keepalved nginx检查脚本路径
interval 1 # 检查周期/秒
}
vrrp_instance VI_1 {
state BACKUP # 定义了Keepalived实例的初始状态,这里是MASTER。在HA配置中,通常会有一个主节点(MASTER)和一个或多个备节点(BACKUP)。
interface ens33 # 指定了Keepalived将绑定哪个网络接口来发送和接收VRRP广播,这里是ens33。这个值需要结合你电脑实际网卡而定
virtual_router_id 51 # 为VRRP实例指定了一个虚拟路由器ID,这里是51。在VRRP配置中,这个ID用于标识虚拟路由器。
priority 90 # 设置了Keepalived实例的优先级,这里是100。优先级较高的实例将成为MASTER。
advert_int 1 # 设置了VRRP广告间隔(秒),这里是1秒。MASTER会定期发送VRRP广告来通知BACKUP节点其存在。
authentication {
auth_type PASS # 配置了VRRP认证信息,包括认证类型和认证密码。这里使用的是PASS类型
auth_pass 123456 # 认证的密码
}
virtual_ipaddress {
192.168.25.100 # 定义了要绑定的虚拟IP地址列表。这里只列出了一个地址192.168.25.100。当MASTER节点失效时,这个VIP会自动转移到BACKUP节点上。
}
track_script {
chk_nginx # 指定健康检查脚本
}
}
3.添加keepalived检查脚本
vim /root/keepalived_check_nginx.sh
文件内容如下:
#!/bin/bash
if [ $(docker ps | grep nginx | grep Up | wc -l) -eq 0 ];then
pkill keepalive
elif [ $(ps -C keepalived --no-header | wc -l) -eq 1 ];then
systemctl start keepalived
fi
给脚本添加执行权限(不要漏了这步骤)
chmod +x /root/keepalived_check_nginx.sh
4. 启动keepalived
systemctl enable keepalived.service --now
查看启动状态:
systemctl status keepalived.service
查看keepalived运行日志:
journalctl -u keepalived.service
5.验证
# 查看IP
ip addr
发现虚拟IP 落在 master服务器上。
访问 http://虚拟ip:80,效果如下
把主节点的nginx进行关闭,检查虚拟IP是否跳转到备服务器上
#主节点执行关闭nginx容器命令
docker stop nginx
如下图,发现虚拟IP已经跳转至备服务器上。
再次访问 http://虚拟ip:80,效果如下
至此,大功告成~~~~