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. IDEA 2017 破解

    一.windows 1.进入hosts文件中:C:\Windows\System32\drivers\etc\hosts 2.将"0.0.0.0 account.jetbrains.com& ...

  2. HDU 2095 find your present (2) 动态链表

    解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...

  3. sql 存储过程导出指定数据到.txt文件(定时)

    需求:每天生成一份txt文件数据,供第三方通过http方式调用 方法: 1.新建存储过程: USE [LocojoyMicroMessage] GO /****** Object: StoredPro ...

  4. v4l2API无法执行VIDIOC_DQBUF的问题

    一.PC虚拟机下ubuntu14.04.1环境下 源文件:show.c  USB摄像头格式yuyv: 申请缓冲帧数2,分辨率640*480  阻塞无法执行 申请缓冲帧数4,分辨率640*480  阻塞 ...

  5. 大规模实时流处理平台架构-zz

    随着不同网络质量下接入终端设备种类的增多,服务端转码已经成为视频点播和直播产品中必备的能力之一.直播产品讲究时效性,希望在一定的时间内让所有终端看到不同尺寸甚至是不同质量的视频,因此对转码的实时性要求 ...

  6. FPGA quartus开发中常见的错误处理

    1.Warning: An incorrect timescale is selected for the Verilog Output (.VO) file of this PLL design. ...

  7. Linux 查看内存插槽数、最大容量的方法

    查看内存插槽数: dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range 查看最大容量: dmidecode ...

  8. pymongo的几个操作

    # -*- coding: utf-8 -*- # @Time : 2018/9/11 17:16 # @Author : cxa # @File : mongotest.py # @Software ...

  9. trace spring

    package xx.com.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotati ...

  10. OpenStack 监控解决方案

    正如你们看到的那样,到目前为止(OpenStack Kilo),OpenStack自己的监控组件Telemetry并不是完美, 获取的监控数据以及制作出来的图表有时候让人匪夷所思,因其重点并不是监控而 ...