负载均衡介绍
负载均衡是在支持应用程序的资源池中平均分配网络流量的一种方法。现代应用程序必须同时处理数百万用户,并以快速、可靠的方式将正确的文本、视频、图像和其他数据返回给每个用户。为了处理如此高的流量,大多数应用程序都有许多资源服务器,它们之间包含很多重复数据。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器。
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 |
---|---|---|---|
VIP | 172.16.10.40 | 虚拟VIP地址 | - |
lvs01 | 172.16.10.41 | Keepalived | Ubuntu22.04 |
lvs02 | 172.16.10.42 | Keepalived | Ubuntu22.04 |
haproxy | - | HAPorxy | - |
web01 | 172.16.10.43 | Nginx1.18 | Ubuntu22.04 |
web02 | 172.16.10.44 | Nginx1.18 | Ubuntu22.04 |
安装 Keepalive
推荐如无特殊插件推荐使用APT包安装
时间同步
- 首先,我们需要确认
systemd-timesyncd
服务是否正在运行。在终端中输入以下命令:
timedatectl status
在输出中,你应该能看到"System clock synchronized: yes"和"systemd-timesyncd.service active: yes"。
- 如果
systemd-timesyncd
服务没有运行,你可以使用以下命令来启动它:
sudo timedatectl set-ntp on
- 如果你想要更改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
时间同步
- 首先,我们需要确认
systemd-timesyncd
服务是否正在运行。在终端中输入以下命令:
timedatectl status
在输出中,你应该能看到"System clock synchronized: yes"和"systemd-timesyncd.service active: yes"。
- 如果
systemd-timesyncd
服务没有运行,你可以使用以下命令来启动它:
sudo timedatectl set-ntp on
- 如果你想要更改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高可用
总结:
- Keepalived 监听HAproxy进程,如果进程有问题则发生VIP漂移
- 现有版本中keepalived执行脚本需要一个普通用户且能执行脚本
- 本架构中俩个均为BACKUP服务器 并且做了恢复后不抢占 适合俩个服务器性能一致的场景
- 做完配置使用
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负载均衡
总结:
- HAproxy支持多少负载均衡方式,本文仅做功能实现并未针对业务做ssions cookie保持
- 做完配置使用
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