程序环境:
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置
haproxy反向代理后端服务器httpd
1)修改haproxy配置文件,启动
[root@Centos7 ~]#vim /etc/haproxy/haproxy.cfg
listen web
mode tcp
bind 192.168.8.101:80
server web1 192.168.8.103:80 check
server web2 192.168.8.104:80 check
启动
[root@haproxy ~]#systemctl start haproxy
2)安装httpd,启动
[root@centos ~]#yum install httpd -y
[root@centos ~]#systemctl start httpd
3)测试
[root@centos ~]#while : ;do curl 192.168.8.101 ;sleep 0.5 ;done
<h1/>192.168.8.103</h1>
<h1/>192.168.8.103</h1>
<h1/>192.168.8.104</h1>
<h1/>192.168.8.103</h1>
<h1/>192.168.8.104</h1>
haproxy调度算法
HAProxy 静态调度算法
balance:指明对后端服务器的调度算法,配置在listen或backend
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实时修改权重,只能重启后生效。
static-rr:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制
first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置。
HAProxy 动态调度算法
动态算法:基于后端服务器状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。
roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不等于lvs 的rr,支持慢启动即新加的服务器会逐渐增加转发数,每个后端backend中最多支持4095个server,此为默认调度算法,server 权重设置weight
leastconn:加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度,比较适合长连接的场景使用,比如MySQL等场景。
HAProxy 调度算法-source
source:源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
map-based:取模法,基于服务器权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢启动,其对后端服务器调度均衡,缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变化而导致调度结果整体改变,hash(o)modn 。
source:源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式,但是可以通过hash-type支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器,比较适用于session保持/缓存业务等场景。
consistent:一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动。
HAProxy 调度算法-uri
- uri:基于对用户请求的uri做hash并将请求转发到后端指定服务器
- map-based:取模法
- consistent:一致性哈希
uri调度算法示例:
listen web_prot_http_nodes
bind 192.168.7.101:80
mode http #不支持tcp,会切换到tcp的roundrobin负载模式
balance uri
hash-type consistent
log global
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
HAProxy 调度算法-url_param
- url_param:
对用户请求的url中的<params>部分中的参数name作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server
url_param调度算法示例:
listen web_prot_http_nodes
bind 192.168.7.101:80
mode http #不支持tcp,会切换到tcp的roundrobin负载模式
balance url_param name #基于参数name做hash
hash-type consistent
log global
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
HAProxy 调度算法-hdr
- hdr(<name>):针对用户每个http头部(header)请求中的指定信息做hash,此处由<name>指定的http首部将会被取出并做hash计算,然后由服务器总权重相除以后派发至某挑出的服务器,假如无有效的值,则会被轮询调度
HAProxy 调度算法-rdp-cookie
- rdp-cookie对远程桌面的负载,使用cookie保持会话
- rdp-cookie(<name>)
四层与七层的区别:
- 四层:
- 在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据。
- 七层:
- 七层负载均衡服务器起了一个代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用。
基于cookie实现session会话保持
listen web
mode http
option forwardfor
bind 192.168.8.101:80
cookie NAME insert
server web1 192.168.8.103:80 cookie web1 check
server web2 192.168.8.104:80 cookie web2 check
基于域名匹配的 acl 访问控制
listen web
mode http
rspidel server.*
option forwardfor
rspadd server:HAProxy
bind 192.168.8.101:80
acl test_host hdr_dom(host) www.xingyu.com
acl test_host1 hdr_dom(host) www.xingyu.vip
use_backend test_host if test_host
use_backend test_host1 if test_host1
# server web1 192.168.8.103:80 check
# server web2 192.168.8.104:80 check
backend test_host
mode http
server web3 192.168.8.103:80 check
backend test_host1
mode http
server web4 192.168.8.104:80 check