热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Haproxy快速开始

目录一、HAproxy简介1.HAProxy是如何工作的二、主流软件负载均衡器对比2.1HAProxy主要优点总结三、haproxy性能官方说明四、haproxy监测参数1.hap

目录

    • 一、HAproxy简介
      • 1. HAProxy 是如何工作的
    • 二、主流软件负载均衡器对比
      • 2.1 HAProxy主要优点总结
    • 三、haproxy性能官方说明
    • 四、haproxy监测参数
      • 1. haproxy 监控每秒的请求数
    • 五、网上应用举例
    • 六、参考
      • 1. 官方参考


一、HAproxy简介

官网https://www.haproxy.org/
Haproxy(一)基础介绍
参考URL: https://blog.csdn.net/wangshuminjava/article/details/80539743
haproxy
参考URL: https://blog.51cto.com/chenshengsheng/2108961
认识 HAProxy
参考URL: https://www.jianshu.com/p/0820b45b4f75

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和 Tuenti[7]在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。

HAProxy 是什么:

  • TCP 代理:可从监听 socket 接受 TCP 连接,然后自己连接到 server,HAProxy 将这些 sockets attach 到一起,使通信流量可双向流动。

  • HTTP 反向代理(在 HTTP 专用术语中,称为 gateway):HAProxy 自身表现得就像一个 server,通过监听 socket 接受 HTTP 请求,然后与后端服务器建立连接,通过连接将请求转发给后端服务器。

官方介绍,主要从三个方面说明:

  1. 性能,性能很高,c处理细节上做了优化保证了性能。
  2. 可靠性,官方描述:自2002以来,经得住考验,因为是单进程软件,没有失败的权利:最小的错误会使程序崩溃,稳定版本中从来没有发生过。许多世界500强企业再用。文章结尾总结:A correctly tuned system must be able to run for years at full load without slowing down nor crashing。
  3. 安全, 过去13年没有入侵事件- -!

1. HAProxy 是如何工作的

运行 HAProxy 只需要一个 haproxy 可执行程序和一份配置文件即可运行。

HAProxy 一旦启动,会做三件事情:

处理客户端接入的连接
周期性检查 server 的状态(健康检查)
与其他 haproxy 交换信息

处理客户端接入的连接,是目前为止最为复杂的工作,因为配置有太多的可能性,但总的说来有 9 个步骤:

  1. 配置实体 frontend 拥有监听 socket,HAProxy 从它的监听 socket 处接受客户端连接
  2. 根据 frontend 配置的规则,对连接进行处理。可能会拒绝一些连接,修改一些 headers,或是拦截连接,执行内部的小程序,比如统计页面,或者 CLI
  3. backend 是定义后端 servers,以及负载均衡规则的配置实体,frontend 完成上面的处理后将连接转发给 backend。
  4. 根据 backend 定义的规则,对连接进行处理。
  5. 根据负载均衡规则对连接进行调度
  6. 根据 backend 定义的规则对 response data 进行处理
  7. 根据 frontend 定义的规则对 response data 进行处理
  8. 发起一个 log report,记录日志
  9. 在 HTTP 模式,回到第二步,等待新的请求,或者关闭连接。

frontend 和 backend 有时被认为是 half-proxy,因为他们对一个 end-to-end(端对端)的连接只关心一半:frontend 只关心 client,backend 只关心 server。

HAProxy 也支持 full proxy,通过对 frontend 和 backend 的准确联合来工作。

HAProxy 工作于 HTTP 模式时,配置被分裂为 frontend 和 backend 两个部分,因为任何 frontend 可能转发连接给 任何 backend。

HAProxy 工作于 TCP 模式时,实际上就是 full proxy 模式,配置中使用 frontend 和 backend 不能提供更多的好处,在 full proxy 模式,配置文件更有可读性。

二、主流软件负载均衡器对比

代理服务器哪家强:HAProxy、Varnish与Nginx横向比较
参考URL: https://www.sohu.com/a/129980458_505802

