热门标签 | 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


推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
  • FIN7后门工具伪装成白帽工具进行传播
    fin7,后门,工具,伪装,成,白, ... [详细]
  • OAuth2.0指南
    引言OAuth2.0是一种应用之间彼此访问数据的开源授权协议。比如,一个游戏应用可以访问Facebook的用户数据,或者一个基于地理的应用可以访问Foursquare的用户数据等。 ... [详细]
  • 目录Atlas介绍Atlas部署Atlas基本管理Atlas结合MHA故障恢复读写分离建议Atlas介绍Atlas是由Qihoo360Web平台部基础架构团队开发维护的一个基于My ... [详细]
  • MybatisPlus入门系列(13) MybatisPlus之自定义ID生成器
    数据库ID生成策略在数据库表设计时,主键ID是必不可少的字段,如何优雅的设计数据库ID,适应当前业务场景,需要根据需求选取 ... [详细]
  • 原文:http:blog.linjunhalida.comblogpjaxgithub:https:github.comdefunktjquery-pjax ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
  • 分布式大型互联网企业架构!
    2019独角兽企业重金招聘Python工程师标准摘要:开发工具1.EclipseIDE:采用Maven项目管理,模块化。2.代码生成: ... [详细]
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社区 版权所有