haproxy小结(一)基础概念篇
HAProxy是法国人Willy Tarreau个人开发的一个开源软件,目标是应对客户端10000以上的同时连接,为后端应用服务器、数据库服务器提供高性能的负载均衡服务。HAproxy可以实现基于TCP(四层 例如:SSH,SMTP,MYSQL)和HTTP(七层 例如:web服务器)应用的代理软件,同时也可以作为负载均衡器使用,并且是开源完全免费的。HAproxy完全可以支持数以万计的并发链接,它的工作模式可以将其简单而安全地整合到当前的服务架构中,同时可以保护你的WEB服务器不暴露到网络上(设置成代理来实现的 通过VIP将后端的web服务器隐藏到内网中)。
一、HAProxy优点
1、免费开源,稳定性也非常好,其稳定性可以与硬件级别的F5 BIG-IP相媲美。
2、负载带宽非常大。根据官方文档可知,HAproxy可以跑满10Gbps的带宽,对于软件级负载均衡器来说,是相当惊人的。
3、支持链接拒绝。因为保护一个链接保持打开状态的开销是很低的,有时我们需要防止蠕虫攻击,也就是通过限制它们的连接打开来防止它们的危害,可以用于防止DDoS攻击,这也是其他负载均衡器所不具备的。
4、支持全透明代理(已具备硬件防火墙的典型特点)。可以用客户端IP地址或任何其他地址来链接后端服务器,这个特性仅在Linux 2.4/2.6 内核打了cttproxy补丁后才可以使用。
5、支持TCP层(四层)的负载均衡。HAproxy现在多用于线上的MySQL集群环境,常用它作为MySQL(读)负载均衡,不过在后端的MySQL Slaves数量超过10台时性能不如LVS,所以更推荐推荐LVS+Keepalived。一般情况下都是前端通过LVS做四层负载,HAProxy做后端web服务器的负载 这样性能会比单独用HAProxy性能高很多。
6、强大的监控服务。自带强大的监控服务器状态的页面,在生产环境中可结合Nagios来实现邮件或短信报警。
7、能支持多种的负载均衡算法,现在为止可以支持8种
8、支持虚拟主机。
---page from www.361way.com(运维之路,页面被扒,打个tag)
二、HAProxy是什么不是什么
1、HAProxy是什么
HAProxy 是:
TCP 代理:可从监听 socket 接受 TCP 连接,然后自己连接到 server,HAProxy 将这些 sockets attach 到一起,使通信流量可双向流动。
HTTP 反向代理(在 HTTP 专用术语中,称为 gateway):HAProxy 自身表现得就像一个 server,通过监听 socket 接受 HTTP 请求,然后与后端服务器建立连接,通过连接将请求转发给后端服务器。
SSL terminator / initiator / offloader: 客户端 -> HAProxy 的连接,以及 HAProxy -> server 端的连接都可以使用 SSL/TLS
TCP normalizer: 因为连接在本地操作系统处终结,client 和 server 端没有关联,所以不正常的 traffic 如 invalid packets, flag combinations, window advertisements, sequence numbers, incomplete connections(SYN floods) 不会传递给 server 端。这种机制可以保护脆弱的TCP stacks 免遭协议上的攻击,也使得我们不必修改 server 端的 TCP 协议栈设置就可以优化与 client 的连接参数。
HTTP normalizer: HAProxy 配置为 HTTP 模式时,只允许有效的完整的请求转发给后端。这样可以使得后端免遭 protocol-based 攻击。一些不规范的定义也被修改,以免在 server 端造成问题(eg: multiple-line headers,会被合并为一行)
HTTP 修正工具:HAProxy 可以 modify / fix / add / remove / rewrite URL 及任何 request or response header。
a content-based switch: 可基于内容进行转发。可基于请求中的任何元素转发请求或连接。因此可基于一个端口处理多种协议(http,https, ssh)
a server load balancer: 可对 TCP 连接 和 HTTP 请求进行负载均衡调度。工作于 TCP 模式时,可对整个连接进行负载均衡调度;工作于 HTTP 模式时,可对 HTTP 请求进行调度。
a traffic regulator: 可在不同的方面对流量进行限制,保护 server ,使其不超负荷,基于内容调整 traffic 优先级,甚至可以通过 marking packets 将这些信息传递给下层以及网络组件。
防御 DDos 攻击及 service abuse: HAProxy 可为每个 IP地址,URL,cookie 等维护大量的统计信息,并对其进行检测,当发生服务滥用的情况,采取一定的措施如:slow down the offenders, block them, send them to outdated contents, etc
是 network 的诊断的一个观察节点:根据精确记录细节丰富的日志,对网络诊断很有帮助
an HTTP compression offloader:可自行对响应进行压缩,而不是让 server 进行压缩,因此对于连接性能较差的 client,或使用高延迟移动网络的 client,可减少页面加载时间。
2、HAProxy不是什么
HAProxy 不是:
显式地 HTTP 代理,即不是浏览器用于访问 internet 的代理。Squid 可用于做这种事情。HAProxy 可安装在 Squid 的前端,提供负载均衡和高可用。
缓存代理:对于从服务器收到的内容,HAProxy 只能将其原样返回给 client,对 caching policy 不做任何干涉。对于这个任务, Varnish 是一个很好的选择。HAProxy 可安装在 Varnish 的前端提供 SSL offloading,以及可伸缩性(通过 smart load balancing)
a data scrubber: HAProxy 不能修改请求或响应的 body 部分
a web server: HAProxy 在启动时,它将自己隔离在一个 chroot 环境中,并抛弃了自己的特权,所以一旦启动之后,它不会进行任何对文件系统的访问。所以 HAProxy 不能以 web server 的方式工作。可作 web server 的是 Apache 或 Nginx,HAProxy 可安装在其前端提供提供负载均衡和高可用。
a packet-based load balancer:基于 packet 的负载均衡调度器。HAProxy 不会看见 IP packet 或 UDP datagram,不能进行 NAT 转换,或者 less DSR。这些是下层的工作,比如 LVS 就做得很好,LVS 对 HAProxy 是完美的补充。
三、HAProxy是如何工作的
HAProxy 由单线程的、事件驱动的、非阻塞的引擎, 以及一个非常快速的 I/O 层组合而成。拥有 “基于优先级” 的调度机制。
HAProxy 的设计理念是让数据尽可能快的移动。它在每一层设计了 bypass 机制,在不必要的时候,数据不会传递到上层,直接在下层进行传递。大部分的处理都在 kernel 中完成,HAProxy 尽最大努力帮助 kernel 尽快完成工作,包括给一些 hints,或是当某些操作可稍后合并完成时,避免某些操作。
当 HAProxy 工作在 TCP 或者 HTTP close mode 时,HAProxy 消耗的 CPU 负载是 15%,内核消耗的负载是 85%。
当 HAProxy 工作在 HTTP keep-alive mode 时,HAProxy 消耗的 CPU 负载是 30%,内核消耗的负载是 70%。
一个 HAProxy 进程可以运行许多 proxy 实例;一个进程可容纳 300000 万个实例而运行良好。因此一般不需要启动多个进程。
HAProxy 被用来做 SSL offloader 时,可使用多进程。
运行 HAProxy 只需要一个 haproxy 可执行程序和一份配置文件即可运行。要记录日志,强烈建议配置好 syslog daemon 及 rotation 机制。配置文件在启动前被解析,HAProxy 尝试绑定所有的 监听 sockets,如果有地方失败就不会启动。一旦成功启动,HAProxy 不会再失效,也就是说不会有 runtime failures,一旦启动,它会工作到被关闭为止。
HAProxy 一旦启动,会做三件事情:
- 处理客户端接入的连接
- 周期性检查 server 的状态(健康检查)
- 与其他 haproxy 交换信息
处理客户端接入的连接,是目前为止最为复杂的工作,因为配置有太多的可能性,但总的说来有 9 个步骤:
配置实体 frontend 拥有监听 socket,HAProxy 从它的监听 socket 处接受客户端连接
根据 frontend 配置的规则,对连接进行处理。可能会拒绝一些连接,修改一些 headers,或是拦截连接,执行内部的小程序,比如统计页面,或者 CLI
backend 是定义后端 servers,以及负载均衡规则的配置实体,frontend 完成上面的处理后将连接转发给 backend。
根据 backend 定义的规则,对连接进行处理
根据负载均衡规则对连接进行调度
根据 backend 定义的规则对 response data 进行处理
根据 frontend 定义的规则对 response data 进行处理
发起一个 log report,记录日志
在 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 模式,配置文件更有可读性。
from:http://www.361way.com/haproxy-basic/5267.html
haproxy小结(一)基础概念篇的更多相关文章
- DNA拷贝数变异CNV检测——基础概念篇
DNA拷贝数变异CNV检测——基础概念篇 一.CNV 简介 拷贝数异常(copy number variations, CNVs)是属于基因组结构变异(structural variation), ...
- lua学习之基础概念篇
基础概念 程序块 (chunk) 定义 lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块 一个程序块就是一连串语句或者命令 lua 中连续的语句不需要分隔符,但为了可读 ...
- (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇
本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...
- 函数响应式编程(FRP)—基础概念篇
原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...
- 【Kafka入门】Kafka入门第一篇:基础概念篇
Kafka简介 Kafka是一个消息系统服务框架,它以提交日志的形式存储消息,并且消息的存储是分布式的,为了提供并行性和容错保障,消息的存储是分区冗余形式存在的. Kafka的架构 Kafka中包含以 ...
- Win32多线程编程(1) — 基础概念篇
内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...
- (一)github之基础概念篇
1.github: 一项为开发者提供git仓库的托管服务, 开发者间共享代码的场所.github上公开的软件源代码全都由git进行管理. 2.git: 开发者将源代码存入名为git仓库的资料库中,而g ...
- http协议之基础概念篇(1)
内容概述: 该篇主要内容概述 a.http相关术语解析 b.http的基本原理与工作流程 c.相关工具的使用(Wireshark) 作用介绍 绝大多数的web开发,都是构建在http协议之上的. HT ...
- 函数响应式编程(FRP)从入门到”放弃”——基础概念篇
前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...
随机推荐
- AsyncTask源代码解析
快要毕业了.近期在阿里巴巴校园招聘面试,一面过了,感觉挺轻松,可能是运气好.面试官感觉比我腼腆一些.我俩从android绕到了spring mvc 到数据库悲观锁 到linux 然后又会到了andro ...
- OpenGL 与 GLSL 版本号
来自:https://github.com/mattdesl/lwjgl-basics/wiki/GLSL-Versions You can use the #version command as t ...
- 转:学习linux驱动经典书籍
Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本 ...
- idea刷新项目、清除项目缓存
点击File -> Invalidate caches ,点击之后在弹出框中点击确认,之后软件就自动重启了
- Django-缓存的配置
缓存的介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗 ...
- SSH实现在WIN7系统下访问虚拟机中的Linux系统
使用的是centos6.4进行练习的,安装的是vmware8虚拟机.以下是总结的一些步骤: 一.确保vmware使用NAT的连接方式,如做地址.端口映射 首先查看vmware的中网络连接的一些方式:E ...
- 使用Apache Commons Chain(转载)
原博客出处:http://phil-xzh.iteye.com/blog/321536 使用Commons Chain 作为程序开发人员,我们经常需要对一个实际上程序性的系统应用面向对象的方法.商业分 ...
- Java类加载器(死磕3)
[正文]Java类加载器( CLassLoader ) 死磕3: 揭秘 ClassLoader抽象基类 本小节目录 3.1. 类的加载分类:隐式加载和显示加载 3.2. 加载一个类的五步工作 3. ...
- 如何分析和提高大型项目(C/C++)的编译速度?(VS2015特有的:/LTCG:incremental选项)
常见的有几个:1. Precompile header2. 多线程编译3. 分布式编译4. 改code,减少依赖性 另外还有一个VS2015特有的:/LTCG:incremental选项.以前为了执行 ...
- Javascript学习之Function对象详解
JavaScript中的Function对象,就是我们常说的函数对象.在JS中,所有的函数也是以对象的形式存在的. 语法 充当Function对象的构造函数使用,用于结合new关键字构造一个新的Fun ...