在架构设计中,可以利用 nginx 的反向代理和负载均衡实现后端应用的高可用性,同时还需要考虑Nginx的单点故障,真正做到架构高可用性。
主要考虑以下两点:
- Nginx 服务因为意外现象挂掉
- 服务器宕机导致 Nginx 不可用
目前主流的解决方案就是 keepalived + nginx 实现 nginx 的故障转移,同时做好监控报警。在自动故障转移的同时能通知到相关的应用负责人检查相关应用,排查隐患,彻底解决问题。
模拟环境:虚拟机 192.168.56.9 与 192.168.56.10
192.168.56.9:安装 nginx 主 + keepalived 主 + Tomcat 主
192.168.56.10:安装 nginx 备 + keepalived 备 + Tomcat 备
虚拟IP(VIP):192.168.56.120
Nginx 服务和 Tomcat 应用是已经配置好的环境,这里就不介绍相关的配置。具体可以查考以下两篇博文:
0x01:Keepalived 介绍及部署
Keepalived 的功能很强大,主要检测服务器的状态,如果有一台 web 服务器宕机,或者工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
CentOS 系统安装 Keepalived 主要有两种安装方式:
- yum 命令安装
- 源码安装
yum 命令安装
yum install -y keepalived
该方式安装的 keepalived 版本为 1.3.5
使用 yum 安装方式安装不了最新版本的 Keepalived,可以使用以下命令卸载 Keepalived
yum remove keepalived
源码安装
1. 下载源码
官网地址
https://www.keepalived.org/
使用如下命令下载
wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
2. 解压 Keepalived
tar -zxvf keepalived-2.2.2.tar.gz -C /usr/local
3. 进入 Keepalived 解压目录
cd keepalived-2.2.2/
4. 编译
./configure
如在编译过程中出现错误,可以先执行以下命令安装 Keepalived 所需的依赖
yum install -y gcc openssl-devel popt-devel ipvsadm
编译成功的结果如下
5. 安装
make && make install
6. 将 Keepalived 安装成 Linux 系统服务
mkdir /etc/keepalived
cp /root/keepalived-2.2.2/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /root/keepalived-2.2.2/keepalived/etc/init.d/keepalived /etc/init.d/
cp /root/keepalived-2.2.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/bin/
ln -s /usr/local/sbin/keepalived /sbin/
Keepalived 常用命令
# 设置开机自动启动
systemctl enable keepalived.service
# 取消开机自动启动
systemctl disable keepalived.service
# 启动
systemctl start keepalived.service
# 停止
systemctl stop keepalived.service
# 重启
service keepalived restart
# 状态
service keepalived status
0x02:主 Keepalive 配置
主 Keepalived 配置文件
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx01 # router_id 唯一标识符
vrrp_skip_check_adv_addr
vrrp_stricti
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh" #nginx服务检查脚本
interval 1
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3 #指定VIP需要绑定的物理网卡,这里默认是eht0但是我的是enp0s3,如果报错了就改成自己物理网卡名字
virtual_router_id 52 #默认为51 配置完发现主备切换有问题 更改为52 发现好了 原因未知
priority 150 #主备的优先级priority
advert_int 1 #检查时间1秒
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.56.120/24 #vip地址
}
}
nginx_check.sh 脚本
#!/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
pkill keepalived
fi
fi
添加权限
chmod 755 nginx_check.sh
启动 Keepalived
systemctl start keepalived.service
检查是否启动成功
查看 IP 地址变[ 启动前 ]
查看 IP 地址变[ 启动后 ]
0x03:备 Keepalived 配置
同样按照步骤 0x01 安装 keepalived,然后按照如下步骤配置。
备 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 enp0s4
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1314
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.56.120/24
}
}
nginx_check.sh 脚本
#!/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
pkill keepalived
fi
fi
添加权限
chmod 755 nginx_check.sh
nginx_check.sh 脚本说明:
脚本逻辑为检测进程如果没有 nginx 就尝试启动一次,然后 sleep 两秒,再检测,如果还没有上进程就结束 keepalived 进程。这样 VIP 就会移动到备份节点。如果 yum 安装的 nginx,可以直接使用 nginx 命令可以启动 nginx,如果是源码安装,或者需要配置下环境变量或者更改下启动命令和绝对路径,并测试是否能正常启动 nginx。
启动 Keepalived
systemctl start keepalived.service
检查是否启动成功
查看 IP 地址变[ 启动前 ]
查看 IP 地址变[ 启动后 ]
另外,如果 keepalived 启动不成功,可以在keepalived日志文件 /var/log/messages 查看是否存在配置文件的错误。
0x04:验证
防火墙开启vrrp
keepalived 是基于 vrrp 做到虚拟 ip 漂移的,这里不开启的话,主备均会认为对方挂掉了,会造成主备都能获取到虚拟ip ( vip )
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
首先在主备服务器分别执行 service keepalived start 开启 keepalived
- 通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip
- 在主服务器执行 service keepalived stop 停止 keepalived
- 通过 ip addr 命令查看备服务的 ip, 会发现可以看到 vip
- 在主服务器执行 service keepalived start ,再次启动 keepalived
- 通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip