负载均衡介绍

负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。现代应用程序必须同时处理数百万用户,并以快速、可靠的方式将正确的文本、视频、图像和其他数据返回给每个用户。为了处理如此高的流量,大多数应用程序都有许多资源服务器,它们之间包含很多重复数据。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器。

OSI七层协议模型

分层功能相关协议
应用层网络服务和最终用户的一个接口TFTP,HTTP,SNMP,DNS,FTP,SMTP,TELNET
表示层数据的表示、安全、压缩无协议
会话层会话的建立、管理、中止无协议
传输层定义传输数据的协议端口号,以及流控和差错校验TCP,UDP
网络层进行逻辑地址寻址,实现不同网络之间的路径选择IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层建立逻辑连接、硬件地址寻址、差错校验等功能SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层建立、连接、断开物理连接ISO2110,IEEE802,IEEE802.2

网络模型示意图

由网络模型衍生

对于一个大型后台系统来说,LVS、HAProxy和Nginx常常可以配合使用在不同的层级,LVS用在接入层的最前端,承担最大规模的流量分发;HAProxy负责按域名分流;而Nginx只需要作为Web服务器负责单机内多实例的负载均衡,或负责目录结构分流和静态资源缓存等需求。

所谓的四层与七层负载均衡,就是在对后台服务器进行负载均衡时,依据OSI四层的信息或七层的信息来决定怎么样转发流量。比如四层负载均衡通过报文中的目标IP地址和端口,七层负载均衡通过报文中的应用层信息(URL、HTTP头部等信息),选择到达目的的内部服务器。四层负载均衡在解包上的消耗更少,可以达到更高的性能。而七层负载算法可以通过更多的应用层信息分发请求,功能性上更强大。


以下章节将介绍
LVS(Keepalived高可用) + HAProxy + Nginx最终业务服务器的模式

LVS介绍

VS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 用现在的观点来看就是个4层(传输层tcp/udp)的负载均衡器。 它是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualser。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等

功能介绍

LVS目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)

LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。

  • 注意:部署LVS需要网络环境的支持,不能针对上层协议分析
  • 以上我也是摘抄的官方文档,网上很多详细的介绍,我这里就不啰嗦了。
  • 详细介绍文章:http://linuxvirtualserver.org/zh/lvs1.html

集群部署

环境规划

共计4台服务器

主机名节点IP部署软件OS
VIP172.16.10.40虚拟VIP地址-
lvs01172.16.10.41KeepalivedUbuntu22.04
lvs02172.16.10.42KeepalivedUbuntu22.04
haproxy-HAPorxy-
web01172.16.10.43Nginx1.18Ubuntu22.04
web02172.16.10.44Nginx1.18Ubuntu22.04

安装 Keepalive

中文在线文档

推荐如无特殊插件推荐使用APT包安装

时间同步

  1. 首先,我们需要确认systemd-timesyncd服务是否正在运行。在终端中输入以下命令:
timedatectl status

在输出中,你应该能看到"System clock synchronized: yes"和"systemd-timesyncd.service active: yes"。

  1. 如果systemd-timesyncd服务没有运行,你可以使用以下命令来启动它:
sudo timedatectl set-ntp on
  1. 如果你想要更改NTP服务器,你可以编辑/etc/systemd/timesyncd.conf文件。在这个文件中,你可以找到"NTP="这一行,然后在其后面添加你想要使用的NTP服务器。例如NTP=pool.ntp.org
sudo systemctl restart systemd-timesyncd

预编译包安装

在Red Hat Enterprise Linux上安装

从 Red Hat 6.4 开始,Red Hat和克隆版本已经将Keepalived包含在基本的软件仓库中。因此,运行以下命令以使用 YUM 安装Keepalived包和所有必需的依赖项:

yum install keepalived

在Debian上安装

运行如下命令以使用 Debian 的 APT 包处理实用程序安装Keepalived包和所有必需的依赖项:

apt-get install keepalived

从源代码编译和构建

要运行最新的稳定版本,请从源代码编译Keepalived。编译Keepalived需要编译器,OpenSSL 和 Netlink 库。您可以选择安装 SNMP 支持所需的 Net-SNMP

