5.1 HAPROXY调度算法
HAProxy的负载均衡调度算法可以通过编辑/etc/haproxy/haproxy.cfg文件的backend部分的balance参数进行配置。注意HAProxy支持配置多个后端,每个后端都可以配置一个调度算法。
Round-Robin(roundrobin)
顺序的分发请求给服务器。使用这个算法,所有的真实服务器都被平等对待而不管它的性能和负载如何。这个调度算法和轮询的DNS相似但是它的调度粒度更小,因为它是基于网络连接的而不是基于主机的。负载均衡器的round-robin调度算法不会像DNS轮询调度由于缓存NDS查询导致的非均衡。在HAProxy中,能够运行时动态配置服务器的权重,每个后端的活动服务器的数量限制为4095。
Static Round-Robin(static-rr)
和Round-Robin算法一样顺序的分发请求给服务器池子里面的真实服务器,但是不允许动态的配置服务器的权重。然而,因为服务器权重的是静态的,每个后端的活动服务器数量是没有限制的。
Least-Connection(leastconn)
给更少活动连接的真实服务器分发更多的请求。管理员遇到会话或连接长度的动态环境将发现这个调度器会更加适合他们的要求。它同样适合一组拥有不同性能的服务器的环境,因为管理员可以运行的时候调整权重。
Source(source)
根据请求源IP地址的哈希地址去分发请求并根据所有运行服务器的权重去决定哪个服务器获得请求。在一个所有服务器都运行的情景下,源IP地址请求将会被同一台真实服务器持续的服务。如果服务器数量或者运行的服务器权重改变了,会话将被移动到其他服务器因为hash/weight结果已经改变了。
URI(url)
通过哈希整个URI分发请求给服务器并根据所有服务器的权重进行划分去决定哪个服务器将获得请求。在一个所有活动服务器都运行的情景,目标IP请求将被同一台服务器持续服务。这个调度算法可以通过进一步配置URI的起始目录部分字符长度去计算哈希值以及URI的目录深度去计算哈希值。
URL Parameter(url_param)
通过在一个源URL请求中查找一个特殊的参数字符串并计算一个哈希除以所有的服务器权重的值进行分发请求给服务器。如果参数从URL中丢失了,调度器默认使用Round-robin调度算法。在计算哈希值之前,基于POST参数的修改器将被使用,以及基于最大数量的管理员给特定参数分配的权重的octets的等待限制将被使用。
Header Name(hdr)
通过检查在每个源HTTP请求的特定头名字,并计算哈希除以所有的运行服务器的权重的值。如果头部不见了,调度器默认使用Round-robin调度算法。
RDP Cookie(rdp-cookie)
通过在每个TCP请求查找RDP cookie并根据计算哈希除以服务器的权重的值分发请求给服务器。如果头部丢失了,调度器默认使用Round-robin调度算法。这个算法在持久性非常理想因为它维护了一个会话的完整性。
5.2 全局设置
global全局设置配置参数应用于所有运行HAProxy的服务器。一个典型的global部分将会类似如下:
global
log 127.0.0.1 local2
maxconn 4000
user haproxy
group haproxy
daemon
在上述的配置中,管理员配置了服务器去记录所有的日志到本地syslog服务器。默认情况下,可能是/var/log/syslog或其他用户设置的位置。
maxconn参数指定了服务的最大的并发连接数。默认最大是2000.
user和group参数指定了用户名和组名表明haproxy进程的拥有者。
最后,daemon参数指定了haproxy作为一个后台进程运行。
5.3 默认配置
default设置配置参数应用在一个配置(frontend,backend和listen)中所有proxy子部分。一个典型的default部分如下:
defaults
mode http
log global
option httplog
option dontlognull
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
mode指定了HAProxy实例的协议。使用http模式基于HTTP连接源请求到真实服务器,对于web服务器的负载均衡非常理想。对于其他的应用,使用tcp模式。
log指定了log地址和syslog设施的日志入口。global值参考了HAProxy实例在global部分的log参数指定的值。
option httplog使能记录HTTP会话的的各种值,包括HTTP请求,会话状态,连接数量,源地址,和连接计时器。
option dontlognull禁用了记录null连接,意味着HAProxy将不会记录没有传输数据的连接。这个在互联网上的web应用中不建议这么做,因为null连接可能暗示着恶意活动例如打开端口扫描做压测。
retries指定了在初次尝试连接失败后真实服务器将会重试一个连接请求的次数。
各种timeout数值指定了一个给定请求,连接,或应答的的非活动的时间长度。这个值通常是微秒级别的但是可以表述为其他后缀单位级别的。支持的单位为us(微秒),ms(毫秒),s(秒),m(分钟),h(小时),d(天)。http-requeest 10s给定了客户端10秒钟去等待一个完成一个HTTP请求。queue 1m设置了1分钟的时间量作为一个连接被丢弃之前的时间以及客户端获得一个503或服务不可用的错误的时间。connect 10s指定了成功连接到一个服务器的等待时间量。client 1m指定了一个客户端仍旧处于非活动的时间量(它既不能接受也不能发数据)。server 1m指定了在超时发生之前一个服务器能接收或发送数据的时间量。
5.4 前端设置
fronted设置配置了服务监听客户端连接请求的套接字。一个HAProxy的典型frontend配置如下:
frontend main
bind 192.168.0.10:80
default_backend app
称为main的frontend使用bind参数配置了192.168.0.10的IP地址并监听80端口。一旦连接,使用backend指定所有的会话连接到app后端。
5.5 后端设置
backend设置指定了真实服务器IP地址及负载均衡器的调度算法。下面是backend的典型样例:
backend app
balance roundrobin
server app1 192.168.1.1:80 check
server app2 192.168.1.2:80 check
server app3 192.168.1.3:80 check inter 2s rise 4 fall 3
server app4 192.168.1.4:80 backup
后端服务器名称为app。balance指定了负载均衡器调度算法,本例是轮询(roundrobin),但是可以是HAProxy支持的任何调度算法。
server行指定了后端可用的服务器。app1到app4是指定了给每台真实服务器的名称。Log文件将会通过名字指定服务器消息。地址是分配的IP地址。IP地址后冒号的是端口号,它是服务器特定连接发生的端口。check选项让服务器进行周期性的健康检查去保证服务器可用并能接收和发送数据并应答会话请求。服务器app3同样配置了健康检查间隔为2秒(inter 2s),通过健康检查的数量决定是否服务器是否为健康的数量(rise4),在被认为失败前一个服务器健康检查失败的数量(fall3)。
5.6 启动HAPROXY
启动HAProxy服务,执行如下命令:
#systemctl start haproxy.service
让重启服务器时服务也能启动,执行如下命令
#systemctl enable haproxy.service
5.7 记录HAPROXY消息到RSYSLOG
通过写/dev/log 套接字,可以配置系统去记录HAProxy消息到rsyslog。或者,你可以记录到TCP回环地址,但是这会导致性能变慢。
下面的流程配置HAProxy去记录消息到rsyslog
1.在HAProxy配置文件的global部分,使用log定向到/dev/log套接字。
log /dev/log local0
2.更新frontend,backend和listen代理去发送消息到你配置在HAProxy配置文件的global部分rsyslog服务。为了做个步骤,添加一个log global到你配置文件的default部分,如下:
defaults
log global
option httplog
3.如果你在chrooted环境运行HAProxy,你可以通过使用chroot配置让HAProxy创建一个chroot目录给你,之后套接字必须在那个chroot目录下面可用。你可以通过修改rsyslog配置在chroot文件系统中去创建一个新的监听套接字。添加如下行到你的rsyslog配置文件。
$ModLoad imuxsock
$AddUnixListenSocket PATH_TO_CHROOT/dev/log
4.你也可以使用rsyslog过滤器自定义配置什么HAProxy日志消息及消息出现的位置。
本文暂时没有评论,来添加一个吧(●'◡'●)