Nginx基于Keepalived实现LVS-DR高可用负载均衡集群

  • A+
所属分类:Nginx

Keepalived是一个用于实现网络服务高可用性的开源软件,通过虚拟路由冗余协议(VRRP)确保当主服务器故障时,备用服务器能够自动接管服务,维持应用的连续运行。用于实现Linux系统下的服务高可用性和负载均衡。它通过在多个节点之间共享虚拟IP地址,确保当主节点故障时,备用节点能够自动接管服务,从而实现无缝的故障转移。Keepalived支持健康检查和故障恢复,可以与LVS配合使用,提供简单的配置和管理,常用于数据库、Web服务器等关键服务。

LVS(Linux Virtual Server)是一个基于Linux内核的高性能、高可用的负载均衡解决方案。

主要特点:
负载均衡:LVS作为负载均衡器,位于客户端和后端服务器之间,分发进入的网络服务请求;
调度算法:支持多种调度算法,如轮询、最少连接、源地址哈希等,以适应不同的业务需求;
网络层级:工作在OSI模型的第三层和第四层,基于IP地址和端口号进行请求分发;
高性能:通过在内核层进行请求分发,减少处理开销,提供高吞吐量和低延迟;
高可用性:结合Keepalived等工具,可以实现负载均衡器的高可用性;
可扩展性:能够处理大量并发连接,适合大型网络环境和需要大规模扩展的服务。

主机应用软件
Tomcat01Tomcat01+jdk
Tomcat02Tomcat02+jdk
Nginx01Nginx
Nginx02Nginx
LVS01ipvsadm + keepalived
LVS02ipvsadm + keepalived

Tomcat01和Tomcat02二进制安装部署JDK环境

两台Tomcat服务器安装JDK

wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz        //下载JDK
tar xvf jdk-8u202-linux-x64.tar.gz -C /usr/local/        //解压到/usr/local/下
ln -s /usr/local/jdk1.8.0_202/ /usr/local/jdk        //创建软连接
vim /etc/profile.d/jdk.sh        //配置环境变量
# Java JDK
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar        //保存退出
source /etc/profile        //加载环境变量
java -version

两台Tomcat服务器安装Tomcat

