一、负载均衡
负载均衡:LoadBalance ,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
1.2为什么用负载均衡
web服务器的动态水平扩展-->对用户无感知
增加业务并发访问及处理能力-->解决单服务器瓶颈问题
节约公网IP地址-->降低IT支出成本
隐藏内部服务器IP-->提高内部服务器安全性
配置简单-->固定格式的配置文件
功能丰富-->支持四层和七层,支持动态下线主机
性能较强-->并发数万甚至数十万
1.3负载均衡类型
1.3.1 四层负载均衡
1.通过ip+port决定负载均衡的去向
2.对流量请求进行NAT处理,转发至后台服务器
3.记录tcp、udp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理
4.支持四层的软件
lvs:重量级四层负载均衡器
nginx:轻量级四层负载均衡器
Haproxy:模拟四层转发
1.3.2 七层负载均衡
通过虚拟ur|或主机ip进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建立tcp连接,
支持7层代理的软件:
nginx:基于http协议
Haproxy:七层代理,会话保持、标记、路径转移等
二、Haproxy的安装和服务信息
软件包:haproxy
版本查看:haproxy -v
2.1Haproxy的基本配置信息
global:全局配置段
进程及安全配置相关参数
性能调整相关参数
debug参数
proxies:代理配置段
defaults:为frontend,backend,listen提供默认配置
frontend:前端,相当于nginx中的server{}
backend:后端,相当于nginx中的upstream{}
listen:同时拥有前端后端配置,配置简单
2.1.2 global配置参数说明
globallog 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 socketstats 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 #指定每个客户端每秒建立连接的最大数量
defaults 默认配置项,针对以下的frontenf、backend和listen生效,可以多个name也可以没有namefrontend 前端servername,类似于nginx的一个虚拟主机server和LVS服务集群backend 后端服务器组,等于nginx和upstream的LVS中的RS服务器listen 将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用defaultsmode http #HAProxy实例使用的连接协议log global #指定日志地址和记录日志条目的syslog/rsyslog日志设备#此处的 global表示使用 global配置段中设定的log值。option httplog #日志记录选项,httplog表示记录与 HTTP会话相关的各种属性值#包括 HTTP请求、会话状态、连接数、源地址以及连接时间等option dontlognull #dontlognull表示不记录空会话连接日志option http-server-close #等待客户端完整HTTP请求的时间,此处为等待10s。option forwardfor except 127.0.0.0/8 #透传客户端真实IP至后端web服务器#在apache配置文件中加入:<br>%{XForwarded-For}i#后在webserver中看日志即可看到地址透传信息option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发option http-keep-alive #开启与客户端的会话保持retries 3 #连接后端服务器失败次数timeout http-request 10s #等待客户端请求完全被接收和处理的最长时间timeout queue 1m #设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间timeout connect 120s #设置等待服务器连接成功的时间timeout client 600s #设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间timeout server 600s #设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间timeout http-keep-alive 60s #session 会话保持超时时间,此时间段内会转发到相同的后端服务器timeout check 10s #指定后端服务器健康检查的超时时间maxconn 3000default-server inter 1000 weight 3
2.2 socat工具
对服务器动态权重和其他状态可以利用socat工具进行调整,socat是Linux下的一个多功能的网络工具,名字来由是socket cat,相当于netcat的增强版。其主要特点就是在两个数据流之间建立双向通道,且支持众多协议和连接方式,如IP、TCP、UDP、IPV6、Socket文件等
三、Haproxy的算法
Haproxy通过固定参数balance指明对后端服务器的调度算法
balance参数可以配置在listen或backend选项中
Haproxy的调度算法分为静态和动态调度算法
有些算法可以根据参数在静态和动态算法中相互转换
3.1静态算法
按照事先定义好的规则轮询公平调度,不关心后端服务器当前负载、连接数和响应速度等,且无法实时修改权重(且只能为0和1,不支持其他值),只能靠重启Haproxy生效
3.1.1 static-rr:基于权重的轮询调度
3.1.2 first
3.2 动态算法
基于后端服务器状态进行调度适当调整
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整无需重启
3.2.1 roundrobin
3.2.2 leastconn
3.3 其他算法
3.3.1 source
3.3.1.1 map-base 取模法
3.3.1.2 一致性hash
当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动hash(o)mod n
该hash算法是动态的,支持使用socat等工具进行在线权重调整,支持慢启动
3.3.2 uri
3.3.3 url_param
3.3.4 hdr
3.3.5总结
四、Haproxy的高级功能配置
4.1基于cookie的会话保持
4.1.1配置示例
4.1.2验证
4.2Haproxy状态页
通过web界面,显示当前Haproxy的运行状态
启用状态页
登录状态页:
4.3IP传透
4.3.2四层IP穿透
未开启穿透的四层代理
在访问haproxy后在server1查看nginx日志
此时无法看到真实访问源地址
开启四层透传
在server1上对nginx进行配置
修改proxy
此时在server1上查看日志内容
4.4 ACL
是一种基于包过滤的访问控制技术
它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃
4.5 自定义Haproxy