nginx:负载均衡实战(四)nginx+keepalived配置双机热备

1.下载安装

下载keepalived地址:http://www.keepalived.org/download.html
解压安装:
tar -zxvf keepalived-1.2..tar.gz 安装openssl依赖
yum install -y openssl openssl-devel
cd keepalived-1.2./
./configure --prefix=/$URL/keepalived(这个是你解压的keepalived的目录下的keepalived,这个命令目前找不到博客说是用来干哈的,等找到了这里更新一下。。) 安装
make && make install

2.安装为系统服务

创建文件夹,将keepalived配置文件进行复制:($URL是你装keepalived的地方 )
mkdir /etc/keepalived
cp /$URL/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后复制keepalived脚本文件:
cp /$URL/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /$URL/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#使用whereis keepalived可以查看keepalived的相对位置
ln -s /$URL/sbin/keepalived /usr/sbin/ #这句可以不用执行,只执行下面这一句就可以了
ln -s /$URL/local/keepalived/sbin/keepalived /sbin/

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

可见安装为系统服务的时候需要在/user/sbin下面有这样的一个软连接。

这个时候可以启动一下service keepalived start试试看成功了么

3.修改配置文件

vi /etc/keepalived/keepalived.conf

主:

! Configuration File for keepalived

global_defs {
router_id bhz005 ##标识节点的字符串,通常为hostname
}
## keepalived 会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-,也就是由100 - 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。
如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ##执行脚本位置
interval ##检测时间间隔
weight - ## 如果条件成立则权重减20(-)
}
## 定义虚拟路由 VI_1为自定义标识。
vrrp_instance VI_1 {
state MASTER ## 主节点为MASTER,备份节点为BACKUP
## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth6)
interface eth6
virtual_router_id ## 虚拟路由ID号
mcast_src_ip 192.168.1.172 ## 本机ip地址
priority ##优先级配置(-254的值)
Nopreempt ##
advert_int ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication {
auth_type PASS
auth_pass bhz ## 真实生产环境下对密码进行匹配
} track_script {
chk_nginx
} virtual_ipaddress {
192.168.1.170 ## 虚拟ip(vip),可以指定多个
}
}

! Configuration File for keepalived

global_defs {
router_id bhz006
} vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval
weight -
} vrrp_instance VI_1 {
state BACKUP
interface eth7
virtual_router_id
mcast_src_ip 192.168.1.173
priority ##优先级配置
advert_int
authentication {
auth_type PASS
auth_pass bhz
} track_script {
chk_nginx
} virtual_ipaddress {
192.168.1.170
}
}

注意:当前为抢占式配置,也就是说,master在宕机后backup会顶上去成为主。然后原来的master修好以后,会回来抢夺master的位置。非抢占式就是说master即使宕机了然后修好回来,也不会和当前的新master争夺新的位置,是吧,大不了本阿哥不当皇帝,佛着也挺好的。那么怎么配置佛系非抢占呢?将主和从的状态都变为backup,加上nopreempt 即可不争夺资源,但是这种情况下,心跳脚本必须检测我们nginx的状况,当nginx挂了的时候拉起来,实在拉不起来的时候就得杀掉我们的keepalived,否则的话不能实现切换。

nopreempt 

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

4.脚本编写

脚本的编写思路就像上面非抢占的说的,检测nginx进程,然后进程为0的话拉起nginx,如果nginx是扶不起来的阿斗的话把keepalived杀了。

#!/bin/bash
echo "[nginx_check.sh]:now prepareing to healthy check " >> /var/log/messages
n=`ps -C nginx --no-heading|wc -l`
if [ $n -eq "0" ]; then
echo "[ nginx_check.sh]:now start nginx">> /var/log/messages
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "[nginx_check.sh]:nginx down,keepalived will stop" >> /var/log/messages
systemctl stop keepalived
fi
fi

 写完一定要赋予这个脚本权限,我这里直接给出最简单的777哈

chmod 777 /etc/keepalived/nginx_check.sh

5.启动keepalived(得先启动nginx)

service nginx start
service keepalived start
ps -ef | grep nginx
ps -ef | grep keepalived

这时候keepalived的控制台会一直打印日志

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

如果启动出错,通过systemctl status keepalived.service查看错误日志

如果报错如下:

