在架构设计中,可以利用 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 应用是已经配置好的环境,这里就不介绍相关的配置。具体可以查考以下两篇博文:
-
Nginx系列:Nginx源码安装
-
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
喜欢,在看