1. 下载haproxy与安装
例如,我这里下载的是haproxy-1.3.15.10.tar.gz
解压后编译安装
tar xvf haproxy-1.3.15.10.tar.gz
cd haproxy-1.3.15.10
make TARGET=linux32 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
2. 编辑haproxy的配置文件,例如/usr/local/haproxy/etc/haproxy.cfg
###########全局配置######### global log 127.0.0.1 local0 debug daemon nbproc 1 pidfile /var/run/haproxy.pid ########默认配置############ defaults mode tcp #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置 option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 maxconn 4096 #默认的最大连接数 timeout connect 5000ms #连接超时 timeout client 30000ms #客户端超时 timeout server 10000ms #服务器超时 timeout check 2000ms #=心跳检测超时 log global ########test1配置################# listen test1 log global balance roundrobin bind 0.0.0.0:90 mode tcp option tcplog maxconn 4086 server s1 192.168.1.101:8081
3. haproxy的日志打印配置
(1)需要安装rsyslog
jme@jme:~$ sudo apt-get install rsyslog
(2)/etc/default/rsyslog里的配置调整为:
RSYSLOGD_OPTIONS="-c5 -r -x"
(3)/etc/rsyslog.conf中如小的配置项去掉注释生效
$ModLoad imudp
$UDPServerRun 514
/etc/rsyslog.conf的最后添加haproxy的日志配置(其中local0与haproxy的日志输出对应):
local0.* /var/log/haproxy.log
4. 启动haproxy
sudo /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
5. haproxy配置的超时配置的影响:
创建一个server:
import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8081); while (true) { Socket socket = server.accept(); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); int read = 0; while ((read = in.read()) != -1) { System.out.println("server: " + read); out.write(read); out.flush(); } } } }
创建一个client:
import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("127.0.0.1", 90); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); while (true) { out.write('a'); out.flush(); int read = in.read(); System.out.println("client: " + read); Thread.sleep(15000); } } }
情况1:haproxy在服务器超时后的表现,client端在haproxy的server端超时后继续发送数据:
server端的日志打印:
server: 97
server: 97
server: 97
server: 97
client的日志打印:
client: 97
client: -1
client: -1
client: -1
看haproxy的日志:
Jun 29 11:28:29 127.0.0.1 haproxy[18636]: 127.0.0.1:37775 [29/Jun/2014:11:26:50.563] test1 test1/s1 0/0/98858 1 sD 0/0/0/0/0 0/0
sD的含义:
The server did not send nor acknowledge any data for as long as the
"timeout server" setting during the data phase. This is often caused
by too short timeouts on L4 equipements before the server (firewalls,
load-balancers, ...), as well as keep-alive sessions maintained
between the client and the server expiring first on haproxy.
可以看到haproxy检测到server端超时后,client->haproxy->server的链接并没有全部断掉(可以理解为半关闭),只是server过期了,client端能发送数据到server,但是不能从server端接收数据。
情况2:haproxy在客户端超时后的表现,为方便测试,可以先调整haproxy的超时配置:
timeout client 10000ms #客户端超时
timeout server 0ms #服务器超时
server端日志:
server: 97
client端日志:
client: 97
之后就停住了,主要是haproxy已经关闭client这端,因此client数据发不出去了
对应的抓包数据:
sudo tcpdump -ntX 'port 90 or port 8081' -i lo
从client->haproxy的第一个‘a’字符
IP 127.0.0.1.38733 > 127.0.0.1.90: Flags [P.], seq 1:2, ack 1, win 342, options [nop,nop,TS val 3608278 ecr 3608278], length 1
0x0000: 4500 0035 32ab 4000 4006 0a16 7f00 0001 E..52.@.@.......
0x0010: 7f00 0001 974d 005a d797 3c80 b25a 50cc .....M.Z..<..ZP.
0x0020: 8018 0156 fe29 0000 0101 080a 0037 0ed6 ...V.).......7..
0x0030: 0037 0ed6 61 .7..a
从haproxy->server的第一个‘a’字符
IP 192.168.1.101.52738 > 192.168.1.101.8081: Flags [P.], seq 1:2, ack 1, win 342, options [nop,nop,TS val 3608278 ecr 3608278], length 1
0x0000: 4500 0035 85b0 4000 4006 30f8 c0a8 0165 E..5..@.@.0....e
0x0010: c0a8 0165 ce02 1f91 4bb4 8b79 ca7c 27a5 ...e....K..y.|'.
0x0020: 8018 0156 8442 0000 0101 080a 0037 0ed6 ...V.B.......7..
0x0030: 0037 0ed6 61 .7..a
server->haproxy的回写的‘a’字符:
IP 192.168.1.101.8081 > 192.168.1.101.52738: Flags [P.], seq 1:2, ack 2, win 342, options [nop,nop,TS val 3608278 ecr 3608278], length 1
0x0000: 4500 0035 2974 4000 4006 8d34 c0a8 0165 E..5)t@.@..4...e
0x0010: c0a8 0165 1f91 ce02 ca7c 27a5 4bb4 8b7a ...e.....|'.K..z
0x0020: 8018 0156 8442 0000 0101 080a 0037 0ed6 ...V.B.......7..
0x0030: 0037 0ed6 61 .7..a
haproxy->client的回写的‘a’字符:
IP 127.0.0.1.90 > 127.0.0.1.38733: Flags [P.], seq 1:2, ack 2, win 342, options [nop,nop,TS val 3608278 ecr 3608278], length 1
0x0000: 4500 0035 5e1b 4000 4006 dea5 7f00 0001 E..5^.@.@.......
0x0010: 7f00 0001 005a 974d b25a 50cc d797 3c81 .....Z.M.ZP...<.
0x0020: 8018 0156 fe29 0000 0101 080a 0037 0ed6 ...V.).......7..
0x0030: 0037 0ed6 61 .7..a
之后hapropxy检测到client超时,关闭后,client继续发送数据:
client->haproxy是成功的:
IP 127.0.0.1.38733 > 127.0.0.1.90: Flags [P.], seq 2:3, ack 2, win 342, options [nop,nop,TS val 3612028 ecr 3608278], length 1
0x0000: 4500 0035 32ad 4000 4006 0a14 7f00 0001 E..52.@.@.......
0x0010: 7f00 0001 974d 005a d797 3c81 b25a 50cd .....M.Z..<..ZP.
0x0020: 8018 0156 fe29 0000 0101 080a 0037 1d7c ...V.).......7.|
0x0030: 0037 0ed6 61 .7..a
但是由于haproxy不再向server发送数据。因此这种情况就丢包了。
haproxy的日志:
Jun 29 11:51:14 127.0.0.1 haproxy[20154]: 192.168.1.101:53597 [29/Jun/2014:11:49:03.266] test1 test1/s1 0/0/131359 1 cD 0/0/0/0/0 0/0
cD的含义:
The client did not send nor acknowledge any data for as long as the
"timeout client" delay. This is often caused by network failures on
the client side, or the client simply leaving the net uncleanly.
小结: 可见,用haproxy做tcp代理,client和server端的超时设置一定要正确,否则就可能出现读取数据错误,或者丢包的情况。
相关推荐
为了解决这个问题,项目提出采用QUIC协议,这是一种旨在提高网络传输效率和可靠性的协议,尤其适用于存在高延迟和网络丢包的环境。 **HTTP协议演进** HTTP协议从早期的0.9版本发展到现在的HTTP/3,经历了多次重大...
HTTP/2引入了二进制分帧和多路复用,而HTTP/3则进一步采用了QUIC协议,利用UDP来解决TCP的丢包问题,并提供了更快速的连接建立和更高效的拥塞控制。 在概要设计与开发环节,提出了两种实现方案:一是通过升级...
- 对于网络波动导致的问题,可以通过改善网络环境,如升级网络设备硬件,提高带宽等方式减少网络延迟和丢包率。 2. **调整操作系统参数**: - 根据提供的部分内容来看,可以通过调整注册表中的`MaxUserPort`和`...
Rocky Linux 8.10内核包
内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。
内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。
__UNI__DB9970A__20250328141034.apk.1
rust for minio
国网台区终端最新规范
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
一个简单的机器学习代码示例,使用的是经典的鸢尾花(Iris)数据集,通过 Scikit-learn 库实现了一个简单的分类模型。这个代码可以帮助你入门机器学习中的分类任务。
pyqt离线包,pyqt-tools离线包
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
SQL常用日期和时间函数整理及在sqlserver测试示例 主要包括 1.查询当前日期GETDATE 2.日期时间加减函数DATEADD 3 返回两个日期中指定的日期部分之间的差值DATEDIFF 4.日期格式转换CONVERT(VARCHAR(10),GETDATE(),120) 5.返回指定日期的年份数值 6.返回指定日期的月份数值 7.返回指定日期的天数数值
GSDML-V2.3-Turck-BL20_E_GW_EN-20160524-010300.xml
T_CPCIF 0225-2022 多聚甲醛.docx
《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
蚕豆脱壳机设计.zip
台区终端电科院送检文档
Y6一39一No23.6D离心通风机 CAD().zip