什么是负载均衡
负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
为什么用负载均衡
Web服务器的动态水平扩展-->对用户无感知
增加业务并发访问及处理能力-->解决单服务器瓶颈问题
节约公网IP地址-->降低IT支出成本
隐藏内部服务器IP-->提高内部服务器安全性
配置简单-->固定格式的配置文件
功能丰富-->支持四层和七层,支持动态下线主机
性能较强-->并发数万甚至数十万
四层和七层负载均衡的核心差异与 HAProxy 的双模式支持
四层与七层本质是在 TCP/IP 协议栈不同层级做流量调度,四层基于传输层,七层基于应用层(没有四层就不会有七层),HAProxy 是少有的能同时支持四层模拟转发和七层原生代理的负载均衡器,二者核心差异:
1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2.性能 :四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应用层报文消息内容,识别URL、Cookie、HTTP header等信息。、
3.原理 :四层负载均衡是基于ip+port;七层是基于虚拟的URL或主机IP等。
4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。
5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击
haproxy****的参数实验
环境设定

haproxy****的基本配置信息
global:全局配置段,进程及安全配置相关的参数,性能调整相关参数,Debug参数
proxies:代理配置段:defaults为frontend, backend, listen提供默认配置;frontend:前端,相当于nginx中的server {} ;backend:后端,相当于nginx中的upstream {},listen:同时拥有前端和后端配置,配置简单,生产推荐使用
global****配置
global****配置参数说明
log 127.0.0.1 local2 #定义全局的syslog服务器;日志服务器需要开启UDP
协议,最多可以定义两个
chroot /var/lib/haproxy #锁定运行目录
pidfile /var/run/haproxy.pid #指定pid文件
maxconn 100000 #指定最大连接数
user haproxy #指定haproxy的运行用户
group haproxy #指定haproxy的运行组
daemon #指定haproxy以守护进程方式运行
turn on stats unix socket
stats socket /var/lib/haproxy/stats #指定haproxy的套接字文件
nbproc 2 #指定haproxy的work进程数量,默认是1个
cpu-map 1 0 #指定第一个work绑定第一个cpu核心
cpu-map 2 1 #指定第二个work绑定第二个cpu核心
nbthread 2 #指定haproxy的线程数量,默认每个进程一个
线程,此参数与nbproc互斥
maxsslconn 100000 #每个haproxy进程ssl最大连接数,用于
haproxy配置了证书的场景下
maxconnrate 100 #指定每个客户端每秒建立连接的最大数量
多进程和线程
多线程和多进程不能一起开,按照需要来
多进程
配置文件

效果
多线程
配置文件(刚刚多进程的设定要先标记)

效果

对比
|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 多进程 | 多线程 |
|
|
|
proxies****配置
proxies参数说明proxies
defaults (proxies)默认配置项,针对以下的frontend、backend和listen生效,可以多个
name也可以没有name
frontend (proxies )前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集
群。
backend (proxies )后端服务器组,等于nginx的upstream和LVS中的RS服务器
listen (proxies )将frontend和backend合并在一起配置,相对于frontend和backend
配置更简洁,生产常用
Proxies配置-frontend
socat****工具
Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等。
查看haproxy状态

查看集群状态

查看集群权重

针对多进程处理一般会改文件


haproxy****的算法
HAProxy通过固定参数 balance 指明对后端服务器的调度算法 balance参数可以配置在listen或backend选项中。 HAProxy的调度算法分为静态和动态调度算法
有些算法可以根据参数在静态和动态算法中相互转换。
静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
static-rr**:基于权重的轮询调度**

测试

first算法
根据服务器在列表中的位置,自上而下进行调度 ,其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务 ,其会忽略服务器的权重设置 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
实验

测试

动态算法
基于后端服务器状态进行调度适当调整,新请求将优先调度至当前负载较低的服务器,权重可以在haproxy运行时动态调整无需重启
roundrobin
基于权重的轮询动态调度算法,支持权重的运行时调整;不同于lvs中的rr轮训模式;HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数);其每个后端backend中最多支持4095个real server;支持对real server权重动态调整;roundrobin为默认调度算法,此算法使用广泛
实验

测试

2 leastconn
leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)比较适合长连接的场景使用,比如:MySQL等场景。
实验

检查

其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算法
source
源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
静态

检查

动态(测试结果和刚刚一样)

uri算法
先准备环境(这是两个机子)
root@webserver1 \~\]# echo RS1 - 192.168.0.10 \> /var/www/html/index1.html \[root@webserver1 \~\]# echo RS1 - 192.168.0.10 \> /var/www/html/index2.html \[root@webserver2 \~\]# echo RS2 - 192.168.0.20 \> /var/www/html/index1.html \[root@webserver2 \~\]# echo RS2 - 192.168.0.20 \> /var/www/html/index2.html 文件  测试  url_param算法 和之前的实验环境一样,只改变一点文件内容,把balance改成url_param name  hdr算法 把balance改成(User-Agent)(符号要是英文)  ## **高级功能及配置** **基于****cookie****的会话保持** cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session共享服务器代替 文件设置  测试  ### **HAProxy****状态页** 通过web界面,显示当前HAProxy的运行状态   ### **IP****透传** web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。 七层透传   

