[原]HAproxy 代理技术原理探究
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 代理技术原理探究的更多相关文章
- HAproxy 代理技术原理探究
HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...
- 【原】Ajax技术原理
主要内容: Ajax原理 Ajax核心技术 Ajax是Asynchronous JavaScript and XML的简称,意思是异步的JavaScript和XML. 主要包括技术: web标准的XH ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
- [原] KVM 虚拟化原理探究(3)— CPU 虚拟化
KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...
- 探究Hybrid-APP技术原理
探究Hybrid-APP技术原理 author: @TiffanysBear 背景 随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种前端开发的主流技术方案.那什么是Hybrid A ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
随机推荐
- Tomcat shutdown执行后无法退出进程问题排查及解决
问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事.而且我内心总觉得这可能是tomcat像nginx一 ...
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...
- SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)
前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...
- 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新
微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...
- LINQ to SQL Where条件
1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...
- 关于SMARTFORMS文本编辑器出错
最近在做ISH的一个打印功能,SMARTFORM的需求本身很简单,但做起来则一波三折. 使用环境是这样的:Windows 7 64bit + SAP GUI 740 Patch 5 + MS Offi ...
- git添加GitHub远程库
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作 首先,登陆GitHub, ...
- mysql 行级锁的使用以及死锁的预防
一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...
- Java
2016-12-17 21:10:28 吉祥物:Duke(公爵) Logo:咖啡(爪哇岛盛产咖啡) An overview of the software development proce ...
- 你从未知道如此强大的ASP.NET MVC DefaultModelBinder
看到很多ASP.NET MVC项目还在从request.querystring或者formContext里面获取数据,这实在是非常落后的做法.也有的项目建了大量的自定义的modelbinder,以为很 ...