Haproxy

目录

七层和四层的区别

haproxy实验环境部署

webserver1 2 的配置

socat工具

算法

高级功能及配置


七层和四层的区别

所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量

四层的负载均衡,就是通过发布三层的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实验环境部署

haproxy主机

[root@haproxy ~]# dnf install haproxy -y

#查找配置文件
[root@haproxy ~]# rpm -qc haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend webcluster
    bind *:80
    mode http
    use_backend webcluster-host
backend webcluster-host
    balance     roundrobin
    server web1 172.25.254.10:80
    server web2 172.25.254.20:80
#另外一种写法
listen webcluster
    bind *:80
    mode http
    balance     roundrobin
    server web1 172.25.254.10:80
    server web2 172.25.254.20:80
[root@haproxy ~]# systemctl restart haproxy.service

webserver1 2 的配置

[root@webserver1 ~]# dnf install nginx -y
[root@webserver1 ~]# echo web1-10 > /usr/share/nginx/html/index.html 
[root@webserver1 ~]# systemctl enable --now nginx

全局配置参数及日志分离

进程

#设定多进程
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
nbproc 2
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(33253)-+-haproxy(33255)
           |                `-haproxy(33256)
[root@haproxy ~]# systemctl restart haproxy.service 
           
           
#cpu核心绑定,防止cpu抖动从而减少系统资源消耗
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
    nbproc 2       #开启的进程数
    cpu-map 1 0
    cpu-map 2 1
[root@haproxy ~]# systemctl restart haproxy.service 
[root@haproxy ~]# pstree -p | grep haproxy
           |-haproxy(33276)-+-haproxy(33278)
           |                `-haproxy(33279)
           
#查看子进程的线程
[root@haproxy ~]# cat /proc/33279/status | grep -i thread
Threads:	1
Speculation_Store_Bypass:	thread vulnerable

线程

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
nbthread 2

自定义日志

[root@haproxy ~]# vim /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local2.*                                                /var/log/haproxy.log

socat工具

下载socat

[root@haproxy ~]# dnf install socat -y

修改权限

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
stats socket /var/lib/haproxy/stats1   mode 600 level admin

查看状态

[root@haproxy ~]# echo 'show servers state' | socat stdio /var/lib/haproxy/stats1
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port

算法

静态算法

static-rr

基于权重 的轮询调度

不支持运行时利用socat进行权重的动态调整

不支持端服务器 慢启动( 其中一台服务器挂了,流量应该一点一点发送)

其后端主机数量没有限制 ,相当于LVS中的 wrr

first

根据服务器在列表中的位置,自上而下进行调度

其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务

其会忽略服务器的权重设置

不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

动态算法

基于后端服务器状态进行调度适当调整

新请求将优先调度至当前负载较低的服务器

可以用socat进行热设定权重

roundrobin

基于权重的轮询动态调度算法,

支持权重的运行时调整,不同于lvs中的rr轮训模式

HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),

其每个后端backend中最多支持4095个real server,

支持对real server权重动态调整,

roundrobin为默认调度算法,此算法使用广泛

lestconn

leastconn 加权的最少连接的动态

支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接)

比较适合长连接的场景使用,比如:MySQL等场景

其他算法

既可以作为静态,也可以成为动态

source

静态

源地址hash,源不变,就会一直转发到同一个后端服务器上。

但是当后端服务器发生改变(比如断了),会话就丢失了

默认情况下都是静态算法

但是实际情况ip可能是很贵的,一家公司都使用同一个IP去访问服务器的话,会造成失衡的情况

 map-base取模法

静态

对源地址进行hash,在基于服务器总权重取模。最终结果决定将此请求转发到对应的后端服务器。

缺点:如果更改了权重,或者服务器上下线,会出现一部分会话丢失

hash一致性

动态,支持socat,慢启动

特点:当服务器权重发生变化时,对调度结果的影响是局部的,不会引起大的变动

算法

uri

默认是静态算法,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
左半部分:/<path>;<params>
整个uri:/<path>;<params>?<query>#<frag>

<scheme> 协议

<user>:<password>用户密码

<host>www.jd.com

<port>端口 443 80

<path>路径 /index.html

<params>向服务器传递的指令 search

<query>搜索的字段

<frag>片段 快速定位

uri:资源在互联网里的唯一标识符

url:资源在服务器的真实位置

url_param取模
listen webcluster
    bind *:80
    mode http
    #指定关键字
    balance url_param name,userid 
    server web1 172.25.254.10:80  weight 2 check inter 3s fall 3 rise 5
    server web2 172.25.254.20:80  weight 1 check inter 3s fall 3 rise 5
    server web_sorry 172.25.254.100:8080 backup
hdr

报文:详见web的ppt

对包头当中的某些信息取模

浏览器访问主机

Use-Agent

高级功能及配置

1.基于cookie的会话保持

配置选项

name: #cookie 的 key名称,用于实现持久连接

insert: #插入新的cookie,默认不插入cookie

indirect: #如果客户端已经有cookie,则不会再发送cookie信息

nocache: #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie, #因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

2.ip透传

web服务器中需要记录ip

与defaults区域里面的

option forwardfor 有关

但是apache做不到

动静分离实验
frontend webcluster
    bind *:80
    mode http
    acl ststic path_end -i .html .jpg .png .css .js
    acl php path_end -i .php
    use_backend webcluster-host if php
    default_backend default-host

webserver1 2 

[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# vim /var/www/html/index.php
<?php
        phpinfo();
?>
[root@webserver1 ~]# systemctl restart httpd

基于路径访问

frontend webcluster
    bind *:80
    mode http
    acl ststic path_sub -m sub static
    acl php    path_sub -m sub php
    use_backend webcluster-host if php
    default_backend default-host

backend webcluster-host
    mode http
    server web1 172.25.254.10:80 check inter 2 fall 2 rise 5

backend default-host
    mode http
    server web2 172.25.254.20:80 check inter 2 fall 2 rise 5

webserver 12 

[root@webserver1 ~]# mkdir -p /var/www/html/php
[root@webserver1 ~]# mv /var/www/html/index.php /var/www/html/php/
[root@webserver2 ~]# mkdir /usr/share/nginx/html/static -p
[root@webserver2 ~]# echo static - 172.25.254.20 > /usr/share/nginx/html/static/index.html

3.ACL

基于域名访问

基于源访问

基于浏览器

4.自定义错误页面

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
    errorloc 503 https://www.baidu.com

5.https的实现

增加证书

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/test.org.key -x509 -days 365 -out /etc/haproxy/certs/test.org.crt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值