阅读量:0
华子目录
前言
什么是负载均衡
负载均衡
:Load Balance
,简称LB
,是一种服务或基于硬件设备
等实现的高可用反向代理技术
,负载均衡
将特定的业务
(web服务、网络流量
等)分担给指定
的一个
或多
个后端特定的服务器
或设备
,从而提高了公司业务
的并发处理能力
、保证了业务的高可用性
、方便了业务后期的水平动态扩展
- 阿里云
SLB
介绍:https://yq.aliyun.com/articles/1803
为什么用负载均衡
Web服务器
的动态水平扩展
---->对用户无感知
- 增加业务
并发访问
及处理能力
---->解决单服务器
瓶颈问题 节约公网IP地址
---->降低IT支出成本
隐藏
内部服务器IP
---->提高内部服务器安全性
配置简单
---->固定格式
的配置文件
功能丰富
---->支持四层
和七层
,支持动态下线主机
性能较强
---->并发数万甚至数十万
负载均衡公司
F5
:美国F5网络公司
Netscaler
:美国思杰公司
Array
:华耀
AD-1000
:深信服
负载均衡类型
四层
负载均衡
- 通过
ip+端口
决定负载均衡
的去向
- 对
流量
请求进行nat
处理,转发
至后台服务器 - 记录
tcp
、udp
流量分别是由哪台服务器
处理,后续该请求
连接的流量
都通过该服务器
处理 - 支持
四层
的软件
lvs
:重量级四层
负载均衡器Nginx
:轻量级四层
负载均衡器,可缓存
。(nginx
四层是通过upstream
模块实现的)Haproxy
:模拟四层
转发
七层
负载均衡
- 通过
虚拟url
或主机ip
进行流量识别
,根据应用层
信息进行解析
,决定
是否需要进行负载均衡
代理
后台服务器
与客户端
建立连接
,如nginx
可代理前后端
,与前端
客户端tcp
连接,与后端
服务器建立tcp
连接- 支持
7层
代理的软件
Nginx
:基于http
协议(nginx七层
是通过proxy_pass
)Haproxy
:七层代理
,会话保持、标记、路径转移
等
四层和七层的区别
- 所谓的
四层到七层
负载均衡,就是在对后台
的服务器
进行负载均衡
时,依据四层
的信息
或七层
的信息
来决定怎么样转发流量
四层
的负载均衡
,就是通过发布三层
的IP地址
(vip
),然后加四层
的端口号
,来决定哪些流量
需要做负载均衡
,对需要处理的流量
进行nat
处理,转发至后台服务器
,并记录下这个TCP
或者UDP
的流量
是由哪台服务器
处理的,后续这个连接
的所有流量
都同样转发到同一台服务器
上进行处理
七层
的负载均衡
,就是在四层
的基础
上(没有四层是绝对不可能有七层的
),再考虑应用层
的特征
,比如同一个Web服务器
的负载均衡
,除了根据vip
加80端口
辨别是否
需要处理的流量
,还可根据七层
的URL
、浏览器类别
、语言
等来决定是否要进行负载均衡
分层位置
:四层
负载均衡在传输层及以下
,七层
负载均衡在应用层及以下
性能
:四层负载均衡架构
无需解析报文消息内容
,在网络吞吐量与处理能力上较高
;七层
可支持解析应用层报文
消息内容,识别URL
、Cookie
、HTTP header
等信息原理
:四层
负载均衡是基于ip+端口
;七层
是基于虚拟的URL
或主机IP
等功能类比
:四层
负载均衡类似于路由器
;七层
类似于代理服务器
安全性
:四层
负载均衡无法
识别DDoS攻击
;七层
可防御SYN Cookie/Flood
攻击
haproxy
介绍
HAProxy
是法国
开发者威利塔罗
(Willy Tarreau
) 在2000
年使用C语言
开发的一个开源软件
- 是一款具备
高并发
(万级以上
)、高性能
的TCP
和HTTP
负载均衡器 - 支持基于
cookie
的持久性
,自动故障切换
,支持正则表达式
及web状态统计
企业版网站
:https://www.haproxy.com社区版网站
:http://www.haproxy.orggithub
:https://github.com/haprox
企业版本
与社区版本
功能对比
功能 | 社区版 | 企业版 |
---|---|---|
高级HTTP / TCP 负载平衡和持久性 | 支持 | 支持 |
高级健康检查 | 支持 | 支持 |
应用程序加速 | 支持 | 支持 |
高级安全特性 | 支持 | 支持 |
高级管理 | 支持 | 支持 |
HAProxy Dev Branch新功能 | 支持 | 支持 |
24*7 支持服务 | 支持 | |
实时仪表盘 | 支持 | |
VRRP 和Route Health Injection HA 工具 | 支持 | |
ACL,映射和TLS票证密钥同步 | 支持 | |
基于应用程序的高级DDoS和Bot保护(自动保护) | 支持 | |
Bot(机器人)监测 | 支持 | |
Web应用防火墙 | 支持 | |
HTTP协议验证 | 支持 | |
实时集群追踪 |
haproxy
基础架构
haproxy
的安装
- 使用
rhel9
本地yum
安装
[root@haproxy ~]# yum install haproxy -y
查看版本
[root@haproxy ~]# haproxy -v HAProxy version 2.4.17-9f97155 2022/05/13 - https://haproxy.org/ Status: long-term supported branch - will stop receiving fixes around Q2 2026. Known bugs: http://www.haproxy.org/bugs/bugs-2.4.17.html Running on: Linux 5.14.0-162.6.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Sep 30 07:36:03 EDT 2022 x86_64
haproxy.cfg
配置文件
HAProxy
的配置文件haproxy.cfg
由两大部分
组成,分别是:
global
:全局配置段
进程
及安全配置
相关的参数性能
调整相关参数Debug
参数
proxies
:代理配置段
defaults
:是为frontend
,backend
,listen
提供的默认配置
frontend
:前端
,相当于nginx
中的server {}
backend
:后端
,相当于nginx
中的upstream {}
listen
:同时拥有frontend前端
和backend后端
配置,配置简单
,生产推荐
使用
haproxy.cfg
文件内容如下:
[root@haproxy ~]# cat /etc/haproxy/haproxy.cfg #--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # https://www.haproxy.org/download/1.8/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats # utilize system-wide crypto-policies ssl-default-bind-ciphers PROFILE=SYSTEM ssl-default-server-ciphers PROFILE=SYSTEM #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main # main为名字,自定义即可 bind *:5000 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static # static为名字,自定义即可 balance roundrobin server static 127.0.0.1:4331 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend app # app为名字,自定义即可 balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check
global配置说明
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon .................... .................... ....................
参数 | 类型 | 作用 |
---|---|---|
chroot | 全局 | 锁定运行目录 |
daemon | 全局 | 以后台守护进程运行 |
user | 全局 | 运行haproxy的用户 |
group | 全局 | 运行haproxy的组 |
log | 全局 | 定义的syslog服务器 ;日志服务器需要开启udp协议 ;最多定义两个 |
pidfile | 全局 | 指定pid文件路径 |
maxconn 数字 | 全局 | 每个haproxy进程的最大并发连接数 |
stats socket | 全局 | 套接字文件 |
nbproc 数字 | 全局 | 开启的haproxy worker 进程数,默认进程数 是一个 |
nbthread 数字 (和nbproc 互斥) | 全局 | 指定每个haproxy进程 开启的线程数 ,默认为每个进程一个线程 |
cpu-map 1 0 | 全局 | 绑定haproxy worker 进程至指定CPU ,将第1 个work进程 绑定至0号CPU |
cpu-map 2 1 | 全局 | 绑定haproxy worker 进程至指定CPU ,将第2 个work进程 绑定至1号CPU |
maxsslconn 数字 | 全局 | 每个haproxy 进程ssl 最大连接数,用于haproxy 配置了证书 的场景下 |
maxconnrate 数字 | 全局 | 每个进程每秒创建的最大连接数量 |
spread-checks 数字 | 全局 | 后端server 状态check 随机提前或延迟百分比时间,建议2-5(20%-50% )之间,默认值0 |
proxies
配置说明
参数 | 类型 | 作用 |
---|---|---|
defaults | proxies | 默认配置项 ,针对以下的frontend 、backend 和listen 生效,可以有多个name 也可以没有name |
frontend | proxies | 前端 ,相当于nginx 中的server {} |
backend | proxies | 后端 ,相当于nginx 的upstream{} 或LVS 中的RS服务器 |
listen | proxies | 将frontend 和backend 合并在一起配置,相对于frontend 和backend 配置更简洁,生产常用 |
defaults配置段
defaults mode http #HAProxy实例使用的连接协议,表示7层负载 log global #指定日志地址和记录日志条目的syslog/rsyslog日志设备,这里设置为global表示继承global配置中log的配置 option httplog #日志记录选项,httplog表示记录与 HTTP会话相关的各种属性值 option dontlognull #dontlognull表示不记录空会话连接日志 option http-server-close #等待客户端完整HTTP请求的时间,此处为等待10s。 option forwardfor except 127.0.0.0/8 #透传客户端真实IP到后端web服务器 option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发 option http-keep-alive #开启与客户端的会话保持 retries 3 #连接后端服务器失败次数 timeout http-request 1000s #等待客户端请求完全被接收和处理的最长时间 timeout queue 60s #设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间,即失败页面显现前的加载时间 timeout connect 120s #设置等待服务器连接成功的时间 timeout client 600s #设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间 timeout server 600s #设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间 timeout http-keep-alive 60s #session会话保持超时时间,此时间段内会转发到相同的后端服务器 timeout check 10s #指定后端服务器健康检查的超时时间 maxconn 3000 default-server inter 1000 weight 3
frontend配置段
frontend main # main为名字,自定义即可 bind *:5000 #指定HAProxy的监听地址和端口,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中,*表示监听所有,多个地址使用逗号分割 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app
- 注意:当
bind
需要绑定非本机的IP
,需要设置开启内核参数
:net.ipv4.ip_nonlocal_bind=1
,1表示启用,0表示禁用