[root@BanAn-nginx2 sbin]# systemctl status keepalived.service
● keepalived.service - SYSV: Start and stop Keepalived
Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
Active: failed (Result: exit-code) since 一 2018-12-17 17:02:33 CST; 1min 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 25668 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=1/FAILURE) 12月 17 17:02:33 BanAn-nginx2 systemd[1]: Starting SYSV: Start and sto....
12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: Starting keepalived: /…令
12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: [失败]
12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service: control ...1
12月 17 17:02:33 BanAn-nginx2 systemd[1]: Failed to start SYSV: Start ....
12月 17 17:02:33 BanAn-nginx2 systemd[1]: Unit keepalived.service ente....
12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
[root@BanAn-nginx2 sbin]# systemctl status keepalived.service -l
● keepalived.service - SYSV: Start and stop Keepalived
Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
Active: failed (Result: exit-code) since 一 2018-12-17 17:02:33 CST; 2min 9s ago
Docs: man:systemd-sysv-generator(8)
Process: 25668 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=1/FAILURE) 12月 17 17:02:33 BanAn-nginx2 systemd[1]: Starting SYSV: Start and stop Keepalived...
12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: Starting keepalived: /bin/bash: keepalived: 未找到命令
12月 17 17:02:33 BanAn-nginx2 keepalived[25668]: [失败]
12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service: control process exited, code=exited status=1
12月 17 17:02:33 BanAn-nginx2 systemd[1]: Failed to start SYSV: Start and stop Keepalived.
12月 17 17:02:33 BanAn-nginx2 systemd[1]: Unit keepalived.service entered failed state.
12月 17 17:02:33 BanAn-nginx2 systemd[1]: keepalived.service failed.
[root@BanAn-nginx2 sbin]# cd /usr/sbin/

那么这样做就可以了

cd /usr/sbin/
rm -f keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

好的,现在的东西起来了哈!

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

ps:关闭keepalived:

/etc/init.d/keepalived stop

6.测试

6-1 虚拟ip查看

首先我们看看虚拟ip起来没有。不要用ifconfig,用 ip a

ip a

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

在这里会出现我们在主从里面配置的虚拟ip,我这里配的是18,和上面不太一样哈。如果没有出来的自己检查网卡去。

如果没有出来的话就是配置出错,如果两台主从机同时都出现这个虚拟的ip,说明发生了脑裂

6-2 脑裂问题

查看日志

tail -f  /var/log/messages

发现master和backup机都是mastaer模式启动的

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

通过查看别人的经历,发现VRRP基于报文实现的。master设置一定时间发送一个报文给backup如果backup没有收到就自己成为master。可推出导致问题的原因是因为backup没有收到文

所以自己成为了master。

VRRP控制报文只有一种:VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内。这保证了VRID在不同网络中可以重复使用。为了减少网络带宽消耗只有主控路由器才可以周期性的发送VRRP通告报文。备份路由器在连续三个通告间隔内收不到VRRP或收到优先级为0的通告后启动新的一轮VRRP选举。

centos7安装keepalived后,不关闭防火墙,虚拟ip不能实现漂移,双机都为master,不能实现双机热备的效果。原因是防火墙中没有方形vrrp的组播 IP 244.0.0.18。centos7下使用的防火请是firewall,本人不会使用centos7默认的防火墙放行组播IP,所以禁用掉centos7默认的防火墙,使用iptables防火墙。

、关闭默认的firewall防火墙
#systemctl stop firewalld.service停止firewalld服务
#systemctl disable firewalld.service进制开机自启动 、开启iptables
#yum install iptables(根据centOS7的版本和内核,有些版本已经装过,可以跳过此命令) #yum install iptables-services 、编辑iptables文件
#vim /etc/sysconfig/iptables
在文件中添加一下内容
-A OUTPUT -o eno16777736 -d 224.0.0.18 -j ACCEPT 注解:eno16777736 是网卡名称
-A OUTPUT -o eno16777736 -s 224.0.0.18 -j ACCEPT
-A INPUT -i eno16777736 -d 224.0.0.18 -j ACCEPT
-A INPUT -i eno16777736 -s 224.0.0.18 -j ACCEPT 、开启服务,设置开机自启动
#service iptables restart #chkconfig iptables on或者systemctl enable iptables.service开机自启 此时就能实现虚拟ip的漂移,当master(keepalived)挂掉时,虚拟ip会漂移到backup(keepalived)上,master启动后虚拟ip又飘逸回来。

6-3 测试方法

【1】抢占式

抢占式的配置下,首先查看日志,确定哪台是主哪些是从机。然后修改主机的nginx.conf,让该配置文件不正常。

然后service nginx stop,主机会尝试拉起来,拉不动后主机keepalived宣布over,备用机变为主机。

最后将原主机的nginx.conf恢复正常,看看原主机会不会回来夺回master,如果夺回说明抢占式配置成功。

【2】非抢占式配置

同抢占式,首先查看日志确定主从,修改主的nginx,conf,主拉不动nginx宣布keepalived凉了,于是切换备用机为主。

然后恢复之前的主,如果正常恢复而且不去抢夺说明是成功的。

ps:本项目中使用抢夺的,因为不想执行kill keepalived的进程。

nginx:负载均衡实战(四)nginx+keepalived配置双机热备

上一篇:linux下安装编译网卡驱动的方法


下一篇:[转]如何在ASP.NET Core中实现一个基础的身份认证