从软件角度,单一职责会让工作更清晰。当我们不需要一个完整的Web服务器功能时,可以选用HAProxy做为代理服务器职责,它的资源占用率是非常低的,速度也更快。

三大主流软件负载均衡器对比(LVS VS Nginx VS Haproxy)
参考URL: https://www.cnblogs.com/ahang/p/5799065.html

HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:”tcp”也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

现在常用的三大开源软件负载均衡器分别是Nginx、LVS、Haproxy。

2.1 HAProxy主要优点总结

一、免费开源,稳定性也是非常好,这个可通过我做的一些小项目可以看出来,单Haproxy也跑得不错,稳定性可以与LVS相媲美;
二、根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的;
三、HAProxy可以作为MySQL、邮件或其它的非web的负载均衡,我们常用于它作为MySQL(读)负载均衡;
四、自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警,这个也是我非常喜欢它的原因之一;
五、HAProxy支持虚拟主机。

1.支持原声SSL,同时支持客户端和服务器的SSL.
2.支持IPv6和UNIX套字节(sockets)
3.支持HTTP Keep-Alive
4.支持HTTP/1.1压缩,节省宽带
5.支持优化健康检测机制(SSL、scripted TCP、check agent…)
6.支持7层负载均衡。
7.可靠性和稳定性非常好。
8.并发连接40000-50000个,单位时间处理最大请求20000个,最大数据处理10Gbps.
9.支持8种负载均衡算法,同时支持session保持。
10.支持虚拟主机。
11.支持连接拒绝、全透明代理。
12.拥有服务器状态监控页面。
13.支持ACL

(1)免费开源,稳定性也是非常好。单haproxy也跑得不错,稳定性可以与硬件级的F5相媲美。
(2)根据官方文档,haproxy可以跑满10Gbps,这个数值作为软件级负载均衡器是相当惊人的。
(3)haproxy支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
(4)haproxy支持全透明代理(已具备硬件防火墙的典型特点):可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
(5)haproxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡。
(6)自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。
(7)HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。

三、haproxy性能官方说明