在RHEL/Centos上安装先决条件[](https://keepalived-doc.readthedocs.io/zh-cn/latest/%E5%AE%89%E8%A3%85Keepalived.html#rhel-centos "永久链接至标题")

在RHEL上,安装如下先决条件:

yum install curl gcc openssl-devel libnl3-devel net-snmp-devel make

在Debian上安装先决条件

在Debian上,安装如下先决条件:

apt-get install curl gcc libssl-dev libnl-3-dev libnl-genl-3-dev libsnmp-dev make

构建和安装

使用 curl 或任何其他传输工具(如 wget)下载Keepalived。该软件可以从 Keepalived官网 或 Github仓库 获得。然后,进行编译:

curl -O https://www.keepalived.org/software/keepalived-2.2.8.tar.gz 
tar -zxvf keepalived-2.2.8.tar
cd keepalived-2.2.8
./configure
make
sudo make install

从源代码编译时一般建议指定PREFIX。例如:

./configure --prefix=/usr/local/keepalived-2.2.8

这样,只需删除父目录即可轻松卸载Keepalived的编译版本。此外,这种安装方法允许安装多个版本的Keepalived,而不会互相覆盖。使用符号链接指向所需的版本。例如,您的目录结构可能如下所示:

[root@lvs1 ~]# cd /usr/local
[root@lvs1 local]# ls -l
total 12
lrwxrwxrwx. 1 root root   17 Feb 24 20:23 keepalived -> keepalived-1.2.15
drwxr-xr-x. 2 root root 4096 Feb 24 20:22 keepalived-1.2.13
drwxr-xr-x. 2 root root 4096 Feb 24 20:22 keepalived-1.2.14
drwxr-xr-x. 2 root root 4096 Feb 24 20:22 keepalived-1.2.15

可执行文件与配置文件处理

可执行文件拷贝一份到系统执行文件目录,该目录在path变量里面,可以直接使用keepalived命令

cp /usr/local/keepalived-2.2.8/sbin/keepalived /usr/sbin/keepalived   

或者(更推荐)

ln -s /usr/local/keepalived-2.2.8/sbin/keepalived /usr/sbin/keepalived

软连接(这一步谨是我自己对软件目录管理的需求)

ln -s /usr/local/keepalived-2.2.8/sbin/keepalived /opt/app/keepalived

keepalived附加参数文件,为了跟yum/apt安装一致,其实是不用配置的。启动文件指定实际路径就可以了。

ln -s /usr/local/keepalived-2.2.8/etc/keepalived /etc/keepalived

ln -s /usr/local/keepalived-2.2.8/etc/sysconfig /etc/sysconfig

配置system自启动文件

根据上面的编译安装,实际已经生成了启动文件,我们这里进行一些修改。

编写配置文件

vi /usr/lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target

[Service]
Type=simple
PIDFile=/opt/app/keepalived/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf $KEEPALIVED_OPTIONS 
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

加载文件

systemctl daemon-reload

推荐如无特殊插件推荐使用APT包安装


安装 HAproxy

时间同步

  1. 首先,我们需要确认systemd-timesyncd服务是否正在运行。在终端中输入以下命令:
timedatectl status

在输出中,你应该能看到"System clock synchronized: yes"和"systemd-timesyncd.service active: yes"。

  1. 如果systemd-timesyncd服务没有运行,你可以使用以下命令来启动它:
sudo timedatectl set-ntp on
  1. 如果你想要更改NTP服务器,你可以编辑/etc/systemd/timesyncd.conf文件。在这个文件中,你可以找到"NTP="这一行,然后在其后面添加你想要使用的NTP服务器。例如NTP=pool.ntp.org
sudo systemctl restart systemd-timesyncd

预编译包安装

在Red Hat Enterprise Linux上安装

从 Red Hat 6.4 开始,Red Hat和克隆版本已经将Keepalived包含在基本的软件仓库中。因此,运行以下命令以使用 YUM 安装Keepalived包和所有必需的依赖项

yum install haproxy

在Debian上安装

运行如下命令以使用 Debian 的 APT 包处理实用程序安装Keepalived包和所有必需的依赖项:

apt-get install haproxy

Keepalived + HAproxy高可用

Keepalived 注意点

[!Note] 注意点
用途:HAproxy+Keepalived高可用
总结:

  1. Keepalived 监听HAproxy进程,如果进程有问题则发生VIP漂移
  2. 现有版本中keepalived执行脚本需要一个普通用户且能执行脚本
  3. 本架构中俩个均为BACKUP服务器 并且做了恢复后不抢占 适合俩个服务器性能一致的场景
  4. 做完配置使用keepalived -t -f /etc/keepalived/keepalived.conf来检查

LVS01 Keepalived 配置

/etc/keepalived/keepalived.conf

默认文档使用man keepalived查看
默认配置文件使用 man keealived.conf查看
global_defs {
   router_id lvd01                             # 唯一路由ID推荐使用主机名
   enable_script_security                      # 2.2.x版本后需开启脚本安全才能执行
   script_user zimri                           # 运行脚本用户 不推荐使用root
}

vrrp_script chk_haproxy {                      # 自定义脚本chk_haproxy
    script "/etc/keepalived/check_haproxy.sh"  # 脚本位置
    interval 1                                 # 检查时间
    user zimri                                 # 运行脚本用户
}

vrrp_instance VI_1 {                           # VRRP名称 VI_1
    state BACKUP                               # 不做MASTER防止来回切换
    interface eth0                             # VIP绑定网卡
    virtual_router_id 77                       # 虚拟路由器的ID局域网中需唯一但主备需一致
    priority 100                               # 本节点优先级
    nopreempt                                  # 不主动抢占
    advert_int 1                               # 虚拟路由器广播VRRP心跳包的间隔s
    authentication {                           # 认证机制
        auth_type PASS                         # 认证类型 密码
        auth_pass 11111                        # 认证密码
    }
    virtual_ipaddress {                        # 设置VIP
        172.16.10.40/24                        # 虚拟IP地址
    }
    track_script {                             # 执行脚本检测
        chk_haproxy                            # 执行chk_haproxy
    }
}

vrrp_script 是 Keepalived 用来检查服务健康状态的脚本。这个脚本会定期运行,如果脚本返回非零值,Keepalived 就会认为服务有问题,并根据配置采取相应的行动

garp_master_delay 参数的作用是在主备切换后,新的主服务器等待多久才开始发送 gratuitous ARP。这个参数并不直接影响主备切换的时间

garp_master_delay 参数用于设置主备切换后,新的主服务器等待多久才开始发送 gratuitous ARP,以更新局域网内其他设备的 ARP 缓存。

如果 garp_master_delay 参数没有被显式设置,Keepalived 将使用默认值。在 Keepalived 的最新版本中,默认的 garp_master_delay 是 5 秒。

这意味着,如果你没有设置 garp_master_delay,那么当发生主备切换时,新的主服务器将会在成为主服务器后等待5秒,然后开始发送 gratuitous ARP

LVS02 Keepalived 配置

/etc/keepalived/keepalived.conf`

默认文档使用man keepalived查看
默认配置文件使用 man keealived.conf查看
global_defs {
   router_id lvd02                             # 唯一路由ID推荐使用主机名
   enable_script_security                      # 2.2.x版本后需开启脚本安全才能执行
   script_user zimri                           # 运行脚本用户 不推荐使用root
}

vrrp_script chk_haproxy {                      # 自定义脚本chk_haproxy
    script "/etc/keepalived/check_haproxy.sh"  # 脚本位置
    interval 1                                 # 检查时间
    user zimri                                 # 运行脚本用户
}

vrrp_instance VI_1 {                           # VRRP名称 VI_1
    state BACKUP                               # 不做MASTER防止来回切换
    interface eth0                             # VIP绑定网卡
    virtual_router_id 77                       # 虚拟路由器的ID局域网中需唯一但主备需一致
    priority 95                                # 本节点优先级
    nopreempt                                  # 不主动抢占
    advert_int 1                               # 虚拟路由器广播VRRP心跳包的间隔s
    authentication {                           # 认证机制
        auth_type PASS                         # 认证类型 密码
        auth_pass 11111                        # 认证密码
    }
    virtual_ipaddress {                        # 设置VIP
        172.16.10.40/24                        # 虚拟IP地址
    }
    track_script {                             # 执行脚本检测
        chk_haproxy                            # 执行chk_haproxy
    }
}

LVS01 and LVS02 自定义脚本

脚本位置

/etc/keepalived/check_haproxy.sh

脚本内容

#!/bin/bash
if systemctl is-active --quiet haproxy
then
    exit 0
else
    exit 1
fi

HAproxy 注意点

[!Note] 注意点
用途:HAproxy负载均衡
总结:

  1. HAproxy支持多少负载均衡方式,本文仅做功能实现并未针对业务做ssions cookie保持
  2. 做完配置使用haproxy -c -f /etc/haproxy/haproxy.cfg来检查
root@lvs01:/etc/keepalived# cat /etc/haproxy/haproxy.cfg
global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
    log    global
    mode    http
    option    httplog
    option    dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http


# User Backend Server
frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

backend http_back
   balance roundrobin
   server server1 172.16.10.43:80 check
   server server2 172.16.10.44:80 check
最后修改:2024 年 11 月 06 日
如果觉得我的文章对你有用,请随意赞赏