前言
nginx一般用作集群的反向代理,前端的请求先到nginx,nginx再将请求分发给集群中的机器,这样可以有效的避免单点故障。但有一个问题,nginx挂掉了怎么办?岂不是所有的东西都不能玩了!
一般都是做nginx集群,始终保证有nginx存活着,但是不是感觉又有问题呢?nginx集群前面负责路由的那台机器是单点的,死掉了怎么办?
这时候是不是感觉陷入了死循环。
ok,解决该问题,方式有很多,以下提出两个:
1 域名解析到多个nginx,一个域名可以解析到多个ip
2 使用keepalived在多个nginx上层,虚拟出一个浮动ip,虚拟出来的机器总不会挂掉吧!
下面主要实现第二种方式
环境准备
- 两台centos7虚拟机(ip分别是192.168.61.111,192.168.61.112)
操练起来
两台机器中的相同操作
- linux安全策略关掉,否则可能玩不转
vi /etc/sysconfig/selinux
# 将SELINUX的值设置为disabled
SELINUX=disabled
# 保存退出
- 安装keepalived的依赖包
yum -y install libnl libnl-devel libnfnetlink-devel
- 下载并解压keepalived的安装包
cd /usr/local/src
wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
tar -zxvf keepalived-1.3.4.tar.gz
- 安装keepalived
指定keepalived的安装目录:–prefix=/usr/local/keepalived
指定keepalived的配置目录:–sysconf=/etc
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
修改两台机器的keepalived配置文件
- 进入192.168.61.111的keepalived配置目录中(/etc/keepalived)
cd /etc/keepalived
vi keepalived.conf
#以下是要保留修改的配置,其他的可以删掉
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 该机器上的keepalived路由id,要全局唯一,避免错乱
}
vrrp_instance VI_1 { # 虚拟出的机器配置信息
state MASTER
interface ens33 # 绑定当前网卡
virtual_router_id 51 # 路由组ID,两台机器配置保持一致
priority 200 # 权重,谁大谁是主
advert_int 1 # 心跳的间隔时间 s
authentication { # 验证信息
auth_type PASS
auth_pass 1111
}
# 虚拟出的机器ip信息,可以多个
virtual_ipaddress {
192.168.61.200
}
}
- 进入192.168.61.112的keepalived配置目录中(/etc/keepalived)
cd /etc/keepalived
vi keepalived.conf
#以下是要保留修改的配置,其他的可以删掉
! Configuration File for keepalived
global_defs {
router_id LVS_1 # 该机器上的keepalived路由id,要全局唯一,避免错乱
}
vrrp_instance VI_1 { # 虚拟出的机器配置信息
state one
interface ens33 # 绑定当前网卡
virtual_router_id 51 # 路由组ID,两台机器配置保持一致
priority 100 # 权重,谁大谁是主
advert_int 1 # 心跳的间隔时间 s
authentication { # 验证信息
auth_type PASS
auth_pass 1111
}
# 虚拟出的机器ip信息,可以多个
virtual_ipaddress {
192.168.61.200
}
}
测试一下
- 启动两台机器的keepalived
/usr/local/keepalived/sbin/keepalived # 启动keepalived
ip addr # 查询ip地址
IP111的详情
IP112的详情,因为配置他是从机,所以不会有什么变化
- 杀掉111的keepalived
ps -ef|grep keep
kill -9
111的ip详情,浮动出来的200IP不见了
112的ip详情,新增了浮动IP200
ps:如果你出现了脑裂的现象(主从都有虚拟的200IP,请参考下面问题的解决方案)
配置keepalived监听nginx
上面一大坨,是不是玩的很开心。但主题是监听nginx啊。keepalived默认是只监听自己的keepalived程序,不会去管你nginx死活的。
ok,所以,我们要在keepalived的配置文件中配置一个脚本,大概的作用就是:监听nginx是否存活,如果nginx挂掉了,就把他拉起来。如果拉不起来,就将自己干掉!保证可以路由到从机上去
- 新建一个sh脚本
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx # 重启nginx
#重启nginx事变,则杀掉keepalived服务
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived # 杀掉keepalived,vip会自动漫游
fi
fi
- 修改两台机器的keepalived配置文件,以主机为例
! Configuration File for keepalived
global_defs {
enable_script_security # 允许执行脚本
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/etc/keepalived/chk_nginx.sh" # 要执行的检测脚本
interval 2 # 2s执行一次
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script { # 触发脚本执行
chk_nginx
}
virtual_ipaddress {
192.168.61.200
}
}
- 设置脚本chk_nginx.sh权限为755
chmod 755 chk_nginx.sh
- 重启keepalived
会发现nginx被自动拉起来了,并且nginx -s stop不管用了,nginx杀不死了!除非你把keepalived干掉
测试nginx集群配置
- 111IP为主时,默认访问到的是111上的nginx
- 111IP被干掉时,访问的是112上的nginx
- 111IP又上线时,访问的是111上的nginx
到这里所有的配置也就完结了!好爽啊
问题
主从同时显示浮动IP
先讲下这个问题是啥,就是脑裂现象。出现这个问题的原因呢?就是keepalived通过vrrp进行组网,如果防火墙不让通过,也就会出现主从协调不了的情况,都会认为自己是master,所以就都浮动了个虚拟IP出来。
解决方法:
两台机器都在防火墙中添加允许vrrp协议通过
# centos7是这么配置
# 防火墙中添加允许vrrp协议通过
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 防火墙中删除允许vrrp协议通过
firewall-cmd --direct --permanent --remove-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 重启防火墙
service firewalld restart
keepalived的日志哪里看
其实配置过程中,也翻了很多车,都是查看日志才解决的
tail -200f /var/logs/messages # keepalived的日志默认放在这里
监听脚本执行不成功怎么办
我的现象是出现日志:scripts are being executed but script_security not enabled.
排查思路:
1 看下脚本能否单独执行
2 脚本的执行权限修改为755
3 keepalived.conf配置文件中global_defs,新增:enable_script_security
结束语
今天一通操作下来,花了好几个小时,主要是踩一下坑!不过还是很爽的!
学无止境,诸君共勉!