一、环境介绍
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1062.4.3.el7.x86_64 #1 SMP Wed Nov 13 23:58:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)
[root@localhost ~]#
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@localhost ~]#
二、拓扑图
三、准备工作
- 在nginx01、nginx02分别安装nginx和keepalived并设置开机启动
- 在apache01、apache01分别安装apache、并设置开机启动
因为我们只是学习测试,所以所有的服务都是用yum安装的,安装过程就不显示了。大家自行解决,写出来太丢人了。
四、配置nginx负载均衡
vim /etc/nginx/nginx.conf
在http标签中添加:
upstream myweb {
server 192.168.1.3:80;
server 192.168.1.4:80;
}
在server标签中的添加 :
location / {
proxy_pass http://myweb;
}
配置完重启nginx服务。
五、配置keepalived
在主nginx01服务器的配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict #此处如果不注释掉,则无法ping通VIP
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 55 #此处和备用必须一致,但是和局域网中其他的keeplived集群不能相同
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.10
}
}
注意:vrrp_strict #此处如果不注释掉,则无法ping通VIP
以上是主nginx01服务器的配置,可以复制到nginx02
在nginx02上只需要修改以下几个地方即可:
state BACKUP
interface ens33
priority 80
修改完毕后记得重启keepalived服务 。
六、测试效果
1、效果1
- nginx01服务器停止keepalived服务,5秒之后nginx02会接管。
- nginx01服务器恢复keepalived服务,5秒之后nginx01会接管。
- 中间有5-10秒的间隔。
2、效果2
- 关闭nginx01服务器,5秒之后nginx02会接管。
- 开启nginx01服务器,5秒之后nginx01会接管。
3、效果3
- 关闭nginx01服务器的nginx服务,nginx02不会接管,整个集群宕机对外业务中断。
原因:是我没有添加检测nginx存活的脚本。
原理:这种部署方式,在不添加脚本的情况下只能默认检测keepalived服务,如果keepalived服务挂了,备用可以接管。但是心跳检测也仅仅只是检测keepalived服务,keepalived服务上面绑定了VIP地址,换句话说他仅仅检测的是VIP是否能ping通。
如果是nginx01主服务器的nginx服务死了,备用nginx02服务器是不会接管的。必须利用脚本才能实现。因为nginx服务虽然死了,但是keepalived服务没死,也就意味着VIP可以ping通,所以他是不会切换的。
总结
因此利用这种部署方式,必须添加检测nginx存活的脚本。
我这里有两个脚本,但是和本教程无关,大家可以参考。
这个是别人的脚本,执行了一下有错误。
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
当nginx进程不存在时,就干掉keepalived进程。
#!/bin/bash
#当nginx进程不存在时,就干掉keepalived
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
killall keepalived
fi
注意问题:
keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭
- 解决: 原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
- 原理:https://blog.csdn.net/charthyf/article/details/81456872