Nginx+keepalived实现高可用

543 阅读5分钟

如果nginx在生产环境是单节点部署,一但服务挂机或者nginx进程被kill,对用户体验感无疑是很差的。通过keepalived的VIP机制可以实现nginx的高可用,VIP是 Vitural Ip,及虚拟IP实现单节点的高可用。

Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现web服务的高可用。虚拟IP将N台提供相同功能的Nginx节点组成一个路由器组,这个组里面有一个master,多个backup。backup节点如果收不到master节点的vrrp包就认为master挂了,这时候就需要优先级来选择一个backup当master节点,这样就保证了服务的高可用。

keepalived 下载

  1. 下载地址link.juejin.cn/?target=htt…
wget https://keepalived.org/software/keepalived-2.2.7.tar.gz

keepalived 安装

  1. 解压
tar -zxvf keepalived-2.2.7.tar.gz
  1. 指定安装keepalived的位置,进行编译
cd keepalived-2.2.7
./configure --prefix=/soft/keepalived
  1. 编译和安装同时进行
make && make install
  1. 编辑主机的keepalived.conf核心配置文件,如下
global_defs {
    # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
    notification_email {
        root@localhost
    }
    notification_email_from root@localhost
    smtp_server localhost
    smtp_connect_timeout 30
    # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)
	router_id 192.168.88.10 
}

# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {
    # 之前编写的nginx重启脚本的所在位置
	script "/soft/scripts/keepalived/check_nginx_pid_restart.sh" 
    # 每间隔3秒执行一次
	interval 3
    # 如果脚本中的条件成立,重启一次则权重-20
	weight -20
}

# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {
    # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)
	state MASTER
    # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置
	interface ens33 
    # 虚拟路由的ID号,主从两个节点设置必须一样
	virtual_router_id 121
    # 填写本机IP
	mcast_src_ip 192.168.88.10
    # 节点权重优先级,主节点要比从节点优先级高
	priority 100
    # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题
	nopreempt
    # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)
	advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将track_script块加入instance配置块
    track_script {
        # 执行Nginx监控的脚本
		check_nginx_pid_restart
    }

    virtual_ipaddress {
        # 虚拟IP(VIP),也可扩展,可配置多个。
	192.168.88.100
    }
}

主从节点都需要在/soft/keepalived/etc/keepalived 目录下创建该文件,从节点需要修改router_id、priority、mcast_src_ip 配置项,其中 priority必须比主节点的值小,mcast_src_ip和router_id最好是从节点ip。

  1. 由于安装keepalived时,是自定义的安装位置,因此需要拷贝一些文件到系统目录中:
cp /soft/keepalived/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/init.d/
cp /soft/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /soft/keepalived/keepalived-2.2.7/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /soft/keepalived/sbin/keepalived /usr/sbin/
  1. 编写Nginx的重启脚本,check_nginx_pid_restart.sh
   # 创建脚本目录
   mkdir -p /soft/scripts/keepalived
   # 创建sh文件,复制下面的shell脚本并保存
   vim check_nginx_pid_restart
#!/bin/sh
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中
nginx_number=`ps -C nginx --no-header | wc -l`
# 判断后台是否还有Nginx进程在运行
if [ $nginx_number -eq 0 ];then
    # 如果后台查询不到`Nginx`进程存在,则执行重启指令
    /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf
    # 重启后等待1s后,再次查询后台进程数
    sleep 1
    # 如果重启后依旧无法查询到nginx进程
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        # 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务
        systemctl stop keepalived.service
    fi
fi
  1. keepalived加入系统服务并设置开启自启动,然后测试启动是否正常
[root@localhost]# chkconfig keepalived on 
[root@localhost]# systemctl daemon-reload 
[root@localhost]# systemctl enable keepalived.service 
[root@localhost]# systemctl start keepalived.service 

#禁止开机自动启动: systemctl disable keepalived.service 
# 重启keepalived systemctl restart keepalived.service 
# 停止keepalived systemctl stop keepalived.service 
# 查看keepalived运行时日志 tail -f /var/log/messages
 
  1. 测试一下VIP是否生效,通过查看本机是否成功挂载虚拟IP
ip addr

image.png

从图中可以看到 192.168.88.100已经挂载到了ens33网卡上,但从节点不会挂载这个虚拟ip,只有当主节点下线后从节点才会主动挂载192.168.88.100,接替VIP。此时在宿主机windows环境下ping 192.168.88.100看是否能正常通信。

image.png

外部通过VIP也能访问系统,证明虚拟IP配置成功。

Nginx高可用测试

  1. 修改nginx.conf配置
sever{ 
    listen 80; 
    # 这里从机器的本地IP改为虚拟IP 
    server_name 192.168.88.100; # 如果这里配置的是域名,那么则将域名的映射配置改为虚拟IP
 }

重启nginx

/soft/nginx/sbin/nginx -s reload
  1. 手动停止master节点nginx,过3秒检查nginx服务是否启动

image.png

在上述过程中,首先分别启动了keepalived、nginx服务,然后通过手动停止nginx的方式模拟了Nginx宕机情况,过了片刻后再次查询后台进程,我们会发现nginx依旧存活。

  1. 模拟主节点keepalived服务宕机,检查从节点是否自动挂载VIP
# 停止keepalived服务
systemctl stop keepalived.service
# 查看服务器网卡信息
ip addr

image.png

通过手动关闭keepalived服务模拟了机器断电、硬件损坏等情况(因为机器断电等情况=主机中的keepalived进程消失),然后再次查询了一下本机的IP信息,很明显会看到VIP消失了!

现在再切换到另外一台机器来看看情况

image.png

此刻我们会发现,在主机192.168.12.129宕机后,VIP自动从主机飘移到了从机192.168.88.11上,而此时客户端的请求就最终会来到130这台机器的Nginx

那么,利用KeepalivedNginx做了主从热备之后,无论是遇到线上宕机还是机房断电等各类故障时,都能够确保应用系统能够为用户提供7x24小时服务。