简介
- HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持 http 的虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理 HAProxy 运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 Web 服务器不被暴露到网络上。
- HAProxy 实现了一种 ==事件驱动==、单一进程 模型此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个 CPU 时间片(Cycle)做更多的工作。
- HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型 DDoS 攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
- HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在 Linux 2.4/2.6 内核打了 cttproxy 补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
主要版本
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):阻止非授权协议;
- 透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;
- 内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;
- 分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;
- 快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;
- 会话速率限制(session rate limiting):适用于托管环境;
性能
可以从三个因素来评估负载均衡器的性能:
1、会话率
2、会话并发能力
3、数据率
HAProxy 借助于 OS 上几种常见的技术来实现性能的最大化。
1、单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
2、O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
3、在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
4、借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
5、MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
6、树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
7、优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
8、精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的 CPU 负载,甚至于在非常高的负载场景中, 5% 的用户空间占用率和 95% 的系统空间占用率也是非常普遍的现象,这意味着 HAProxy 进程消耗比系统空间消耗低 20 倍以上。因此,对 OS 进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其 CPU 占用率也仅为 10% ,这也解释了为何 7 层处理对性能影响有限这一现象。由此,在高端系统上 HAProxy 的 7 层性能可轻易超过硬件负载均衡设备。
在生产环境中,在 7 层处理上使用 HAProxy 作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用 TCP 缓冲,可建立极长的请求,且有着较大的响应时间。
安装配置 HAProxy
版本信息:
- 系统:CentOS Linux release 7.4.1708 (Core)
- 内核:4.14.8-1.el7.elrepo.x86_64 并启用了 BBR 算法
- Haproxy:haproxy-1.7.9
编译安装
1 | yum -y install openssl openssl-devel |
运行 haproxy
命令测试
1 | HA-Proxy version 1.7.9 2017/08/18 |
环境与配置
在编译后的源码包目录下的 examples
目录下有一些可供参考的 init
脚本、配置文件、vim
配置等。我们来创建主配置文件 /etc/haproxyhaproxy.cfg
。
1 | mkdir /etc/haproxy/ |
沿用旧版本的配置模板
1 | #--------------------------------------------------------------------- |
服务控制
CentOS 7 系统可以使用 systemd 的方式来管理服务,为了管理更灵活,我们选择使用控制脚本而不是 systemd,这里只是提供一个 systemd
范例。如果生产环境没有特殊要求则可以直接使用这种控制方式。
1 | [root@m1 ~]# cat /usr/lib/systemd/system/haproxy.service |
因为生产环境需要,需要监听私网地址并使用 iptables 做相应的地址转换,因此使用 init
形式的服务控制脚本,这个脚本基于官方的服务脚本做了二次修改。
1 |
|