实验环境
操作系统:CentOS 7.4 1708
软件安装:yum -y install epel-release && yum -y install nginx keepalived
Nginx+Keepalived NodeA:18.50.129.72(master)
Nginx+Keepalived NodeB:18.50.129.73(slave)
VIP:18.50.129.74
实现目标
- 当Nginx服务停止后Keepalived会自动去启动此服务,如果无法启动将VIP转移至Slave节点
- 当Master节点Nginx配置文件更新后,Slave节点的Nginx配置文件及时同步
Node1的Keepalived配置
! Configuration File for keepalived global_defs { router_id NodeA #路由器标识,最好写主机名,用于标识 } vrrp_script chk_nginx { #配置检查方式,chk_nginx为自定义名称 script "/etc/keepalived/nginx_check.sh" interval 2 weight 20 #此值需要大于MASTER的priority减去BACKUP的priority } vrrp_instance VI_1 { state MASTER #主节点为:MASTER,备节点为:BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { #此为认证方式,MASTER和BACKUP统一 auth_type PASS auth_pass 1314 } track_script { #调用上面的检查脚本 chk_nginx } virtual_ipaddress { #设定VIP地址 18.50.129.74/24 } }
Node2的Keepalived配置
! Configuration File for keepalived global_defs { router_id NodeB } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight 20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1314 } track_script { chk_nginx } virtual_ipaddress { 18.50.129.74/24 } }
nginx_check.sh脚本内容:
#!/bin/bash A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ];then nginx sleep 2 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then pkill keepalived fi fi
脚本说明:
- 脚本逻辑为检测进程如果没有nginx就尝试启动一次,然后等礴两秒,再检测,如果还没有上进程就结束keepalived进程。这样VIP就会移动到备份节点
- 我这里是yum安装的Nginx,所以直接使用nginx命令可以启动nginx,如果你是源码安装,或者需要配置下环境变量或者更改下启动命令和绝对路径,并测试是否能正常启动
- 如果觉得等待两秒的时候过长可以更改为1秒
启动服务:
在NodeA和NodeB执行后面命令:systemctl start keepalived
测试:
- 查看两个节点的Nginx服务是否启动成功,如果keepalived启动成功会调用启动Nginx,前提需要保证Nginx能正常启动
- 在Master故意更改错Nginx配置文件,并停止Nginx服务过几秒查看VIP是否已经移动至NodeB,正常是会移动到NodeB节点
- 恢复Master节点,查看VIP是否回到Master,正常VIP会绑定到Master
小知识:
查看VIP使用:ip addr 命令
keepalived日志默认记录在:/var/log/messages
最后关于Nginx配置文件同步问题,我只说明了一下思路,不作演示,可以参考我自动运维上关文章, 我们可以使用salt来管理Nginx的配置文件,这样就可以做到指的更新,这样就解决了我们多台Nginx配置文件同步问题
时间: 2024-11-02 14:32:28