haproxy笔记

. 负载均衡
1.1. 什么是负载均衡
负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均
衡将特定的业务 (web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或设备,从而提高了
公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展
阿里云 SLB 介绍 : https://yq.aliyun.com/articles/1803
1.2. 为什么用负载均衡
Web 服务器的动态水平扩展 --> 对用户无感知
增加业务并发访问及处理能力 --> 解决单服务器瓶颈问题
节约公网 IP 地址 --> 降低 IT 支出成本
隐藏内部服务器 IP--> 提高内部服务器安全性
配置简单 --> 固定格式的配置文件
功能丰富 --> 支持四层和七层,支持动态下线主机
性能较强 --> 并发数万甚至数十万
1.3. 负载均衡类型
1.3.1 硬件:
F5
美国 F5 网络公司 https://f5.com/zh
Netscaler 美国思杰公司 https://www.citrix.com.cn/products/citrix-adc/
Array
华耀 https://www.arraynetworks.com.cn/
AD-1000 深信服 http://www.sangfor.com.cn/
1.3.2. 四层负载均衡
1. 通过 ip+port 决定负载均衡的去向。
2. 对流量请求进行 NAT 处理,转发至后台服务器。
3. 记录 tcp udp 流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。
4. 支持四层的软件
lvs :重量级四层负载均衡器。
Nginx :轻量级四层负载均衡器,可缓存。( nginx 四层是通过 upstream 模块)
Haproxy :模拟四层转发。
1.3.3. 七层负载均衡
1. 通过虚拟 ur| 或主机 ip 进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。
2. 代理后台服务器与客户端建立连接,如 nginx 可代理前后端,与前端客户端 tcp 连接,与后端服务器建立
tcp 连接 ,
3. 支持 7 层代理的软件:
Nginx: 基于 http 协议 (nginx 七层是通过 proxy_pass)
Haproxy: 七层代理,会话保持、标记、路径转移等
1.3.4 四层和七层的区别
所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时, 依据四层的信息或七层的信息来决
定怎么样转发流量
四层的负载均衡,就是通过发布三层的 IP 地址( VIP ),然后加四层的端口号,来决定哪些流量需要做负
载均衡,对需要处理的流量进行 NAT 处理,转发至后台服务器,并记录下这个 TCP 或者 UDP 的流量是由哪
台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理
七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比
如同一个 Web 服务器的负载均衡,除了根据 VIP 80 端口辨别是否需要处理的流量,还可根据七层的
URL 、浏览器类别、语言来决定是否要进行负载均衡。
1. 分层位置 : 四层负载均衡在传输层及以下,七层负载均衡在应用层及以下
2. 性能 : 四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高 : 七层可支持解析应用
层报文消息内容,识别 URL Cookie HTTP header 等信息。、
3. 原理 : 四层负载均衡是基于 ip+port; 七层是基于虚拟的 URL 或主机 IP 等。
4. 功能类比 : 四层负载均衡类似于路由器 ; 七层类似于代理服务器。
5. 安全性 : 四层负载均衡无法识别 DDoS 攻击 ; 七层可防御 SYN Cookie/Flood 攻击
二.haproxy 的基本配置信息
global :全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug 参数
proxies :代理配置段
defaults :为 frontend, backend, listen 提供默认配置
frontend :前端,相当于 nginx 中的 server {}
backend :后端,相当于 nginx 中的 upstream {}
listen :同时拥有前端和后端配置 , 配置简单 , 生产推荐使用
2.1Proxies 配置 -defaults
defaults
mode 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
#后在webserer中看日志即可看到地址透传
信息
option redispatch #当server Id对应的服务器挂掉后,强制定
向到其他健康的服务器,重新派发

option http-keep-alive #开启与客户端的会话保持
retries 3 #连接后端服务器失败次数

timeout http-request 1000s #等待客户端请求完全被接收和处理的最
长时间

timeout queue 60s #设置删除连接和客户端收到503或服务不可
用等提示信息前的等待时间

timeout connect 120s #设置等待服务器连接成功的时间

timeout client 600s #设置允许客户端处于非活动状态,即既不发
送数据也不接收数据的时间

timeout server 600s #设置服务器超时时间,即允许服务器处于既
不接收也不发送数据的非活动时间

timeout http-keep-alive 60s #session 会话保持超时时间,此时间段内
会转发到相同的后端服务器

timeout check 10s #指定后端服务器健康检查的超时时间
maxconn 3000
default-server inter 1000 weight 3

.haproxy的算法

静态算法
1. static-rr :基于权重的轮询调度
不支持运行时利用 socat 进行权重的动态调整 ( 只支持 0 1, 不支持其它值 )
不支持端服务器慢启动
其后端主机数量没有限制,相当于 LVS 中的 wrr
慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没
问题后在给一部分
2.first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用 socat 进行动态修改权重 , 可以设置 0 1, 可以设置其它值但无效
动态算法
1.roundrobin
1. 基于权重的轮询动态调度算法,
2. 支持权重的运行时调整,不同于 lvs 中的 rr 轮训模式,
3. HAProxy 中的 roundrobin 支持慢启动 ( 新加的服务器会逐渐增加转发数 )
4. 其每个后端 backend 中最多支持 4095 real server
5. 支持对 real server 权重动态调整,
6. roundrobin 为默认调度算法 , 此算法使用广泛
2. leastconn
eastconn 加权的最少连接的动态
支持权重的运行时调整和慢启动,即 : 根据当前连接最少的后端服务器而非权重进行优先调度 ( 新客户
端连接 )
比较适合长连接的场景使用,比如: MySQL 等场景。
其他算法
1 source
源地址 hash ,基于用户源地址 hash 并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一
个后端 web 服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服
务器,默认为静态方式,但是可以通过 hash-type 支持的选项更改这个算法一般是在不插入 Cookie TCP
模式下使用,也可给拒绝会话 cookie 的客户提供最好的会话粘性,适用于 session 会话保持但不支持
cookie 和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法
和一致性 hash
map-base 取模法
map-based :取模法,对 source 地址进行 hash 计算,再基于服务器总权重的取模,最终结果决定将此请
求转发至对应的后端服务器。
此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度
缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果 整体改变
一致性 hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动 hash o
mod n
hash 算法是动态的,支持使用 socat 等工具进行在线权重调整,支持慢启动
uri
基于对用户请求的 URI 的左半部分或整个 uri hash ,再将 hash 结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过 hash-type 指定 map-based consistent ,来定义使用取模法还是一致性
hash

haproxy

1.基础服务的搭建

#基础服务的搭建
​
##haproxy服务器172.25.254.151
yum install  haproxy -y
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
#利用前端和后端一起配合使用
frontend  webcluster
        bind *:80   #监听端口
        mode http
        use_backend webcluster-host  #使用哪个后端
        
backend  webcluster-host
        balance     roundrobin    #使用哪个算法
        server      web1 172.25.254.152:80
        server      web2 172.25.254.153:80
################
#使用简洁方法
listen webserver_80
bind 172.25.254.151:80
        mode http
        balance     roundrobin
server webserver1 172.25.254.152:80    
server webserver2 172.25.254.153:80
​
systemctl start haproxy
​
​
​
​
#web1服务器172.25.254.152
[root@rhel9 ~]# echo webserver1-152  > /usr/share/nginx/html/index.html
[root@rhel9 ~]# systemctl enable  --now nginx
​
#web2服务器172.25.254.153
[root@rhel9 ~]# echo webserver2-153  > /usr/share/nginx/html/index.html
[root@rhel9 ~]# systemctl enable  --now nginx
​
​
​

haproxy的全局配置和日志管理

[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    nbproc 2    #多进程
    cpu-map 1 0 #多进程绑定cpu
    cpu-map 2 1 
    #nbthread 2 #多线程,注意多线程和多进程互斥
    stats socket /var/lib/haproxy/stats
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
​
日志管理   
[root@rhel9 ~]#systemctl start haproxy
[root@rhel9 ~]# pstree -p  | grep haproxy
           |-haproxy(37784)-+-haproxy(37786)
           |                `-haproxy(37787)
​
[root@rhel9 ~]# vim /etc/rsyslog.conf 
 32 module(load="imudp") # needs to be done just once
 33 input(type="imudp" port="514")
 68 local2.*                                                /var/log/haproxy.log
[root@rhel9 ~]# systemctl restart rsyslog.service 
[root@rhel9 ~]# systemctl restart haproxy
[root@rhel9 ~]# ll /var/log/haproxy.log 
-rw------- 1 root root 9562  8月 12 00:04 /var/log/haproxy.log
​
[root@rhel9 ~]# vim /etc/httpd/conf/httpd.conf 
Listen 9090
[root@rhel9 ~]# echo backup > /var/www/html/index.html
[root@rhel9 ~]# systemctl start httpd 
[root@rhel9 ~]# curl 172.25.254.100:9090
backup
​
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver_80
bind 172.25.254.151:80
        mode http
        balance     roundrobin
        
server webserver1 172.25.254.152:80 check inter  2  fall  3 rise 5  weight 2 (disabled)
#disable 就是让服务器下线,一般用于服务器维护
​
server webserver2 172.25.254.153:80 check inter  2  fall  3 rise 5  weight 1 maxconn 3
​
server websorry 172.25.254.151:9090 backup
#当web1和web2服务器坏掉了,用户再去访问172.25.254.151的时候会指定到172.25.254.151:9090
​
redirect prefix http://www.baidu.com/
当web1和web2服务器坏掉了,,用户再去访问172.25.254.151的时候会指定到//www.baidu.com/

haproxy-proxies中的常用配置参数

[root@rhel9 ~]# vim /etc/httpd/conf/httpd.conf 
Listen 9090
[root@rhel9 ~]# echo backup > /var/www/html/index.html
[root@rhel9 ~]# systemctl start httpd 
[root@rhel9 ~]# curl 172.25.254.100:9090
backup
​
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver_80
bind 172.25.254.151:80
        mode http
        balance     roundrobin
        
server webserver1 172.25.254.152:80 check inter  2  fall  3 rise 5  weight 2 (disabled)
#disable 就是让服务器下线,一般用于服务器维护
​
server webserver2 172.25.254.153:80 check inter  2  fall  3 rise 5  weight 1 maxconn 3
​
server websorry 172.25.254.151:9090 backup
#当web1和web2服务器坏掉了,用户再去访问172.25.254.151的时候会指定到172.25.254.151:9090
​
redirect prefix http://www.baidu.com/
当web1和web2服务器坏掉了,,用户再去访问172.25.254.151的时候会指定到//www.baidu.com/
​

haproxy的热更新(不停服更新)

[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
36     stats socket /var/lib/haproxy/stats  mode 600 level admin
#用户提权
​
​
[root@rhel9 ~]# dnf install socat  -y
​
[root@rhel9 ~]# echo "show info" | socat stdio  /var/lib/haproxy/stats
#查看haproxy的状态
​
[root@rhel9 ~]# echo "show servers state" | socat stdio  /var/lib/haproxy/stats
#查看server的状态
​
[root@rhel9 ~]# echo get weight webserver_80/webserver1 | socat stdio  /var/lib/haproxy/stats
2 (initial 2)
#得到server1的权重,注意集群名称和服务名不要写错
​
[root@rhel9 ~]# echo set weight webserver_80/webserver1 3 | socat stdio  /var/lib/haproxy/stats
#修改webserver1的权重为3,但是/etc/httpd/conf/httpd.conf还是原来的值
​
[root@rhel9 ~]# echo disable server  webserver_80/webserver1  | socat stdio  /var/lib/haproxy/stats
#webserver1  下线
​
[root@rhel9 ~]# echo enable server  webserver_80/webserver1  | socat stdio  /var/lib/haproxy/stats
#启动webserver1
​
###################################################################
多进程热更新,修改配置文件以后。操作和单进程用于,只要使用热更新操作的时候修改路径
[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
global
    nbproc 2    #多进程
    cpu-map 1 0 #多进程绑定cpu
    cpu-map 2 1
    stats socket /var/lib/haproxy/stats1  mode 600 level admin
    stats socket /var/lib/haproxy/stats2  mode 600 level admin
[root@rhel9 ~]# systemctl restart haproxy.service 
[root@rhel9 ~]# echo disable server  webserver_80/webserver1  | socat stdio  /var/lib/haproxy/stats1
#webserver1  下线
haproxy的状态页

[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
listen stats
        mode http
        bind 172.25.254.151:9999
        stats enable
        stats refresh 10
        stats uri  /status
        stats auth aaa:aaa
[root@rhel9 ~]# systemctl restart haproxy.service

haproxy高级设置基于cookie的会话保持

相对于源地址hash,对浏览器缓存,当同一个浏览器访问时,缓存以后,你刷新很多次以后,还是会指定到同一realserver主机;

[root@rhel9 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver_80
        bind 172.25.254.151:80
        mode http
        balance     roundrobin
#redirect prefix http://www.baidu.com/
 cookie webcookie insert nocache indirect
server webserver1 172.25.254.152:80  cookie aaa check inter  2  fall  3 rise 5  weight 1
server webserver2 172.25.254.153:80  cookie bbb check inter  2  fall  3 rise 5  weight 1
#server websorry 172.25.254.151:9090 backup
[root@rhel9 ~]# systemctl restart haproxy.service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值