wget https://mirrors.huaweicloud.com/apache/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz        //下载Tomcat
tar xf apache-tomcat-9.0.48.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-9.0.48/ /usr/local//tomcat
useradd -s /sbin/nologin tomcat
rm -fr /usr/local/tomcat/webapps/*        //删除多余工程项目
mkdir -pv /usr/local/tomcat/webapps/war/        //创建自己的工程目录
vim /usr/local/tomcat/webapps/war/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
    <head>
        <title>java web page</title>
    </head>
    <body>
        <% out.println("Tomcat01");%>        //第二台改为Tomcat02用来验证
    </body>
</html>        //保存退出
vim /usr/local/tomcat/conf/server.xml        //关闭shutdown端口
<Server port="-1" shutdown="SHUTDOWN">        //修改8005为-1,保存退出
chown -R tomcat:tomcat /usr/local/tomcat/*        //修改所有者和组

配置Tomcat开机自启文件

vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/local/jdk"
WorkingDirectory=/usr/local/tomcat
ExecStartPre=/usr/local/tomcat/bin/configtest.sh
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target        //保存退出
systemctl daemon-reload
systemctl enable --now tomcat.service
Nginx基于Keepalived实现LVS-DR高可用负载均衡集群

Nginx基于Keepalived实现LVS-DR高可用负载均衡集群

Nginx01和Nginx02配置网络

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
BOOTPROTO=static
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.22.222
PREFIX=32        //保存退出
ifup lo:0

优化Linux系统的网络设置,防止系统对不属于自己的IP地址的ARP请求做出响应,控制系统在发送ARP请求时如何选择源IP地址。

vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2        //保存退出
sysctl -p

Nginx01和Nginx02源码安装Nginx网站服务

curl -O https://nginx.org/download/nginx-1.26.2.tar.gz        //下载Nginx安装包
yum -y install pcre-devel openssl-devel        //安装依赖
useradd -s /sbin/nologin -M nginx        //创建Nginx用户
tar xvf nginx-1.26.2.tar.gz
cd nginx-1.26.2/
./configure --prefix=/usr/local/nginx-1.26.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-stream
make && make install
ln -s /usr/local/nginx-1.26.2/ /usr/local/nginx
chown -R nginx:nginx /usr/local/nginx*

配置nginx配置文件

cp -a /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak        //备份nginx配置文件
vim /usr/local/nginx/conf/nginx.conf        //修改nginx配置文件
# 运行Nginx的用户和用户组
user nginx nginx;

# 设置工作进程的数量,auto 表示根据 CPU 核心数自动调整
worker_processes auto;

# 设置 Nginx 的错误日志文件路径
error_log /data/logs/nginx/error.log;

# 设置 Nginx 主进程的 PID 文件路径
pid /run/nginx.pid;

# 事件区块,用于配置工作进程连接的特性
events {
    # 每个工作进程可以同时打开的最大连接数
    worker_connections 1024;
}

# HTTP 服务器区块
http {
    # 包含 MIME 类型定义文件
    include mime.types;
    # 默认 MIME 类型
    default_type application/octet-stream;

    # 定义日志格式
    log_format www 'remote_addr - remote_user [time_local] "request" '
                   'status body_bytes_sent "http_referer" '
                   '"http_user_agent" "http_x_forwarded_for"';

    # 设置访问日志文件路径
    access_log /data/logs/nginx/access.log www;

    # 启用 sendfile 传输文件
    sendfile on;
    #tcp_nopush on; # 启用 TCP_NOPUSH 功能,需要 sendfile 开启

    # 保持连接的超时时间
    keepalive_timeout 65;

    # 负载均衡配置,定义 Tomcat 服务器集群
    upstream tomcatservers {
        server 192.168.18.14:8080 max_fails=3 fail_timeout=30s; # Tomcat 服务器 1
        server 192.168.18.15:8080 max_fails=3 fail_timeout=30s; # Tomcat 服务器 2
        # 可以继续添加更多服务器
    }

    # 服务器区块,定义虚拟主机的配置
    server {
        # 监听 80 端口
        listen 80;
        # 服务器名称
        server_name www.war.com;

        # 前端静态资源 location 块
        location / {
            # 指定前端静态资源的根目录
            root /data/www/nginx; # 替换为前端静态资源的实际路径
            # 尝试匹配 index.html 或 index.htm
            index index.html index.htm;
        }

        # war 请求 location 块,假设 API 请求以 /api 开头
        location /war/ {
            # 将请求代理到定义的 Tomcat 服务器集群
            proxy_pass http://tomcatservers;
            # 设置代理请求头,传递原始请求信息
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            # 设置代理请求的根路径,如果后端服务需要
            # proxy_set_header X-Forwarded-Root /api;
        }

        # 自定义错误页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            # 指定错误页面的根目录
            root /usr/share/nginx/html;
        }
    }

    # 其他服务器配置可以在此添加
#    include /usr/local/nginx/conf.d/*.conf;
}
mkdir -pv /data/logs/nginx        //创建日志目录
mkdir -pv /data/www/nginx        //创建前端网页根目录
echo Nginx01 > /data/www/nginx/index.html        //Nginx01执行
echo Nginx02 > /data/www/nginx/index.html        //Nginx02执行

配置Nginx开机自启文件

vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
#PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
#KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target        //保存退出
systemctl daemon-reload
systemctl enable --now nginx.conf

LVS01和LVS02源码安装Keepalived+LVS高可用服务

配置路由转发

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1        //保存退出
sysctl -p

yum安装LVS和源码包安装Keepalived

yum -y install ipvsadm openssl-devel libnl-devel        //安装LVS和keepalived依赖
wget http://www.keepalived.org/software/keepalived-2.2.8.tar.gz
tar xvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8/
./configure --prefix=/usr/local/keepalived-2.2.8
make && make install
ln -s /usr/local/keepalived-2.0.8/ /usr/local/keepalived

修改Keepalived配置
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs {  #全局设置
    router_id LVS01  # 本节点标识,(第二台改为LVS02)
}

vrrp_instance LVS {
    state MASTER       # 指定该节点为MASTER主节点,(第二台改为BACKUP)
    interface ens33    # 指定VRRP实例绑定的网络接口
    virtual_router_id 50 # 虚拟路由器ID,同一虚拟路由器组的ID必须相同
    priority 100       # 优先级,数值越大优先级越高,(第二台优先级改小,优先级大的为主)
    advert_int 1       # 通告间隔,单位秒

    authentication {
        auth_type PASS  # 认证类型为密码认证
        auth_pass war.com # 认证密码
    }

    virtual_ipaddress {
        192.168.22.222  # 虚拟IP地址,客户端将使用此IP访问服务 
    }
}

virtual_server 192.168.22.222 80 {  # 虚拟服务器配置,指定虚拟IP和端口 
    delay_loop 3       # 健康检查的时间间隔,单位秒
    lb_algo rr         # 负载均衡算法,这里使用轮询(Round Robin)
    lb_kind DR         # 负载均衡类型,这里使用直接路由(Direct Routing)
#    persistence_timeout 50  # 持久连接超时时间,单位秒
    protocol TCP       # 使用的协议类型

    real_server 192.168.22.12 80 {  # 后端真实服务器1的配置
        weight 1         # 权重
        TCP_CHECK {      # TCP检查配置
            connect_timeout 10  # 连接超时时间,单位秒
            retry 3         # 重试次数
            delay_before_retry 3  # 重试间隔时间,单位秒
            connect_port 80  # 检查的端口
        }
    }

    real_server 192.168.22.13 80 {  # 后端真实服务器2的配置
        weight 1         # 权重
        TCP_CHECK {      # TCP检查配置
            connect_timeout 10  # 连接超时时间,单位秒
            retry 3         # 重试次数
            delay_before_retry 3  # 重试间隔时间,单位秒
            connect_port 80  # 检查的端口
        }
    }
}        //保存退出

开启Keepalived

systemctl daemon-reload
systemctl enable --now keepalived.service
ipvsadm -ln
Nginx基于Keepalived实现LVS-DR高可用负载均衡集群

在LVS02上验证

curl http://192.168.22.222
curl http://192.168.22.222/war/
Nginx基于Keepalived实现LVS-DR高可用负载均衡集群

Nginx基于Keepalived实现LVS-DR高可用负载均衡集群
xxx

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

    • xxx xxx Admin

      1