翻译自官网
Haproxy使用操作系统体系结构中常见的几种技术,以实现绝对最大的性能:

  • 单个进程、事件驱动的模型大大降低了上下文切换和内存使用的成本。
    a single-process, event-driven model considerably reduces the cost of context switch and the memory usage. Processing several hundreds of tasks in a millisecond is possible, and the memory usage is in the order of a few kilobytes per session while memory consumed in preforked or threaded servers is more in the order of megabytes per process.
    单个进程、事件驱动的模型大大降低了上下文切换和内存使用的成本。可以在一毫秒内处理几百个任务,并且内存使用量是以每会话几千字节的顺序排列的,而在预处理或线程服务器中消耗的内存更多是以每进程兆字节的顺序排列的。

  • o(1)复杂度的事件监听
    O(1) event checker on systems that allow it (Linux and FreeBSD) allowing instantaneous detection of any event on any connection among tens of thousands.
    o(1)系统上的事件检查程序,允许它(Linux和FreeBSD)在成千上万的连接上即时检测任何事件。

    总结:说白了就是事件回调机制

  • Delayed update 延迟更新事件
    Delayed updates to the event checker using a lazy event cache ensures that we never update an event unless absolutely required. This saves a lot of system calls.
    使用延迟事件缓存延迟对事件检查器的更新可确保除非绝对需要,否则永远不会更新事件。这样可以节省大量系统调用。
    总结: 就是事件缓存延迟,再需要的时候,我们再更新事件。

  • Single-buffering 单缓存
    Single-buffering without any data copy between reads and writes whenever possible. This saves a lot of CPU cycles and useful memory bandwidth. Often, the bottleneck will be the I/O busses between the CPU and the network interfaces. At 10-100 Gbps, the memory bandwidth can become a bottleneck too.
    尽可能在读写之间不复制任何数据。这节省了大量的CPU周期和有用的内存带宽。通常,瓶颈是CPU和网络接口之间的I/O总线。在10-100 Gbps时,内存带宽也可能成为瓶颈。

  • Zero-copy forwarding 零拷贝转发
    Zero-copy forwarding is possible using the splice() system call under Linux, and results in real zero-copy starting with Linux 3.5. This allows a small sub-3 Watt device such as a Seagate Dockstar to forward HTTP traffic at one gigabit/s.
    使用linux下的splice()系统调用可以进行零拷贝转发,并从linux 3.5开始产生真正的零拷贝。这允许一个小的低于3瓦的设备(如希捷Dockstar)以1千兆/秒的速度转发HTTP流量。

  • MRU内存分配
    MRU memory allocator using fixed size memory pools for immediate memory allocation favoring hot cache regions over cold cache ones. This dramatically reduces the time needed to create a new session.
    使用固定大小内存池进行即时内存分配的MRU内存分配器,支持热缓存区域而不是冷缓存区域。这大大减少了创建新会话所需的时间。

  • Work factoring 工作分解
    Work factoring, such as multiple accept() at once, and the ability to limit the number of accept() per iteration when running in multi-process mode, so that the load is evenly distributed among processes.
    工作分解,例如一次多个accept(),以及在多进程模式下运行时限制每次迭代的accept()数量的能力,以便在进程之间均匀分布负载。

  • CPU关联性
    CPU-affinity is supported when running in multi-process mode, or simply to adapt to the hardware and be the closest possible to the CPU core managing the NICs while not conflicting with it.
    在多进程模式下运行时,或者只是为了适应硬件,并且在不与之冲突的情况下尽可能接近管理NIC的CPU核心时,支持CPU关联性。

  • Tree-based storage 基于树存储
    Tree-based storage, making heavy use of the Elastic Binary tree I have been developping for several years. This is used to keep timers ordered, to keep the runqueue ordered, to manage round-robin and least-conn queues, to look up ACLs or keys in tables, with only an O(log(N)) cost.
    基于树的存储,充分利用了弹性二叉树我已经开发了几年。它用于保持计时器的有序性,保持runqueue的有序性,管理循环和最少的conn队列,在表中查找acl或键,只需要O(log(n))成本。

  • Optimized timer queue 优化的计时器队列
    Optimized timer queue : timers are not moved in the tree if they are postponed, because the likeliness that they are met is close to zero since they’re mostly used for timeout handling. This further optimizes the ebtree usage.
    优化的计时器队列:如果计时器被延迟,则不会在树中移动它们,因为它们被满足的可能性接近于零,因为它们主要用于超时处理。这进一步优化了ebtree的使用。

  • optimized HTTP header analysis
    optimized HTTP header analysis : headers are parsed an interpreted on the fly, and the parsing is optimized to avoid an re-reading of any previously read memory area. Checkpointing is used when an end of buffer is reached with an incomplete header, so that the parsing does not start again from the beginning when more data is read. Parsing an average HTTP request typically takes half a microsecond on a fast Xeon E5.
    优化的HTTP头分析:对头进行动态分析和解释,并对分析进行优化,以避免重新读取任何以前读取的内存区域。当到达缓冲区末尾时,报头不完整,将使用检查点,这样在读取更多数据时,解析就不会从头开始。解析一个平均的HTTP请求在一个快速的XeonE5上通常需要半微秒的时间。

  • careful reduction of the number of expensive system calls 小心减少昂贵的系统调用次数
    小心减少昂贵的系统调用次数。默认情况下,大多数工作是在用户空间中完成的,例如时间读取、缓冲区聚合、启用/禁用文件描述符。

  • 内容分析优化
    Content analysis is optimized to carry only pointers to original data and never copy unless the data needs to be transformed. This ensures that very small structures are carried over and that contents are never replicated when not absolutely necessary.
    内容分析被优化为只携带指向原始数据的指针,除非需要转换数据,否则永远不会复制。这确保了非常小的结构被转移,并且在不完全必要的情况下,内容永远不会被复制。

There are 3 important factors used to measure a load balancer’s performance :
衡量负载均衡器性能有三个重要因素:

  • 会话速率 The session rate
  • 会话并发性 The session concurrency
  • 数据转发率 The data forwarding rate
    具体解释看官网。

