一、環境介紹
[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