HAproxy 技术分享

简介

HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件


Features

1.免费
2.能够做到4层以上代理
3.高性能
4.高稳定性


使用案例

淘宝CDN(HTTP反向代理)


测试:

HTTP代理 ab -i -c 500 -n 100000

       | --- node 8910 URL = /
HAproxy| --- node 8911 URL = /
| --- node 8912 URL = /
| --- node 8913 /test/ (reqisetbe ^[^\ ]*\ /(test|uri)/ server_uri_route) #按照规则转发
####### haproxy :  (单独由haproxy进行均衡负载)

Concurrency Level:      500
Time taken for tests: 32.562 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 36606588 bytes
HTML transferred: 0 bytes
Requests per second: 3071.02 [#/sec] (mean)
Time per request: 162.812 [ms] (mean)
Time per request: 0.326 [ms] (mean, across all concurrent requests)
Transfer rate: 1097.85 [Kbytes/sec] received ####### nginx : (单独由nginx进行均衡负载) Concurrency Level: 500
Time taken for tests: 36.539 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 38600000 bytes
HTML transferred: 0 bytes
Requests per second: 2736.82 [#/sec] (mean)
Time per request: 182.694 [ms] (mean)
Time per request: 0.365 [ms] (mean, across all concurrent requests)
Transfer rate: 1031.65 [Kbytes/sec] received

对比Nginx

Name Nginx HAproxy
HTTP代理性能 9 10
TCP 代理性能 0 10
稳定性 10 10
转发规则 10 7
HTTP代理性能 9 10
平滑升级 10 8

原理 epoll 转发

验证 转发方式为如下
通过TCP代理请求 www.baidu.com

client                   HAProxy                     Backend
curl |----------------->|
accept(client)
recvfrom(client)
sendto(Backent)
|-------->|
dowith(HAProxy)
|<--------|
recvfrom(Backend)
sendto(Client)
|<-----------------|

strace 查看系统调用

    zhangbo3@vm-222:/etc/haproxy$ sudo strace -p 7876

    epoll_wait(0, {{EPOLLIN, {u32=5, u64=5}}}, 7, 1000) = 1
*** (事件循环,监听连接事件) accept(5, {
sa_family=AF_INET,
sin_port=htons(56479),
sin_addr=inet_addr("127.0.0.1")
}, [16]) = 1
*** (来自客户端[127.0.0.1]的请求, 端口56479[随机端口]) fcntl(1, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
*** (设置连接socket为非阻塞) setsockopt(1, SOL_TCP, TCP_NODELAY, [1], 4) = 0
*** (设置TCP连接为 NODELAY, 禁止Nagle算法) accept(5, 0x7fff8da2d7a0, [128]) = -1 EAGAIN
(Resource temporarily unavailable)
*** (再次去accept连接失败,因为accept被循环包裹,需要返回 EAGAIN才break) recvfrom(1, "GET HTTP://www.baidu.com HTTP/1."..., 8192) = 212
*** (收到来自客户端的请求 curl -x 127.0.0.1:1180 www.baidu.com) recvfrom(1, 0x2560ac4, 7980, 0, 0, 0) = -1 EAGAIN
(Resource temporarily unavailable)
*** (返回EAGAIN后break,表示收到完整的TCP数据, 开始处理请求数据) epoll_ctl(0, EPOLL_CTL_ADD, 1, {EPOLLIN, {u32=1, u64=1}}) = 0
*** (将来自客户端的socket加入epoll监听队列) socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 2
fcntl(2, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
setsockopt(2, SOL_TCP, TCP_NODELAY, [1], 4) = 0
connect(2, {
sa_family=AF_INET,
sin_port=htons(8912),
sin_addr=inet_addr("127.0.0.1")
}, 16) = -1 EINPROGRESS (Operation now in progress)
*** (创建到backend的socket连接,这里backend配置为8912)
*** (server server3 127.0.0.1:8912) sendto(2, "GET HTTP://www.baidu.com HTTP/1."...,
212, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 212
*** (发送数据到backend)
epoll_wait(0, {}, 7, 0) = 0
*** (继续进入epoll_wait,等待来自backend的数据返回) gettimeofday({1413020002, 322710}, NULL) = 0
recvfrom(2, 0x255c960, 16384, 0, 0, 0) = -1 EAGAIN
(Resource temporarily unavailable)
*** (Backend数据来了) epoll_ctl(0, EPOLL_CTL_ADD, 2, {EPOLLIN, {u32=2, u64=2}}) = 0
epoll_wait(0, {{EPOLLIN, {u32=2, u64=2}}}, 7, 1000) = 1
gettimeofday({1413020003, 308930}, NULL) = 0 recvfrom(2, "HTTP/1.1 200 OK\r\nDate: Sat, 11 O"...,16384) = 2896
*** (backend 返回 HTTP 200, 这是标准HTTP协议头) recvfrom(2, 0x255d4b0, 13488, 0, 0, 0) = -1 EAGAIN
(Resource temporarily unavailable) sendto(1, "HTTP/1.1 200 OK\r\nDate: Sat, 11 O"...) = 2896
*** (将backend返回的数据发送到front end) epoll_wait(0, {{EPOLLIN, {u32=2, u64=2}}}, 7, 1000) = 1
*** (继续进入epoll_wait)
gettimeofday({1413020003, 309695}, NULL) = 0
*** (客户端连接超时,关闭连接)
shutdown(2, 1 /* send */) = 0
close(2) = 0
shutdown(1, 1 /* send */) = 0
close(1) = 0

验证单进程模型 -> 查看线程数
cat /proc/7878/status

    Name:   haproxy
State: S (sleeping)
...
Threads: 1
SigQ: 0/15594
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
...

HAproxy 代理技术原理探究的更多相关文章

  1. [原]HAproxy 代理技术原理探究

    HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...

  2. 探究Hybrid-APP技术原理

    探究Hybrid-APP技术原理 author: @TiffanysBear 背景 随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种前端开发的主流技术方案.那什么是Hybrid A ...

  3. 你真的掌握 LVS、Nginx 及 HAProxy 的工作原理吗

    你真的掌握 LVS.Nginx 及 HAProxy 的工作原理吗 当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web ...

  4. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  5. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  6. 利用HAProxy代理SQL Server的AlwaysOn辅助副本

    利用HAProxy代理SQL Server的AlwaysOn辅助副本 公司最近数据库升级到SQL Server2014 ,并部署了alwayson高可用集群 机房内有三套程序需要读取数据库 第一套:主 ...

  7. <转>VPN技术原理

    原文地址:VPN技术原理 VPN,Virtual Private Network(虚拟专用 网络),被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过公用网络的安全.稳定的 ...

  8. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  9. Spring AOP 和 动态代理技术

    AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情 ...

随机推荐

  1. CodeForces 816C 思维

    On the way to school, Karen became fixated on the puzzle game on her phone! The game is played as fo ...

  2. 谈谈VMware虚拟机中的网络问题

    前言:用了好几年的虚拟机,多多少少都会遇到那么一些网络问题,在这里总结一下这么几年在虚拟机中遇到的一些网络问题(主要针对linux)...... 一.VMware相关基础知识 1.bridged(桥接 ...

  3. Anaconda+django写出第一个web app(五)

    今天开始学习网页风格和设计,就像python有Web框架一样,也有一些CSS框架.对于CSS框架,我们可以使用默认的样式,也可以在原基础上编辑修改.本教程使用的是materialize这个CSS框架[ ...

  4. Ubuntu 增加全新硬盘 分区及开机自动挂载

    安装新的硬盘后.可以安装Gparted, 或者从live cd启动,然后用Gparted工具对硬盘进行分区.然后进入系统,启动Disks, 找到对应硬盘, 选择Edit Mount Options, ...

  5. mogodb的安装与配置

    下载:https://www.mongodb.com/https://www.mongodb.com/ 安装:一直next,中间选择custom,选择自己的安装路径,最后安装成功. 配置:打开安装好的 ...

  6. java所搜引擎slor学习笔记(一)

    java搜索引擎有很多,比较熟悉的就是slor和lucene. luncene: 概念:全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置.当用户查 ...

  7. Servlet笔记6--Servlet程序改进

    第一步改进,GenericServlet: 我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写serv ...

  8. Python图片验证码降噪 — 8邻域降噪

    简介 图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是: 1.灰度处理&二值化 2.降噪 3.字符分割 4.标准化 5.识别 所谓降噪就是把不需 ...

  9. shell脚本实现分日志级别输出

    shell脚本如何优雅的记录日志信息,下面让我们一步一步,让shell脚本的日志也变得高端起来,实现如下功能 ①设定日志级别,实现可以输出不同级别的日志信息,方便调试 ②日志格式类似为:[日志级别] ...

  10. 【HASPDOG】hasp_update参数f和i区别

    [root@BICServer-TX shared]# ./hasp_update This is a simple demo program for the Sentinel Update and ...