四、haproxy监测参数


1. haproxy 监控每秒的请求数

监控页面中的session rate就是指的每秒请求数。其中curr session rate是指当前的每秒请求数。

五、网上应用举例


  1. 我们是如何优化HAProxy以让其支持200万个并发SSL连接的?
    参考URL: https://cloud.tencent.com/developer/article/1031614

具体看上面URL文档。

文档中使用的命令:
查看多少个TCP/UDP等连接,共占多少内存

ss -s && free -g

  1. ss命令
    ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。

ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。

ss -t -a 【显示TCP连接】
-t: tcp
-a: all
-l: listening 【ss -l列出所有打开的网络连接端口】
-s: summary 【显示 Sockets 摘要】
-p: progress
-n: numeric 【不解析服务名称】
-r: resolve 【解析服务名称】
-m: memory 【显示内存情况】

查看进程使用的socket
ss –pl

  1. free命令
    free 命令是一个显示系统中空闲和已用内存大小的工具。free 命令的输出和 top 命令相似。大多数Linux发行版已经含有 free 命令。

不带选项运行会显示一个以KB为单位的默认输出。

free 同样提供给我们 b (B), -k (KB), -m (MB), -g (GB) and –tera (TB)这些单位。要显示我们想要的单位,只要选择一个并在 free 后面跟上。

六、参考

Haproxy基础知识 -运维小结
参考URalgs.com/kevingrags.com/kevingrace/p/6138150.html
[推荐]Haproxy原理(1)
参考URL: https://www.cnblogs.com/skyflask/p/6970151.html
一、四层和七层负载均衡的区别
二、HAProxy与LVS的异同
三、快速安装HAProxy集群软件
四、HAProxy基础配置文件详解
五、启动与测试Haproxy的负责均衡功能
六、HAProxy负载均衡器算法与使用技巧
七、通过HAProxy的ACL规则实现智能负载均衡
八、使用HAProxy的Web监控平台

1. 官方参考

官网https://www.haproxy.org/ 提供源码下载,有相关项目介绍,推荐
https://github.com/haproxy/haproxy/releases/ 在github 可以下载

这是haproxy的docker“官方镜像” https://github.com/docker-library/haproxy

源文档是txt格式,将haproxy文档转换为更通用的格式 https://cbonte.github.io/haproxy-dconv/
wiki: https://en.wikipedia.org/wiki/HAProxy


推荐阅读
  • 本文整理了Java中com.twitter.common.zookeeper.testing.ZooKeeperTestServer.createClient()方法的 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 大家好,我是李白。本文将分享一个从零开始的全栈项目,涵盖了设计、前端、后端和服务端的全面学习过程。通过这个项目,我希望能够帮助初学者更好地理解和掌握全栈开发的技术栈。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • Nginx不仅是一款轻量级的高性能Web服务器,还具备出色的负载均衡和反向代理功能。它支持复杂的正则匹配规则、动静内容分离以及灵活的URL重写功能,使得配置和管理更加便捷高效。此外,Nginx提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,以满足不同应用场景的需求。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 黄聪:MySQL主从复制配置,实现高效读写分离
    大型网站为应对高并发访问,不仅需要在前端实现分布式负载均衡,还需在数据业务和访问层采取有效措施。采用传统的数据结构已无法满足需求,通过配置MySQL主从复制,可实现高效的读写分离,显著提升系统性能和稳定性。 ... [详细]
  • 无法查找或打开 pdb 文件。_Crash Dump调试:Symbol Server/Source Server、PDB原理分析
    背景UE4引擎时不时要魔改编译。可能大一点的项目是难以避免的吧┓(∀)┏工程C会自动编译,有持续集成平台做统一的编译和分发。这样可以不用每个人都编译引擎和工程C了&# ... [详细]
  • ProgressReportNov7-Nov 15 ... [详细]
  • 公链进入爆发的节奏,搭一条公链真的很容易么?撰文:五火球教主还记得当 ... [详细]
author-avatar
文锋仔-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有