HAProxy入门及常用配置模拟测试

HAProxy简介

??
??HAProxy是一个使用C语言编写的,提供负载均衡,以及基于TCP(伪四层)和HTTP(七层)的应用程序代理。
??HAProxy特别适用于那些负载大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
??HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。
??

HAProxy与LVS对比

??

1.都是负载均衡的实现产品,但是LVS是基于Linux操作系统的软负载均衡;HAProxy是基于第三方应用的软负载均衡。

??

2.LVS是基于四层的IP负载均衡方案;HAProxy是同时具有四层和七层的,可以提供TCP和HTTP应用的负载均衡方案。

??

3.LVS工作在OSI参考模型的四层,所以其状态监控功能比较简陋,HAProxy在状态监控方面更为优秀,可以支持基于端口,URL,脚本等多种状态监测方法。

??

4. HAProxy在整体性能上明显低于四层负载的LVS;LVS技术由于Linux系统内核的支持有着接近于硬件设备的负载能力。

??

部署及配置文件介绍

安装部署

haproxy安装不算很难,haprox官方base源已经被收录,也可以使用源码编译。

yum安装

安装haproxy

    yum install haproxy -y

源码编译安装

1.安装开发环境

    yum groupinstall "development tools" -y

2.下载源码包

wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.8.12.tar.gz/sha512/2b782a54988cc88d1af0e5f011af062910e8fac28eab13db7e05a58d0d23961f827da47e3871e8d081f5a2d222588480d81dec2e9f14ec9f54a1c3cb5bf3d56a/

3.解压并安装

tar -xvf haproxy-1.8.12.tar.gz
cd haproxy-1.8.12

#获取内核版本信息
uname -r

# TARGET=linux310,内核版本,使用uname -r来查看
# ARCH指明系统的位数
# PREFIX指明安装的路径
make TARGET=linux310 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

4.准备配置文件

#创建对应目录
mkdir /usr/local/haproxy/conf
#创建配置文件
cd /usr/local/haproxy/conf
vim haproxy.cfg

#这里复制一份yum安装的配置文件就好,也可以自己写一份

5.添加用户

useradd -r -s /usr/sbin/nologin haproxy
  1. 启动haproxy

    # -f指明配置文件,配置文件一定要写对,否则无法启动haproxy
    /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg 

配置文件介绍

配置文件大体分类

全局配置段(global):(建议不做改动,会自动调整)
1.进程与安全配置相关的参数设定;
2.性能参数配置段;
3.Debug参数配置段;
4.用户列表段;
5.peer段
代理配置段(proxies):
1.defaults段:默认参数的配置段,在本段配置的参数值,默认会被自动引用到之后的frontend段,backend段和listen段,所以,如果某些参数属于公用的配置段,那么可以在default段进行配置即可。如果在frontend段,backend段和listen段进行配置的参数同时在default也有相应参数配置的话,default段的配置会被覆盖掉。
2.frontend段:本段负责配置接收用户请求的虚拟前端节点。类似于nginx的server{}部分。
3.backend段:本段用于设置集群后端服务器集群的配置,也就是用来定义一组真实服务器,来处理用户发出的请求。添加的真实服务器类似于LVS中的real-server,相当于nginx中的 upstream {}段
4.listen段:同时用来负责配置前端和happ后端。

配置文件详解

global配置段

#常用配置项
log: 全局日志文件配置条目,local2表示日志设备,最多可定义两个
nbproc:要启动的haproxy的进程数量
chroot: chroot 切换根目录,将haproxy都运行在/var/lib/haproxy 这样做是为了增加haproxy的安全。
pidfile:指定haproxy的进程pid文件,启动进程的用户必须要有访问该文件的权限。
maxconn:设定每个haproxy进程可以接受的最大并发连接数。
user和group:指定运行haproxy的用户和组
daemon: 设置haproxy以后台运行的方式运行。
maxconnrate:每个进程每秒最大处理的连接数量。
maxse***ate:每个进程每秒可以创建的最大会话速率。
maxsslconn:设定每个haproxy进程所能接受的ssl最大并发连接数。

default配置段

#常用配置项
mode:设置haproxy实例默认的运行模式,默认是http,支持tcp,http可选值
        tcp模式:在该模式之下,客户端会与服务器端建立一个全双工连接,不对七层报文做检查,常用语ssl,ssh,smtp等服务。
        http模式:客户端在请求转发到后端服务器之前会被分析。
