日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/8/24 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [原]HAproxy 代理技术原理探究 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HAproxy 技術(shù)分享

簡(jiǎn)介

HAProxy是一款提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件


Features

1.免費(fèi)
2.能夠做到4層以上代理
3.高性能
4.高穩(wěn)定性


使用案例

淘寶CDN(HTTP反向代理)


測(cè)試:

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) #按照規(guī)則轉(zhuǎn)發(fā) ####### haproxy : (單獨(dú)由haproxy進(jìn)行均衡負(fù)載)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 : (單獨(dú)由nginx進(jìn)行均衡負(fù)載)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

對(duì)比Nginx

NameNginxHAproxy
HTTP代理性能910
TCP 代理性能010
穩(wěn)定性1010
轉(zhuǎn)發(fā)規(guī)則107
HTTP代理性能910
平滑升級(jí)108

原理 epoll 轉(zhuǎn)發(fā)

驗(yàn)證 轉(zhuǎn)發(fā)方式為如下
通過(guò)TCP代理請(qǐng)求 www.baidu.com

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

strace 查看系統(tǒng)調(diào)用

zhangbo3@vm-222:/etc/haproxy$ sudo strace -p 7876epoll_wait(0, {{EPOLLIN, {u32=5, u64=5}}}, 7, 1000) = 1*** (事件循環(huán),監(jiān)聽(tīng)連接事件)accept(5, {sa_family=AF_INET, sin_port=htons(56479), sin_addr=inet_addr("127.0.0.1")}, [16]) = 1*** (來(lái)自客戶端[127.0.0.1]的請(qǐng)求, 端口56479[隨機(jī)端口])fcntl(1, F_SETFL, O_RDONLY|O_NONBLOCK) = 0*** (設(shè)置連接socket為非阻塞)setsockopt(1, SOL_TCP, TCP_NODELAY, [1], 4) = 0*** (設(shè)置TCP連接為 NODELAY, 禁止Nagle算法)accept(5, 0x7fff8da2d7a0, [128]) = -1 EAGAIN (Resource temporarily unavailable)*** (再次去accept連接失敗,因?yàn)閍ccept被循環(huán)包裹,需要返回 EAGAIN才break)recvfrom(1, "GET HTTP://www.baidu.com HTTP/1."..., 8192) = 212*** (收到來(lái)自客戶端的請(qǐng)求 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數(shù)據(jù), 開(kāi)始處理請(qǐng)求數(shù)據(jù))epoll_ctl(0, EPOLL_CTL_ADD, 1, {EPOLLIN, {u32=1, u64=1}}) = 0*** (將來(lái)自客戶端的socket加入epoll監(jiān)聽(tīng)隊(duì)列)socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 2fcntl(2, F_SETFL, O_RDONLY|O_NONBLOCK) = 0setsockopt(2, SOL_TCP, TCP_NODELAY, [1], 4) = 0connect(2, {sa_family=AF_INET, sin_port=htons(8912), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)*** (創(chuàng)建到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*** (發(fā)送數(shù)據(jù)到backend)epoll_wait(0, {}, 7, 0) = 0*** (繼續(xù)進(jìn)入epoll_wait,等待來(lái)自backend的數(shù)據(jù)返回)gettimeofday({1413020002, 322710}, NULL) = 0recvfrom(2, 0x255c960, 16384, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)*** (Backend數(shù)據(jù)來(lái)了)epoll_ctl(0, EPOLL_CTL_ADD, 2, {EPOLLIN, {u32=2, u64=2}}) = 0epoll_wait(0, {{EPOLLIN, {u32=2, u64=2}}}, 7, 1000) = 1gettimeofday({1413020003, 308930}, NULL) = 0recvfrom(2, "HTTP/1.1 200 OK\r\nDate: Sat, 11 O"...,16384) = 2896*** (backend 返回 HTTP 200, 這是標(biāo)準(zhǔn)HTTP協(xié)議頭)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返回的數(shù)據(jù)發(fā)送到front end)epoll_wait(0, {{EPOLLIN, {u32=2, u64=2}}}, 7, 1000) = 1*** (繼續(xù)進(jìn)入epoll_wait)gettimeofday({1413020003, 309695}, NULL) = 0*** (客戶端連接超時(shí),關(guān)閉連接)shutdown(2, 1 /* send */) = 0close(2) = 0shutdown(1, 1 /* send */) = 0close(1) = 0

驗(yàn)證單進(jìn)程模型 -> 查看線程數(shù)
cat /proc/7878/status

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

轉(zhuǎn)載于:https://www.cnblogs.com/Bozh/p/4019607.html

總結(jié)

以上是生活随笔為你收集整理的[原]HAproxy 代理技术原理探究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。