1、HAProxy概述mysql
1.haproxy简介web
HAProxy主要提供两个功能:http协议反向代理(不提供缓存功能)、基于tcp层的负载均衡(如https、mysql协议)。适用于须要会话保持或七层处理的且负载特别大的站点。可支持数以万计的并发链接。算法
代理做用:web缓存(加速)、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器;sql
HAProxy基于一种事件驱动(event-driven)、单一进程模型和ebtree弹性二叉树机制。后端
多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,不多能处理数千并发链接。事件驱动模型有更好的资源和时间管理的用户端(User-Space) 实现全部这些任务,因此并发响应能特别大。但在多核系统上此模型一般扩展性较差数组
2.性能优点缓存
HAProxy借助于OS上几种常见的技术来实现性能的最大化。服务器
单进程、事件驱动模型显著下降了上下文切换的开销及内存占用。session
O(1)事件检查器(eventchecker)容许其在高并发链接中对任何链接的任何事件实现即时探测。多线程
在任何可用的状况下,单缓冲(singlebuffering)机制能以不复制任何数据的方式完成读写操做,这会节约大量的CPU时钟周期及内存带宽;
借助于Linux 2.6 (>=2.6.27.19)上的splice()系统调用,HAProxy能够实现零复制转发(Zero-copy forwarding),在Linux3.5及以上的OS中还能够实现零复制启动(zero-starting);
内存分配器在固定大小的内存池中可实现即时内存分配,这可以显著减小建立一个会话的时长;
树型存储:侧重于使用做者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少链接队列;
优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程当中重读任何内存区域;
精心地下降了昂贵的系统调用,大部分工做都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
3.HAProxy目前主要版本
1.4版本——提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
客户端侧的长链接(client-side keep-alive)
TCP加速(TCP speedups)
响应池(response buffering)
RDP协议
基于源的粘性(source-based stickiness)
更好的统计数据接口(a much better stats interfaces)
更详细的健康状态检测机制(more verbose health checks)
基于流量的健康评估机制(traffic-based health)
支持HTTP认证
服务器管理命令行接口(server management from the CLI)
基于ACL的持久性(ACL-based persistence)
日志分析器
1.3版本——内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。
内容交换(content switching):基于任何请求标准挑选服务器池;
ACL:编写内容交换规则;
负载均衡算法(load-balancing algorithms):更多的算法支持;
内容探测(content inspection):阻止非受权协议;
透明代理(transparentproxy):在Linux系统上容许使用客户端IP直接连入服务器;
内核TCP拼接(kernel TCPsplicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;
分层设计(layereddesign):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;
快速、公平调度器(fast and fairscheduler):为某些任务指定优先级可实现理好的QoS;
会话速率限制(session rate limiting):适用于托管环境;
注意:
1)1.1、1.2、1.3的poll和epoll机制对性能影响
1.1l版本默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧降低。
1.2和1.3版本默认的为poll(),在有些操做系统上可会也会有性能方面的问题,但在Solaris上表现至关不错。
HAProxy1.3在Linux 2.6及打了epoll补丁的Linux2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。
2) 高性能选型方案
Linux 2.6.32及以后版本上运行HAProxy 1.4;
打了epoll补丁的Linux2.4上运行HAProxy 1.4;
FreeBSD上运行HAProxy1.4;
Solaris10上运行HAProxy 1.4;
3)splice()调用机制
在较新版本的Linux2.6(>=2.6.27.19)上,HAProxy还可以使用splice()系统调用在接口间无复制地转发任何数据,甚至能够达到10Gbps的性能。
4.HAProxy 安装配置详解
代理服务器程序包的安装 yum install haproxy -y
配置文件的所在位置 /etc/haproxy/haproxy.cfg
4-1配置文件的格式
"global"配置段,用于设定全局配置参数
该配置段中的参数为进程级别的参数,且一般与其运行的os相关
5 HAProxy代理相关的参数
5-1 balance
定义负载均衡算法,可用于“defaults"、"listen" 和"backend"配置段
可用算法以下
注意:
(1)当使用uri算法时,第一次请求一个URL分发到一个主机,则以后再次请求相同URL则使用一台主机响应。当第一次请求以后,若响应该请求的主机服务出现故障,则haproxy或将其调度到其余主机,此主机修复后再次调度回来
(2)URI:统一资源标识符;格式以下:
<SCHEME>://<USER>:<PASSWORD>@<HOST>:<PORT>/<PATH>;<PARAMS>?<QUERY>#<FRAG>
方案://用户:密码@主机:端口/路径;参数(键值数据、能够多个参数字段)?查询语句#片断显示
2.hash-type
格式:hash-type <method>
定义用于将hash码映射至后端服务器的方法;不能用于frontend区段;可用方法有map-based和consistent
说明:
(1) map-based:hash表是一个包含了全部在线服务器的静态数组。其hash值将会很是平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,所以,当一台服务器宕机或添加了一台新的服务器时,大多数链接将会被从新派发至一个与此前不一样的服务器上,对于缓存服务器的工做场景来讲,此方法不甚适用。
(2) consistent:hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,所以兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,所以,尤为适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,所以,可能须要不时的调整服务器的权重以得到更好的均衡性。
5-2
HAProxy 统计接口启用相关的参数;
stats enable
启用统计页;基于默认参数启用统计页;
stats url<prefix> 配置时候填写 stats uri / 改变访问地址
统计页的访问uri前缀,一般要加上?stats;
stats realm <realm>
设定认证时使用realm;
stats auth
认证的帐号和密码;可使用屡次;
stats refresh 3s
定义测试页面刷新时间
stats admin {if \unless} <cond> stats admin if ture
在指定的条件下启用admin功能
示例配置以下所示;
状态页面,要求认证而后登录
listen stats *:9001
stats enable
stats uri /haproxyadmin?stats 状态页面的配置
stats realm HAProxy\ Statistics 帐户密码的配置方法
stats auth admin:admin
stats admin if true