log global:继承全局日志
option dontlognull:保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
option http-server-close:客户端与服务器端在完成一次连接请求之后,HAProxy会主动关闭该TCP连接,有助于提高性能。
xforwardfor:由于haprxoy工作在反向代理方向,因此后端的真实服务器可能无法获取真实的请求端ip,使用xforwardfor可以在报文中封装新的字段记录请求端ip,httpd的话要在默认日志格式中进行修改才可以记录。
redispatch:是否允许在session 失败后重新分配。
retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,haproxy将会将对应的后端服务器设置为不可用状态。
timeout connect: 成功连接到一台服务器的最长等待时间,默认为毫秒,可以换用其他单位。
timeout client:连接客户端发送数据的最长等待时间,默认毫秒,可修改。
timeout server:服务器端回应客户端数据发送的最长等待时间,默认毫秒,可以修改。
timeout check:设置对后端服务器的检测超时时间,默认毫秒,可以修改

重点配置参数

1.bind:配置监听套接字,不能有默认值,不能用在backend中。
bind :80,:443 同时监听2个端口(之间不能有空格,监听端口要重启服务)
bind ip:port,ip:port
bind /var/****.sock 使用套接字文件
2.balance:后端服务器组内的调度算法
roundrobin:轮询,依次访问每一个后端ip(短连接和无状态的连接推荐使用rr算法)
    server options: weight #  支持配置权重
    动态算法:支持权重的运行时调整,支持慢启动;每个后端中最多支持4095个server;
    static-rr:静态算法:不支持权重的运行时调整及慢启动;后端主机数量无上限;

配置文件:

请求效果

加权轮询

效果

leastconn:推荐使用在具有较长会话(长连接,有状态)的场景中,例如MySQL、LDAP等;

first:先到先得,根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务;

source:源地址hash,本质上是source ip,将同一个ip的请求发往同一服务器,用于保持会话。(snat模式与后端服务器宕机会出现问题)
                            除权取余法(一旦服务器组发生变化会产生巨大影响):map-based
                            一致性哈希(最佳,但是由于做大量运算会影响性能):consistent

uri:对URI的左半部分做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;有助于提升缓存命中率。

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

                                    username=jerry

uri 算法测试

效果

url_param:对用户请求的uri的<params>部分中的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server;

hdr(<name>):对于每个http请求,此处由<name>指定的http首部将会被取出做hash计算; 并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度;
                            hdr(Cookie)

                        rdp-cookie
                        rdp-cookie(<name>)  

hash-type:哈希算法
                        hash-type <method> <function> <modifier>
                            map-based:除权取余法,哈希数据结构是静态的数组;
                            consistent:一致性哈希,哈希数据结构是一个树;

                        <function> is the hash function to be used : 哈希函数
                            sdbm
                            djb2
                            wt6

hdr算法匹配报文字段请求(这里匹配的是浏览器)

效果

3.default_backend:设置默认的后端主机组,在frontend中定义
4.server的配置,定义后端主机的各个服务器及选项。同一后端主机可以被多个backend引用。

name:服务器在haproxy上的内部名称,主要出现在日志和警告中;
address:服务器地址,可以使用主机名替代(重要)
maxconn <maxconn>:当前server的最大并发连接数;
backlog <backlog>:当前server的连接数达到上限后的后援队列长度;
backup:设定当前server为备用服务器;
check:对当前server做健康状态检测;默认是tcp的检测,要关注状态变化

                                addr :检测时使用的IP地址;
                                port :针对此端口进行检测;
                                inter <delay>:连续两次检测之间的时间间隔,默认为2000ms;
                                rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2;
                                fail <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;

               注意:option httpchk,"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk" 用于定义应用层检测方法;

cookie <value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性;
disabled:标记为不可用;一般用来做发布
on-error <mode>:后端服务故障时的行动策略;

                                - fastinter: force fastinter
                                - fail-check: simulate a failed check, also forces fastinter (default)
                                - sudden-death: simulate a pre-fatal failed health check, one more failed
                                check will mark a server down, forces fastinter
                                - mark-down: mark the server immediately down and force fastinter

redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;

weight <weight>:权重,默认为1。

5.基于cookie做会话绑定


6.httpchk健康状态检测

对后端服务器做http协议的健康状态检测:

                    option httpchk
                    option httpchk <method> <uri>
                    option httpchk <method> <uri> <version>
                    定义基于http协议的7层健康状态检测机制
7.接口,统计配置

配置状态页


启用统计页;基于默认的参数启用stats page;

                                - stats uri   : /haproxy?stats 访问页默认地址,支持重写
                                - stats realm : "HAProxy Statistics"
                                - stats auth  : no authentication
                                - stats scope : no restriction

示例



maxconn <conns>:为指定的frontend定义其最大并发连接数;默认为2000;
Fix the maximum number of concurrent connections on a frontend.

mode { tcp|http|health }:定义haproxy的工作模式;
tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议;
http:仅当代理的协议为http时使用;
health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接;
例子:

listen ssh
                                bind :22011
                                balance leastconn
                                mode tcp
                                server sshsrv1 192.168.99.131:22 check
                                server sshsrv2 192.168.99.135:22 check

forwardfor [ except <network> ] [ header <name> ] [ if-none ]
在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值前端客户端的地址;用于向后端主发送真实的客户端IP;
[ except <network> ]:请求报请来自此处指定的网络时不予添加此首部;
[ header <name> ]:使用自定义的首部名称,而非“X-Forwarded-For”
示例:
haproxy配置文件

后端httpd配置文件(修改后要重启httpd服务)

测试效果:记录了原地址。

rspadd <string> [{if | unless} <cond>]在http响应首部添加字段信息
rspadd X-Via:\ douma

reqdel <search> [{if | unless} <cond>]在http响应包首都中删除匹配到的信息
rspidel(i忽略字符大小写) Server.*
示例:可以用来实现删除server信息,以防暴露站点漏洞
修改前

haproxy配置文件

新效果:

ACL访问控制

指令结构

acl <aclname> <criterion> [flags] [operator] [<value>] ...
aclname:设定acl的名称
value:设定acl的值

boolean:布尔型
integer or integer range:整数或者范围
ip address /network:ip地址或者网络地址
string :字符串
        exact:精确匹配
        substring:子串匹配
        suffix:前缀匹配
        prefix:后缀匹配
        subdir:子路径匹配
        domain:子域匹配
regular expression:正则表示模式匹配
hex block:十六进匹配

flag标志位

<flags>
                -i : 在子串匹配时候忽略大小写
                -m : 使用特定匹配模式(很少使用)
                -n : 忽略dns做名称解析
                -u : 要求ACL使用唯一名称
                -- : force end of flags. Useful when a string looks like one of the flags.
             [operator]
                匹配整数值:eq、ge、gt、le、lt

                匹配字符串:
                    - exact match     (-m str) : the extracted string must exactly match the patterns ;
                    - substring match (-m sub) : the patterns are looked up inside the extracted string, and the ACL matches if any of them is found inside ;
                    - prefix match    (-m beg) : the patterns are compared with the beginning of the extracted string, and the ACL matches if any of them matches.
                    - suffix match    (-m end) : the patterns are compared with the end of the extracted string, and the ACL matches if any of them matches.
                    - subdir match    (-m dir) : the patterns are looked up inside the extracted string, delimited with slashes ("/"), and the ACL matches if any of them matches.
                    - domain match    (-m dom) : the patterns are looked up inside the extracted string, delimited with dots ("."), and the ACL matches if any of them matches. 

acl作为条件时的逻辑关系:
                - AND (implicit)
                - OR  (explicit with the "or" keyword or the "||" operator)
                - Negation with the exclamation mark ("!")

                    if invalid_src invalid_port  要求同时满足
                    if invalid_src || invalid_port  或表示
                    if ! invalid_src invalid_port    取反,不满足第一个但是满足第二个
<criterion> :
                dst : ip 目标ip或者范围
                dst_port : integer  目标端口或范围
                src : ip  源ip或者范围
                src_port : integer  源端口后缀范围

                    acl invalid_src  src  172.16.200.2

                path : string 七层检查
                        /path;<params>

                    path     : exact string match 精确匹配
                    path_beg : prefix match 前缀匹配
                    path_dir : subdir match 子串匹配
                    path_dom : domain match 子域匹配
                    path_end : suffix match 路径后缀匹配
                    path_len : length match 长度匹配
                    path_reg : regex match 正则匹配
                    path_sub : substring match 子串匹配

示例

path_beg /images/   除去ip:port之后以/images/开头
path_end .jpg .jpeg .png .gif url以jpg jpeg png gif后缀的文件
path_reg ^/images.*\.jpeg$ images开头 jpeg结尾
path_sub image
path_dir jpegs
path_dom ilinux

                     /images/jpegs/20180312/logo.jpg
url : string 对url进行匹配

                    url     : exact string match
                    url_beg : prefix match
                    url_dir : subdir match
                    url_dom : domain match
                    url_end : suffix match
                    url_len : length match
                    url_reg : regex match
                    url_sub : substring match
req.hdr([<name>[,<occ>]]) : string

                    hdr([<name>[,<occ>]])     : exact string match
                    hdr_beg([<name>[,<occ>]]) : prefix match
                    hdr_dir([<name>[,<occ>]]) : subdir match
                    hdr_dom([<name>[,<occ>]]) : domain match
                    hdr_end([<name>[,<occ>]]) : suffix match
                    hdr_len([<name>[,<occ>]]) : length match
                    hdr_reg([<name>[,<occ>]]) : regex match
                    hdr_sub([<name>[,<occ>]]) : substring match 

原文地址:http://blog.51cto.com/11010461/2139872

时间: 2024-10-02 06:18:16

HAProxy入门及常用配置模拟测试的相关文章

最全面 Nginx 入门教程 + 常用配置解析

转自 http://blog.csdn.net/shootyou/article/details/6093562 Nginx介绍和安装 一个简单的配置文件 模块介绍 常用场景配置 进阶内容 参考资料 == Nginx介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx以其高性能.稳定.功能丰富.配置简单及占用系统资源少而著称. Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx

配置文件入门 - WebConfig.config常用配置节点介绍

一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是web.config. 一个.config配置文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中.在发布Web应用程序时web.config文件并不编译进dll文件中.将来如果客户端发生了变化,仅仅需要使用记事本打开Web.config文本编辑相关的设置就可以重新正常使用,而无

MySQL常用配置和性能压力测试:MySQL系列之十五

一.MySQL常用配置 以下所有配置参数以32G内存的服务器为基 1.打开独立的表空间 innodb_file_per_table = 1 2.MySQL服务所允许的同时会话数的上限,默认为151,经常出现Too Many Connections的错误提示,则需要增大此值 max_connections = 8000 3.操作系统在监听队列中所能保持的连接数 back_log = 300 4.每个客户端连接最大的错误允许数量,当超过该次数,MYSQL服务器将禁止此主机的连接请求,直到MYSQL服

Mock 模拟测试简介及 Mockito 使用入门

Mock 是什么 mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 简单的看一张图 我们在测试类 A 时,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如 D.E.F 等,假如类 D.E.F 构造很耗时又或者调用很耗时的话是非常不便于测试的(比如是 DAO 类,每次访问数据库都很耗时).所以我们引入 Mock 对象. 如上图,我们将

springboot2.0入门(四)----mock模拟测试+单元测试

一.本节主要记录模拟测试.单元测试: 二.mock 测试 1.1什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.比如:对象B依赖于对象A,但是A代码还没写是一个空类空方法不能用,我们来mock一个假的A来完成测试. /** * @author Levi * @date 2019/10/4 21:09 */ //@Transactional @Slf4j @SpringBootTest public clas

