keepalived可用于多种软件的高可用实现,用来解决单点故障问题,同时在主、备服务器部署相同nginx,通过一个虚拟IP地址(即VIP)对外提供服务,当主服务器的nginx出现故障时,虚拟IP就会自动漂移到备服务器上,整个漂移过程是自动实现的,无需人工干预,从而保障了服务的高可用性。
本文以主备方式,抢占模式(如果使用非抢占模式,仅需将文中两台主机keepalived配置都改为state BACKUP)。
注意:请同步时间,保持时间一致性,自行关闭或配置防火墙和selinux规则
环境准备:
至少两台服务器,3个IP地址,本文操作系统环境为CentOS7.9,keepalived版本1.3.5,nginx版本1.20.2
10.10.10.11 MASTER服务器IP
10.10.10.12 BACKUP服务器IP
10.10.10.10 VIP虚拟IP
访问流程图如下:
1、安装nginx
在两台服务器上同时安装好nginx,我这里通过wlnmp一键包进行安装
rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm yum install wnginx -y
|-----|-------------------------------------------------------------------------------------------------| | 1 2 | rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm yum install wnginx -y |
2、修改默认index文件
为了访问区分演示,修改index.html文件,其中MASTER服务器index.html修改为10.10.10.11,BACKUP服务器index.html修改为10.10.10.12
vi /usr/local/nginx/html/index.html
|---|-------------------------------------| | 1 | vi /usr/local/nginx/html/index.html |
3、安装keepalived
分别在两台服务器上安装keepalived,我这里使用wlnmp一键包提供的新版keepalived
如果前面添加这个源了,这里就不用执行了。
rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
|---|---------------------------------------------------------------------------| | 1 | rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm |
yum install wkeepalived -y
|---|----------------------------| | 1 | yum install wkeepalived -y |
4、创建nginx脚本文件
在两台主机上分别创建nginx脚本文件,wlnmp一键包安装的keepalived默认提供了一个脚本,结合实际情况更改
vi /etc/keepalived/nginx_check.sh
|---|-----------------------------------| | 1 | vi /etc/keepalived/nginx_check.sh |
#!/bin/bash x=`ps -C nginx --no-heading | wc -l` if [ $x -eq 0 ];then /etc/init.d/nginx start sleep 2 x=`ps -C nginx --no-heading | wc -l` if [ $x -eq 0 ];then systemctl stop keepalived fi fi
|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 | #!/bin/bash x=`ps -C nginx --no-heading | wc -l` if [ $x -eq 0 ];then /etc/init.d/nginx start sleep 2 x=`ps -C nginx --no-heading | wc -l` if [ $x -eq 0 ];then systemctl stop keepalived fi fi |
赋予执行权限
chmod +x /etc/keepalived/nginx_check.sh
|---|-----------------------------------------| | 1 | chmod +x /etc/keepalived/nginx_check.sh |
注:该脚本判断nginx启动是否正常,如果nginx的进程数为0,表示nginx服务异常,则启动nginx(我这里的nginx启动命令是 /etc/init.d/nginx start),睡眠延迟2秒,防止资源抢占,然后再次判断nginx是否正常,如果还不正常,则停止keepalived,停止后进行IP漂移。
5、MASTER服务器配置
MASTER服务器keepalived配置文件如下
vi /etc/keepalived/keepalived.conf
|---|------------------------------------| | 1 | vi /etc/keepalived/keepalived.conf |
! Configuration File for keepalived global_defs { router_id 10.10.10.11 #表示运行keepalived服务器的唯一标识,可以是任意值,我这里是把本地IP当作标识10.10.10.11 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" #定时检测nginx状态脚本 interval 2 #2秒检测一次 timeout 10 #脚本超时时间 weight -20 #权重 } vrrp_instance VI_1 { state MASTER interface ens192 #本地网卡名称 virtual_router_id 51 #虚拟路由ID号,必须保持一致 priority 100 #节点优先级0~254,MASTER要高于BACKUP advert_int 1 #组播信息发送的时间间隔,默认1秒,节点之间设置需保持一致 nopreempt #state配置项都为BACKUP时生效 authentication { auth_type PASS auth_pass 1111 } #账户校验信息,节点之间必须保持一致 virtual_ipaddress { 10.10.10.10 } #VIP(虚拟IP),节点之间必须保持一致 track_script { chk_nginx } #检测脚本配置 }
|----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 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 26 27 28 29 30 31 32 | ! Configuration File for keepalived global_defs { router_id 10.10.10.11 #表示运行keepalived服务器的唯一标识,可以是任意值,我这里是把本地IP当作标识10.10.10.11 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" #定时检测nginx状态脚本 interval 2 #2秒检测一次 timeout 10 #脚本超时时间 weight -20 #权重 } vrrp_instance VI_1 { state MASTER interface ens192 #本地网卡名称 virtual_router_id 51 #虚拟路由ID号,必须保持一致 priority 100 #节点优先级0~254,MASTER要高于BACKUP advert_int 1 #组播信息发送的时间间隔,默认1秒,节点之间设置需保持一致 nopreempt #state配置项都为BACKUP时生效 authentication { auth_type PASS auth_pass 1111 } #账户校验信息,节点之间必须保持一致 virtual_ipaddress { 10.10.10.10 } #VIP(虚拟IP),节点之间必须保持一致 track_script { chk_nginx } #检测脚本配置 } |
6、BACKUP服务器配置
BACKUP服务器keepalived配置文件如下
vi /etc/keepalived/keepalived.conf
|---|------------------------------------| | 1 | vi /etc/keepalived/keepalived.conf |
! Configuration File for keepalived global_defs { router_id 10.10.10.12 #表示运行keepalived服务器的唯一标识,可以是任意值,我这里是把本地IP当作标识10.10.10.12 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" #定时检测nginx状态脚本 interval 2 #2秒检测一次 timeout 10 #脚本超时时间 weight -20 #权重 } vrrp_instance VI_1 { state BACKUP interface ens192 #本地网卡名称 virtual_router_id 51 #虚拟路由ID号,必须保持一致 priority 99 #节点优先级0~254,BACKUP要低于MASTER advert_int 1 #组播信息发送的时间间隔,默认1秒,节点之间设置需保持一致 nopreempt #state配置项都为BACKUP时生效 authentication { auth_type PASS auth_pass 1111 } #账户校验信息,节点之间必须保持一致 virtual_ipaddress { 10.10.10.10 } #VIP(虚拟IP),节点之间必须保持一致 track_script { chk_nginx } #检测脚本配置 }
|----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 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 26 27 28 29 30 31 32 | ! Configuration File for keepalived global_defs { router_id 10.10.10.12 #表示运行keepalived服务器的唯一标识,可以是任意值,我这里是把本地IP当作标识10.10.10.12 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" #定时检测nginx状态脚本 interval 2 #2秒检测一次 timeout 10 #脚本超时时间 weight -20 #权重 } vrrp_instance VI_1 { state BACKUP interface ens192 #本地网卡名称 virtual_router_id 51 #虚拟路由ID号,必须保持一致 priority 99 #节点优先级0~254,BACKUP要低于MASTER advert_int 1 #组播信息发送的时间间隔,默认1秒,节点之间设置需保持一致 nopreempt #state配置项都为BACKUP时生效 authentication { auth_type PASS auth_pass 1111 } #账户校验信息,节点之间必须保持一致 virtual_ipaddress { 10.10.10.10 } #VIP(虚拟IP),节点之间必须保持一致 track_script { chk_nginx } #检测脚本配置 } |
7、启动keepalived
两台主机分别启动keepalived,并配置开机自启
systemctl start keepalived systemctl enable keepalived
|-----|--------------------------------------------------------| | 1 2 | systemctl start keepalived systemctl enable keepalived |
8、验证环节开始
8-1、网络验证
拔掉MASTER网线后,访问VIP地址10.10.10.10,此时可看到显示内容变成10.10.10.12即BACKUP主机,IP漂移成功。
重新插回MASTER的网线后,访问VIP地址10.10.10.10,此时看到显示内容变成10.10.10.11,即MASTER主机,当MASTER恢复后,IP自动漂移回来了。
8-2、服务宕机验证
停止MASTER上的nginx服务,访问VIP地址10.10.10.10,此时看到访问显示地址依旧是10.10.10.11即MASTER主机。
当MASTER上的nginx服务停止后,keepalived通过nginx脚本重新启动了nginx服务,VIP没有触发漂移操作。
8-3、服务器重启验证
直接poweroff关闭MASTER机器,主机关闭后,访问VIP地址10.10.10.10,此时看到访问显示地址是10.10.10.12即BACKUP主机,IP漂移成功。
启动关闭的MASTER机器,启动成功后,访问VIP地址10.10.10.10,此时可看到访问显示地址是10.10.10.11即MASTER主机,IP自动漂移回来了。