手把手搭建 Nginx + VIP + Keepalived 高可用集群

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漂移现象!

相关推荐

  1. ElasticSearch可用

    2024-06-17 10:58:05       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 10:58:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 10:58:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 10:58:05       87 阅读
  4. Python语言-面向对象

    2024-06-17 10:58:05       96 阅读

热门阅读

  1. 实例方法与静态方法

    2024-06-17 10:58:05       34 阅读
  2. 存储技术介绍

    2024-06-17 10:58:05       35 阅读
  3. C# —— do_while循环

    2024-06-17 10:58:05       30 阅读
  4. Mock数据

    2024-06-17 10:58:05       23 阅读
  5. 旅行商问题要点和难点以及具体应用案例

    2024-06-17 10:58:05       28 阅读
  6. SFTP工具

    2024-06-17 10:58:05       29 阅读
  7. xss-lab靶场level1-level10

    2024-06-17 10:58:05       29 阅读
  8. IT66352: 2 IN to 1 OUT HDMI2.0 18Gb/s Re Timer Switch

    2024-06-17 10:58:05       30 阅读
  9. Gone框架介绍27 - 再讲 Goner 和 依赖注入

    2024-06-17 10:58:05       35 阅读
  10. C#面:解释什么是构造函数?

    2024-06-17 10:58:05       26 阅读
  11. 通讯的一些基本概念 -网卡 -网段 -网桥 -路由表

    2024-06-17 10:58:05       31 阅读
  12. RK平台Android单独编译内核

    2024-06-17 10:58:05       28 阅读
  13. Android的自启动

    2024-06-17 10:58:05       30 阅读