在架构设计中,可以利用 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 {
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
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
推荐阅读:
欢迎关注微信公众号:互联网全栈架构,收取更多有价值的信息。