8. Nginx 配合 + Keepalived 搭建高可用集群
8. Nginx 配合 + Keepalived 搭建高可用集群
文章目录
- 8. Nginx 配合 + Keepalived 搭建高可用集群
- 1. Keepalived + Nginx 高可用集群(主从模式)
- 2. 具体搭建步骤
- 3. 自动检测 Nginx 异常, 终止 keepalived
- 4. 配置文件 keepalived.conf 详解
- 5. 最后:
1. Keepalived + Nginx 高可用集群(主从模式)
集群架构图:
- 准备两台 nginx 服务器, 一台做主服务器, 一台做备份服务器
- 两台 Nginx 服务器的 IP 地址, 可以自己配置,
- 安装 keepalived , 保证主从之间的通讯
- 对外提供统一的访问 IP(虚拟 IP-VIP)
2. 具体搭建步骤
- 搭建高可用集群基础环境
准备两台 Linux 服务器 192.168.198.166 和 192.168.198.167
可以克隆来完成,也可以直接拷贝一份虚拟机。
在两台 Linux 服务器 安装并配置好,Nginx
安装配置 Nginx 步骤前面讲过 如果你克隆的 Linux, 本身就有安装好了 Nginx, 直接使 ,
用即可.
验证安装是否成功, 在 windows 可以通过 IP 访问到 Nginx, 具体的操作步骤和注意事 项, 前面也都是说过了
因为我们是拷贝了一份 Linux , 而新的 Linux 的 Ip 已经变化了 所以需要克隆的 Linux ,
的 nginx.conf 文件中的 IP 地址 做相应的修改
- 将两个 Linux 虚拟机当中的 Tomcat 都启动起来,测试是否可以访问
- 启动 192.168.76.166 IP 地址的两个 Tomcat ,测试访问。
启动 192.168.76.166 的 Nginx
浏览器输入:http://192.168.76.166/search/cal.jsp
- 启动 192.168.76.167 IP 地址的两个 Tomcat ,测试访问。
启动 192.168.76.167 IP 地址 下的 Nginx
浏览器输入:http://192.168.76.167/search/cal.jsp
- 在 两台 Linux 的虚拟机当中安装 keepalived
载 keepalived-2.0.20.tar.gz 源码安装包, https://keepalived.org/download.html
- 上传到两台 Linux /root 目录下
- 在 Linux 两个虚拟机当中 root 目录下,创建 keepalived 目录
mkdir /root/keepalived
20250226192006182.png&pos_id=img-LJgXREho-1740878883268)
- 两个 Linxu 虚拟机当中,将
keepalived-2.0.20.tar.gz
解压文件到指定目录: tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived[root@localhost ~]# tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived
- 两个 Linxu 虚拟机当中,进入到
/root/keepalived/keepalived-2.0.20
目录当中cd /root/keepalived/keepalived-2.0.20
- 两个 Linux 虚拟机当中执行:
./configure --sysconf=/etc --prefix=/usr/local
命令。 在:/root/keepalived/keepalived-2.0.20
下执行。./configure --sysconf=/etc --prefix=/usr/local # 说明: 将配置文件放在 /etc 目录下, 安装路径在 /usr/local
[root@localhost keepalived-2.0.20]# ./configure --sysconf=/etc --prefix=/usr/local
- 在两个 Linux 虚拟机当中的执行该指令,
make && make install
编译。
[root@localhost keepalived-2.0.20]# make && make install
- 如果成功, 就会安装好 keepalived
说明: keepalived 的配置目录在 /etc/keepalived/keepalived.conf
keepalived 的启动指令在 /usr/local/sbin/keepalived
说明安装成功了
说明:两个 Linux 虚拟机都安装成功了 keepalived 。
- 在 keepalived 当中配置,完成高可用集群配置
- 将其中一台 Linux( 这里我们将 192.168.76.166 指定为Master(主) vi /etc/keepalived/keepalived.conf
[root@localhost keepalived]# pwd /etc/keepalived [root@localhost keepalived]# vim keepalived.conf
3 global_defs { 4 notification_email { 5 acassen@firewall.loc 6 failover@firewall.loc 7 sysadmin@firewall.loc 8 } 9 notification_email_from Alexandre.Cassen@firewall.loc 10 smtp_server 192.168.200.1 11 smtp_connect_timeout 30 12 router_id rainbowsea100 13 vrrp_skip_check_adv_addr 14 #vrrp_strict 15 vrrp_garp_interval 0 16 vrrp_gna_interval 0 17 } 18
机器名尽量不要有下划线,不然容易报错。
19 vrrp_instance VI_1 { 20 state MASTER 21 interface ens33 22 virtual_router_id 51 23 priority 100 24 advert_int 1 25 authentication { 26 auth_type PASS 27 auth_pass 1111 28 } 29 virtual_ipaddress { 30 192.168.76.18 31 #192.168.200.16 32 #192.168.200.17 33 #192.168.200.18 34 } 35 } 36
- 启动这台作为主的 Linux 的 keepalived 指令:
/usr/local/sbin/keepalived
,就是执行该路径下的这个 keepalived 命令[root@localhost keepalived]# /usr/local/sbin/keepalived
- 观察这台 linux 的 ens33 是否已经绑定 192.168.200.18 ,我们在
/etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 }
属性。[root@localhost keepalived]# ip a
- 将其中一 台虚拟 Linux主机( 这里我们将 192.168.76.167) 指 定 为 Backup( 备 份 服 务 器 ) : vi /etc/keepalived/keepalived.conf
3 global_defs { 4 notification_email { 5 acassen@firewall.loc 6 failover@firewall.loc 7 sysadmin@firewall.loc 8 } 9 notification_email_from Alexandre.Cassen@firewall.loc 10 smtp_server 192.168.200.1 11 smtp_connect_timeout 30 12 router_id rainbwosea600 13 vrrp_skip_check_adv_addr 14 #vrrp_strict 15 vrrp_garp_interval 0 16 vrrp_gna_interval 0 17 }
19 vrrp_instance VI_1 { 20 state BACKUP 21 interface ens33 22 virtual_router_id 51 23 priority 80 24 advert_int 1 25 authentication { 26 auth_type PASS 27 auth_pass 1111 28 } 29 virtual_ipaddress { 30 192.168.76.18 31 #192.168.200.16 32 #192.168.200.17 33 #192.168.200.18 34 } 35 }
- 启动这台作为主的 Linux 的 keepalived 指令:
/usr/local/sbin/keepalived
,就是执行该路径下的这个 keepalived 命令[root@localhost keepalived]# /usr/local/sbin/keepalived
- 观察这台 linux 的 ens33 是否已经绑定 192.168.200.18 ,我们在
/etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 }
属性。[root@localhost keepalived]# ip a
- 测试 Windows 是否可以 ping 我们的keepalived 配置的
/etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 }
属性。
同时测试两台 Linux 虚拟机是否可以 ping 同我们的的keepalived 配置的/etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 }
属性。
[root@localhost keepalived]# ping 192.168.76.18
如果无法 ping 通,keepalived 启动后无法 ping 通 VIP,提示 ping: sendmsg: Operation not permitted
解决方法,如果不是配置上出错了,则大家可以移步至:✏️✏️✏️ https://blog.csdn.net/xjuniao/article/details/101793935 尝试解决
nginx+keepalived 配置说明和需要避开的坑https://blog.csdn.net/qq_42921396/article/details/123074780
- 测试:
首先: 首先保证 windows 可以连通 192.168.76.18 这个虚拟 IP
访问 nginx 如图。浏览器输入我们这个 keepalived 配置的公共对外的 192.168.76.18
的。
http://192.168.76.18/search/cal.jsp
大家可以看到, 因为 192.168.76.166 是 Master 他的优先级高 所以访问的就是 ,
192.168.76.166 的 Nginx, 同时仍然是支持负载均衡的。
停止 192.168.76.166 的 keepalived (Master) 服务, 或者直接关闭 192.168.76.166 主机, 再 次 访 问 http://192.168.76.166/search/cal.jsp , 这时虚拟 IP绑定发生漂 移绑定到 ,192.168.76.167 Backup
服务 访问效果如图:
这里我们直接关闭 192.168.76.166 Master 的 keepalived 来测试
[root@localhost keepalived]# killall keepalived # 关闭 keepalived 服务
浏览器访问:http://192.168.76.18/search/cal.jsp
再次测试,我们将:192.168.76.166 的作为 Master 的 keepalived 服务重新启动后,浏览器访问:http://192.168.76.18/search/cal.jsp
[root@localhost keepalived]# /usr/local/sbin/keepalived
[root@localhost keepalived]# ps -aux | grep keepalived
3. 自动检测 Nginx 异常, 终止 keepalived
这里我们演示 keepalived 服务不关闭,但是我们关闭 Nginx 服务,浏览器访问:http://192.168.76.18/search/cal.jsp 会存在一个报错。
[root@localhost nginx]# ./sbin/nginx -s stop # 关闭 Nginx 服务
[root@localhost nginx]# ps -aux | grep nginx
root 12644 0.0 0.0 112812 980 pts/0 S+ 05:13 0:00 grep --color=auto nginx
[root@localhost nginx]#
报错:因为:keepalived 无法\自动检测 Nginx 异常。这里我们的 Nginx 已经被关闭了。但是 keepalived 还想通过 Nginx 反向代理访问Tomcat 就报错。
解决方法:
我们可以编写一个 shell 脚本 ,让 keepalived 可以自动检测 Nginx 是否失效了。
- 编写 shell 脚本: vi /etc/keepalived/rsnginx.sh
[root@localhost keepalived]# vim /etc/keepalived/rsnginx.sh
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
killall keepalived
fi
简单说明: 下面的脚本就是去统计
ps -C nginx --no-header
的行数, 如果为 0 , 说明 nginx 已经异常终止了, 就执行killall keepalived
- 修改我们编写的 shell 脚本的修改
/etc/keepalived/rsnginx.sh
权限
root@localhost keepalived]# chmod 755 rsnginx.sh
- 修改 192.168.76.166 主 Master 配置文件 指令 :
vim /etc/keepalived/keepalived.conf
[root@localhost keepalived]# vim /etc/keepalived/keepalived.conf
18 vrrp_script rsnginx{
19 script "/etc/keepalived/rsnginx.sh"
20 interval 2
21 weight -20
22
23 }
24
25 vrrp_instance VI_1 {
26 state MASTER
27 interface ens33
28 virtual_router_id 51
29 priority 100
30 advert_int 1
31 authentication {
32 auth_type PASS
33 auth_pass 1111
34 }
35 virtual_ipaddress {
36 192.168.76.18
37 #192.168.200.16
38 #192.168.200.17
39 #192.168.200.18
40
41 }
42 track_script{
43 rsnginx
44 }
45 }
- 重新启动 192.168.76.166 Master 的 keepalived(重启读取配置) , 再重新启动 Nginx 这时因为 Master 的优先级高,会争 夺到 VIP 优先绑定
注意:先启动 keepalived,再启动 Nginx 。
[root@localhost keepalived]# /usr/local/sbin/keepalived
[root@localhost keepalived]# ps -aux | grep keepalived
[root@localhost sbin]# /usr/local/nginx/sbin/nginx
[root@localhost sbin]# ps -aux | grep nginx
- 测试:
浏览器访问:http://192.168.76.18/search/cal.jsp
再次演示:我们关闭 Nginx 服务,但是 keepalived 服务不关闭浏览器访问:http://192.168.76.18/search/cal.jsp 就不会报错了。
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost sbin]# ps -aux | grep nginx
root 12945 0.0 0.0 112812 980 pts/0 S+ 05:37 0:00 grep --color=auto nginx
注意观察 keepalived 也终止了
注意事项:
- keepalived vrrp_script 脚本不执行解决办法
-打开日志观察
tail -f /var/log/messages
-重启 keepalived
systemctl restart keepalived.service
曾经出现过文件找不到 可以修改执行脚本文件名,不要有_ 就 OK
如果配置有定时检查 Nginx 异常的脚本, 需要先启动 nginx ,在启动 keepalived ,否则 keepalived 一起动就被 killall 了
提醒: 小伙伴们配置时,会遇到各种各样问题,有针对性解决即可
4. 配置文件 keepalived.conf 详解
#这里只注释要修改的地方
global_defs {
notification_email {
test@foxmail.com #接收通知的邮件地址
}
notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱 smtp_server 192.168.200.1 #smtp server 地址
smtp_connect_timeout 30
router_id Node132 # #Node132 为主机标识
vrrp_skip_check_adv_addr
#vrrp_strict # #这里需要注释,避免虚拟 ip 无法 ping 通
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # #主节点 MASTER 备用节点为 BACKUP
interface ens33 #网卡名称
virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一 VRRP 组
priority 100 # 主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟 IP, 两个节点设置必须一样
192.168.200.16
}
}
主服务器
在 /etc/keepalived/keepalived.conf
文件中
cat >/etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script nginx_check {
# 脚本两种写法
# 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
# script "/usr/bin/killall -0 nginx"
# 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
script "/etc/keepalived/nginx-check.sh"
interval 5 # 脚本执行间隔5s
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
# 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
# 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
weight -5
fall 3 # 检测失败3次就定义为down状态
rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}
vrrp_instance VI_1 {
state MASTER #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
priority 100 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
mcast_src_ip 192.168.62.127 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
# # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
# # 本机ip
# unicast_src_ip 192.168.124.14
# unicast_peer {
# # 其他机器ip
# 192.168.124.13
# }
# 当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
nopreempt
# 认证方式,主从需要一致否则无法通信导致脑裂
authentication {
auth_type PASS # 密码认证
auth_pass 1111 # 密码最多8位
}
track_script {
nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
}
# 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
# 这里主要是由优先级来决定的,和state设置的值没有多大关系
# 如果有多个虚拟IP 换行填写多个
virtual_ipaddress {
192.168.62.125 #虚拟IP, 主从应该填写一致
192.168.62.126 #虚拟IP, 主从应该填写一致
}
notify /etc/keepalived/notify-nginx.sh
}
EOF
备服务器:
cat >/etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script nginx_check {
# 脚本两种写法
# 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
# script "/usr/bin/killall -0 nginx"
# 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
script "/etc/keepalived/nginx-check.sh"
interval 5 # 脚本执行间隔5s
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
# 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
# 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
weight -5
fall 3 # 检测失败3次就定义为down状态
rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}
vrrp_instance VI_1 {
state BACKUP #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
priority 98 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
mcast_src_ip 192.168.62.128 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
# # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
# # 本机ip
# unicast_src_ip 192.168.124.14
# unicast_peer {
# # 其他机器ip
# 192.168.124.13
# }
# 当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
nopreempt
# 认证方式,主从需要一致否则无法通信导致脑裂
authentication {
auth_type PASS # 密码认证
auth_pass 1111 # 密码最多8位
}
track_script {
nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
}
# 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
# 这里主要是由优先级来决定的,和state设置的值没有多大关系
# 如果有多个虚拟IP 换行填写多个
virtual_ipaddress {
192.168.62.125 #虚拟IP, 主从应该填写一致
192.168.62.126 #虚拟IP, 主从应该填写一致
}
notify /etc/keepalived/notify-nginx.sh
}
EOF
更多关于 配置文件 keepalived.conf 的内容可以移步至:✏️✏️✏️ https://www.cnblogs.com/KSPT/p/HA-Keepalived-01-Keepalived.html
[root@localhost linux]# ifconfig ens33 192.168.76.130
# 修改 IP 地址,注意要是在 root 用户下。
5. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”