使用 JMeter 完成常用的压力测试

原文地址: http://www.ibm.com/developerworks/cn/opensource/os-pressiontest/ 胡 键 ([email protected]), 西安交通大学硕士 本文介绍了 JMeter 相关的基本概念.并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web 服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确

使用 JMeter 完成常用的压力测试 [转]

讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的因素有很多,有些是因为算法不够高效:还有些可能受用户并发数的影响. 在众多类型的软件测试中,压力测试正是以软件响应速度为测试目标,尤其是针对在较短时间内大量并发用户的访问时,软件的抗压能力.本文以 JMeter 为例,介绍了如何使用它来完成常用的压力测试:Web 测试.数据库测试和 JMS 测试.

高负载均衡学习haproxy之安装与配置

http://www.52codes.net/article/3117.html 1.1.haproxy原理 haproxy提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理.haproxy运行在时下的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器

关于黑客,你了解多少?----黑客入门学习(常用术语+DOS操作)

关于黑客,你了解多少?----黑客入门学习(常用术语+DOS操作) ·1.1·前言 黑客一次是由英语"Hacker"英译出来的,是指专门研究.发现计算机和网络漏洞的计算机爱好者,他们伴随着计算机和网络的发展而产生成长.黑客对计算机有着狂热的兴趣和执着的追求,他们不断的研究计算机和网络知识,发现计算机和网络中存在的漏洞,喜欢挑战高难度的网络系统并从中找到漏洞,然后向管理员提出解决和修补漏洞的方法. 黑客的出现推动了计算机和网络的发展与完善.他们所做的不是恶意破坏,他们是一群纵横于网络的大