keepalived实现nginx软负载

前言

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

结束语

今天一通操作下来,花了好几个小时,主要是踩一下坑!不过还是很爽的!
学无止境,诸君共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值