如果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 下载
wget https://keepalived.org/software/keepalived-2.2.7.tar.gz
keepalived 安装
- 解压
tar -zxvf keepalived-2.2.7.tar.gz
- 指定安装keepalived的位置,进行编译
cd keepalived-2.2.7
./configure --prefix=/soft/keepalived
- 编译和安装同时进行
make && make install
- 编辑主机的
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。
- 由于安装
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/
- 编写
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
- 将
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
- 测试一下
VIP
是否生效,通过查看本机是否成功挂载虚拟IP
ip addr
从图中可以看到 192.168.88.100已经挂载到了ens33网卡上,但从节点不会挂载这个虚拟ip,只有当主节点下线后从节点才会主动挂载192.168.88.100,接替VIP。此时在宿主机windows环境下ping 192.168.88.100看是否能正常通信。
外部通过VIP也能访问系统,证明虚拟IP配置成功。
Nginx高可用测试
- 修改nginx.conf配置
sever{
listen 80;
# 这里从机器的本地IP改为虚拟IP
server_name 192.168.88.100; # 如果这里配置的是域名,那么则将域名的映射配置改为虚拟IP
}
重启nginx
/soft/nginx/sbin/nginx -s reload
- 手动停止master节点nginx,过3秒检查nginx服务是否启动
在上述过程中,首先分别启动了
keepalived、nginx
服务,然后通过手动停止nginx
的方式模拟了Nginx
宕机情况,过了片刻后再次查询后台进程,我们会发现nginx
依旧存活。
- 模拟主节点keepalived服务宕机,检查从节点是否自动挂载VIP
# 停止keepalived服务
systemctl stop keepalived.service
# 查看服务器网卡信息
ip addr
通过手动关闭
keepalived
服务模拟了机器断电、硬件损坏等情况(因为机器断电等情况=主机中的keepalived
进程消失),然后再次查询了一下本机的IP
信息,很明显会看到VIP
消失了!
现在再切换到另外一台机器来看看情况
此刻我们会发现,在主机
192.168.12.129
宕机后,VIP自动从主机飘移到了从机192.168.88.11
上,而此时客户端的请求就最终会来到130
这台机器的Nginx
上
那么,利用Keepalived
对Nginx
做了主从热备之后,无论是遇到线上宕机还是机房断电等各类故障时,都能够确保应用系统能够为用户提供7x24
小时服务。