一、负载均衡
1.1、概念:
负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。至于为什么使用它,可参照我之前的博客lvs用法简介中。
1.2、算法:
加权轮询(WRR)算法:为每台分配一个权重,权重表示相对于其他服务器,自身能处理连接的能力。权重为n表示SLB为下一服务器分配流量之前,要为这台服务器分配n条新连接。
加权最小连接(WLC)算法:SLB会将新连接分配给活动连接数最少的真实服务器。为每台真实服务器分配权重m,服务器处理活动连接的能力等于m除以所有服务器权重之和。SLB会将新连接分配给活动连接数远少于其能力范围的真实服务器。
使用加权最小连接(WLC)算法时,SLB使用一种慢启动的方式来控制对新加真实服务器的访问。"慢启动"限制了新连接的建立频率并允许逐渐增加,以此来防范服务器的的过载。
二、haproxy用法
2.1、环境搭建
新建三个虚拟机
Webserver1和2以及haproxy基于rhel9
Hadproxy设置为172.25.254.100,server分别为10和20
分别echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
2.2、全局参数
两个主机中
在主机haproxy中下载yum install haproxy -y
接着在vim /etc/haproxy/haproxy.cfg
接着vim ~/.vimrc
Set ts=4 ai sw=4
先写前两行,然后#掉
然后重启systemctl restart nginx.service
这里使用的是xshell所以直接创建新的本地链接。
接着vim /etc/haproxy/haproxy.cfg中将global后面的#注释全部删掉
log是日志,chroot是运行目录,maxconn指的是最大连接数,user是运行用户,group指的是运行组。nbproc 设置进程数,cpu更改使用核心。
然后再次重启haproxy
pstree -p | grep haproxy可以查看进程
接着vim /etc/haproxy/haproxy.cfg
运行后注释掉上述变量
Cat /proc/33101/status | grep -i thread
接着Vim /etc/rsyslog.conf
2.3、更改日志
在 vim /etc/haproxy/haproxy.cfg中查看日志名
接着 vim /etc/rsyslog.conf
相当于把udp打开
使用如下命令查看
2.4、proxies
global参数
proxies参数
|-------------|---------|---------------------------------------------------------|
| 参数 | 类型 | 作用 |
| default[] | 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参数设置]
紧接着vim /etc/httpd/conf/httpd.conf
添加Listen 8080
接着vim /etc/haproxy/haproxy.cfg
2.5、socat
同样是vim /etc/httpd/conf/httpd.conf
配置
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80
server web2 172.25.254.20:80
vim /etc/haproxy/haproxy.cfg 添加如图所示haproxy如何热处理
三、haproxy的哈希圆算法
3.1、概念
HAProxy通过固定参数 balance 指明对后端服务器的调度算法
balance参数可以配置在listen或backend选项中。
HAProxy的调度算法分为静态和动态调度算法
有些算法可以根据参数在静态和动态算法中相互转换。
3.2、静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
3.2.1、static-rr:基于权重的轮询调度
- 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)
- 不支持端服务器慢启动
- 其后端主机数量没有限制,相当于LVS中的 wr
3.2.2、first
-
根据服务器在列表中的位置,自上而下进行调度
-
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
-
其会忽略服务器的权重设置
-
不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
4、动态算法
基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在haproxy运行时动态调整无需重启
有两种:roundrobin leastconn
4.1.1 roundrobin动态算法
基于权重的轮询动态调度算法,
支持权重的运行时调整,不同于lvs中的rr轮训模式,
HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
其每个后端backend中最多支持4095个real server,
支持对real server权重动态调整,
roundrobin为默认调度算法,此算法使用广泛
4.1.2、一致性哈希(哈希圆)
1、后端服务器哈希环点keyA=hash(后端服务器虚拟ip)%(2^32)
2、客户机哈希环点key1=hash(client_ip)%(2^32) 得到的值在[0---4294967295]之间,
3、将keyA和key1都放在hash环上,将用户请求调度到离key1最近的keyA对应的后端服务器
四、基于cookie会话保持
4.1概念、意义
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替。
vim etc/haproxy/haproxy.cfg配置
配置选项
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [
preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]
name:
insert:
#cookie 的 key名称,用于实现持久连接
#插入新的cookie,默认不插入cookie
indirect: #如果客户端已经有cookie,则不会再发送cookie信息
nocache:
#当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,
#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
五、haproxy的状态页面监控
通过web界面,显示当前HAProxy的运行状态
stats enable
stats hide-version
stats refresh <delay>
stats uri <prefix>
#基于默认的参数启用stats page
#将状态页中haproxy版本隐藏
#设定自动刷新时间间隔,默认不自动刷新
#自定义stats page uri,默认值:/haproxy?stats
stats auth <user>:<passwd> #认证时的账号和密码,可定义多个用户,每行指定一个用户
#默认:no authentication
stats admin { if | unless } <cond> #启用stats page中的管理功能
使用curl -A "handsomeyang" 172.25.254.100/index.html 测试
六、ACL
6.1概念
访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术 它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃
6.2ACL配置选项
#用acl来定义或声明一个acl
acl
acl
名称
<aclname> <criterion> [flags]
[operator]
匹配规范
匹配模式
[<value>]
具体操作符 操作对象类型
最后测试
[root@haproxy ~]# curl www.handsomeyang.org
webserver1 - 172.25.254.10
[root@haproxy ~]# curl www.test.com
webserver2 - 172.25.254.20