前言
为提供系统的 高可用,满足网络安全等级保护的热冗余的要求,平台需要对应用程序做高可用,本文主要针对 nginx 进行集群配置。
一、Nginx HA 概述
nginx 在系统中的作用是给系统提供一些负载均衡和动态代理的作用。通过不同轮询到不同服务,即使一台服务器挂掉,也能将请求转发到其他服务器上。
但如果 nginx 挂掉,那此时整个系统就没有入口了,所以,我们需要对 Nginx 做高可用配置。
这里准备两台 Nginx 服务器。
具体的思路是,将两台 Nginx 服务器都设置成一个 虚拟 IP,当 主 Nginx 服务器挂掉之后,当我们再次访问的时候,实际上就是访问我们的 从Nginx服务器来做负载均衡了,整个 IP 切换过程对于用户来说是没有感觉的,这种 工作 IP 地址变化的过程,被称为 IP漂移。
这个 虚拟IP 是由第三方软件提供的,它就是 keepalived 。
二、keepalived
Keepalived 提供了两种模式:
- master->backup模式 : 一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来, 即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。
- backup->backup模式 p会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip, 即使是优先级高于从库的优先级别,也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。
1、首先,我们先确认下网卡及 IP
ip addr show |grep inet
复制代码
2、接着进行安装:
yum install keepalived –y
复制代码
3、接着配置 /etc/keepalived/keepalived.conf这个文件
主服务器配置:
! Configuration File for keepalived
global_defs {
# 标识主机 id
router_id NGINX_102
}
##检测脚本和权重参数
vrrp_script chk_http_port {
script "/opt/software/nginx/sh/nginx_check.sh" ##配置脚本的路径
interval 2 #(检测脚本执行的间隔)
weight 2 ##权重
}
vrrp_instance VI_1 {
# 标记为主服务器
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.81.104
}
track_script {
chk_http_port
}
}
复制代码
从服务配置,只需把 state 改为 backup,和优先级降低即可。
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface eth0 ##网卡,可以从ipconfig这个命令查到
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小,一般来说,主100 备 80
advert_int 1 ##心跳,秒,每隔一秒发送一个心态确认我们的Nginx服务器的存活情况
authentication { ##密码验证
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.81.104 ## VRRP H 虚拟地址
}
}
复制代码
脚本内容如下:
nginx_check.sh:脚本的路径与nginx的启动路径一致
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
复制代码
脚本的目的是为了检测 nginx 服务是否挂掉,如果挂掉就尝试去启动它,如果启动失败,就把 keepalived 服务关闭。经过测试单独关闭 nginx,不关闭 keepalived 的话是不会转发到 nginx从服务器的。因此,脚本的目的是为了保证这两个要么全部存在,要么全部失败。
注意:有个坑,如果发现你的 nginx 关闭之后脚本不执行的原因。
-
可用先看下路径
-
可用看下脚本的准备性,当然我这个是可用执行的
-
最后重要的一点是需要关闭selinux,然后重新启动
setenforce 0 复制代码
-
永久关闭:
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config 复制代码
-
默认是抢占式执行的。
启动方式:
1、先启动nginx
2、再启动 keepalived
systemctl restart keepalived
复制代码
如果出错,记得查看日志:
tail -f /var/log/messages
复制代码
另外,如果依旧切换不过来,可以查看 防火墙或 ipotables 有无限制。