手把手搭建 Nginx + VIP + Keepalived 高可用集群
集群中,有一个为主Nginx,多个备Nginx,整个集群对外提供一个VIP,通过VIP访问主Nginx,备用Nginx负责监控主节点运行状态,如果发现主节点宕机,则选举其中一个备用Nginx接管主节点的工作,VIP绑定到新选举的主Nginx节点上,这个流程俗称IP漂移,从而实现了高可用。在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Tomcat等都会通过。
文章目录
1、前置讲解
其实阿里云ECS本身不支持使用服务器子网中 VIP 实现高可用 Nginx 集群,
1.1、常用方案
搭建高性能、高可用的负载均衡集群方案其实有很多,常见的例如:
- 购买、使用硬件负载均衡器 F5(性能无敌,价格贵,轻松抗下百万QPS)
- 购买、使用阿里云SLB服务(高效便捷,即买即用)
- 通过服务器搭建
Nginx + VIP + Keepalived
高可用集群(价格低,低成本,不上云场景!)
对于绝大多数的业务场景来说,都是需要使用云服务器的,所以绝大多数情况根本不会考虑使用 Nginx + VIP + Keepalived
这套高可用负载均衡方案,这套方案一般用于自建,接下来讲解以下这套集群方案搭建。
1.2、实现流程
keepalived
在之前单体架构开发时,是一个用的较为频繁的高可用技术,比如MySQL、Redis、MQ、Tomcat等都会通过keepalived
提供的虚拟IP(VIP)
机制,实现单节点应用的高可用。Keepalived是一个基于VRRP
协议来实现的服务高可用方案,VRRP协议允许一台机器可以拥有一个或者多个VIP。
在高可用Nginx
集群中,有一个为主Nginx,多个备Nginx,整个集群对外提供一个VIP,通过VIP访问主Nginx,备用Nginx负责监控主节点运行状态,如果发现主节点宕机,则选举其中一个备用Nginx接管主节点的工作,VIP绑定到新选举的主Nginx节点上,这个流程俗称IP漂移,从而实现了高可用。
2、集群搭建
2.1、环境准备
集群部署使用的是虚拟机,不能使用阿里云ECS这种服务,不支持VIP漂移:
服务器1:内网ip1
服务器2:内网ip2
虚拟IP:内网ip3
两台服务器上,都需要安装好 Docker 环境,参考该文章第1章节:
https://blog.csdn.net/weixin_46594796/article/details/122750009
2.2、关于 Nginx
2.2.1、安装 Nginx
首先,创建需要挂载宿主机目录文件夹,两台服务器上都执行:
# 创建 Nginx 挂载目录
mkdir -p /opt/nginx
mkdir -p /opt/nginx/html
mkdir -p /opt/nginx/logs
mkdir -p /opt/nginx/conf
通过下述命令先创建、启动 Nginx 容器,两台服务器上都执行:
docker run -p80:80 --name nginx -d nginx:latest
启动 Nginx 完毕后,将 nginx 配置文件拷贝到宿主机文件夹,两台服务器上都执行:
# 拷贝配置内容
docker container cp nginx:/etc/nginx /opt/nginx/conf/
# 移动配置
mv /opt/nginx/conf/nginx/* /opt/nginx/conf/
# 移除多余文件夹
rm -rf /opt/nginx/conf/nginx
两台服务器,重新启动 Nginx:
# 停止、删除容器
docker stop 容器id
docker rm 容器id
# 启动容器
docker run -p 80:80 --name nginx -d \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/logs:/var/log/nginx \
-v /opt/nginx/conf:/etc/nginx \
--privileged=true \
--restart always nginx:latest
2.2.2、调整 Nginx 首页
分别在两台服务器上修改 Nginx 的 index.html 文件内容,这样方便我们测试查看本次请求到底访问的是哪一台服务器:
# 服务器1上执行
echo "Nginx 111" > /opt/nginx/html/index.html
# 服务器2上执行
echo "Nginx 222" > /opt/nginx/html/index.html
通过访问两台服务器的IP地址,就可以看到对应的首页内容了(注意:服务器记得开放80安全组):
2.3、关于 Keepalived
2.3.1、安装 Keepalived
首先,通过 yum 安装 keepalived 程序,两台服务器都需要进行下载:
yum install -y keepalived
2.3.2、编写 Shell
接着需要编写 Nginx 故障检测 Shell 脚本,Keepalived会定时执行ps -C nginx --no-heading|wc -l
命令,如果返回0,代表Nginx挂了,然后尝试重启,如果重启失败,停止keepalived触发故障转移如果返回大于0,代表 Nginx 正常运行:
# 两台服务器都需要创建该脚本(注意切换容器ID)
sudo cat >/etc/keepalived/check_nginx.sh<<-'EOF'
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
docker start 容器id
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
EOF
然后,两台服务器都需要调整一下脚本权限:
# 两台服务器都需要执行
chmod 755 /etc/keepalived/check_nginx.sh
2.3.3、调整 KeepAlived 配置
两台服务器需要调整的配置内容有些区别,所以分别在两台服务器上执行下述命令:
# 服务器1上的配置内容
sudo cat >/etc/keepalived/keepalived.conf<<-'EOF'
! Configuration File for keepalived
# 全局配置,路由ID,固定不变
global_defs {
router_id LVS_DEVEL
}
# 定义Nginx状态脚本
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
# 间隔时间,单位为秒,默认1秒
interval 2
# 权重,当脚本成功或失败对当前节点的优先级是增加还是减少
weight -5
}
#VRRP实例
vrrp_instance VI_1 {
# 主节点
state MASTER
# 绑定的网卡,使用ifconfig命令查看获取
interface eth0
# 虚拟路由id,保证相同
virtual_router_id 51
# 优先级,抢占模式下优先级高的称为主
priority 101
# 指定发送VRRP通告的间隔。单位是秒。
advert_int 2
# 安全认证用的密码,自定义即可
authentication {
auth_type PASS
auth_pass 1111
}
# 对外暴露的VIP地址
virtual_ipaddress {
内网ip3
}
# 指定Nginx执行状态脚本
track_script {
chk_nginx
}
}
EOF
# 服务器2上执行
sudo cat >/etc/keepalived/keepalived.conf<<-'EOF'
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
}
vrrp_instance VI_1 {
# 初始角色Backup
state BACKUP
interface eth0
virtual_router_id 51
# 优先级比master低
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
内网ip3
}
track_script {
chk_nginx
}
}
EOF
两台服务器,都启动 Keepalived :
# 启动 Keepalived
systemctl start keepalived
# 查看日志
tail -f /var/log/messages
通过控制台日志可以看到高可用集群部署完毕,此时通过访问内网ip3
就能够看到Nginx首页,停止掉某台机器上的keepalived就会出现故障转移,VIP漂移现象!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)