HaProxy学习 —300K的TCP Socket并发连接实现(翻译)

ops/2024/9/23 23:15:10/

HaProxy学习 —300K的TCP Socket并发连接实现(翻译)

  • 1 原文链接
  • 2 原文翻译
    • 2.1 调整Linux系统参数
    • 2.2 调整HAProxy

1 原文链接

Use HAProxy to load balance 300k concurrent tcp socket connections: Port Exhaustion, Keep-alive and others)(用HAProxy的负载均衡实现300K的TCP Socket并发连接:端口耗尽、保持连接等)

2 原文翻译

标题:用HAProxy的负载均衡实现300K的TCP Socket并发连接:端口耗尽、保持连接等。
发表时间: 2015年8月19日

最近我尝试建立一个推送系统。为了增加系统的可扩展性,最佳实践是使每个连接尽可能无状态。因此当瓶颈出现时,可以通过添加更多的机器来轻松扩展整个系统的容量。说到负载平衡和反向代理,Nginx可能是最著名和公认的一个。然而,TCP代理是一个相当新的事情。Nginx从v1.9引入了TCP负载平衡和反向代理,该版本于今年5月下旬发布,有很多缺失的功能。另一方面,HAProxy作为TCP加载平衡的先驱,已经相当成熟和稳定。我选择使用HAProxy来构建系统,最终我达到了300K的TCP Socket并发连接。如果不是我相当过时的客户端PC,我可以实现更高的数量。

2.1 调整Linux系统参数

300K的TCP Socket并发连接对于高性能服务器PC来说也不是一件容易的事情。首先,我们需要调整Linux内核配置,以充分利用我们的服务器。

  1. 文件描述符
    从Linux系统角度来看,Sockets等同于文件,因此默认的文件描述符限制对于我们的300k目标来说相当小。修改系统全局允许分配的最大文件句柄数:
sysctl -w fs.file-max=10000000
sysctl -w fs.nr_open=10000000

这些行将文件描述符总数增加到100万。接着修改 /etc/security/limits.conf ,添加持久化设置允许用户 / 进程打开文件句柄数:

*      soft   nofile      10000000
*      hard   nofile      10000000
root   soft   nofile      10000000
root   hard   nofile      10000000

非root用户,前两行应该可以完成工作。但是,如果是以root用户身份运行HAProxy,则需要明确声明root用户。

  1. TCP Socket 读写 Buffer 设置
    保持如此大量的连接会消耗大量内存。为了减少内存使用,修改 /etc/sysctl.conf 添加以下行。
net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

2.2 调整HAProxy

完成内核Linux调优后,我们需要调整HAProxy以更好地满足我们的需求。

  1. 增加最大连接数
    在HAProxy中,全局和具体后端都有一个“最大连接上限”。为了增加上限,我们需要在全局范围下添加一行配置。
maxconn 2000000

然后将相同的行添加到后端范围内,示例:

backend pushservermode tcpbalance roundrobinmaxconn 2000000
  1. 调整timeout
    调整连接超时时间,默认情况下,这些参数都的以毫秒为单位。
 timeout connect 5000timeout client 50000timeout server 50000
  1. 配置源IP来解决端口耗尽问题(调整可用知名端口范围)
    当同时有30k连接时,会遇到“端口耗尽”的问题,它是由每个反向代理的连接都会占用一个本地IP的可用端口造成的,可用于传出连接的默认IP范围在30k~60k左右,换句话说,我们只有一个IP的30k端口可用,显然不够,可以通过修改 /etc/sysctl.conf 增加下面这一行来增加这个范围。
    sysctl -w net.ipv4.ip_local_port_range='1024 65535'
    
    这不能解决根本问题,当达到60k上限时,我们仍然会用完端口。

这个端口耗尽问题的最终解决方案是增加可用IP的数量。首先,我们将一个新的IP绑定到一个新的虚拟网络接口。

ifconfig eth0:1 192.168.8.1

这个命令绑定一个Intranet地址到一个硬件接口为eth0的虚拟网络接口eth0:1上。该命令可以执行几次,来添加任意数量的虚拟网络接口。只需记住IP应该在真实应用服务器的同一个子网络中。换句话说,你不能用任何类型的NAT服务在HAProxy和应用服务器之间建立连接。因为它不起作用。

接下来,配置HAProxy来使用这些新的IP。有一个源命令可以在后端范围内使用,也可以作为服务器命令的参数。在我们的实验中,后端范围似乎不起作用,所以我们选择了参数一。这是具体配置。

backend mqttmode tcpbalance roundrobinmaxconn 2000000server app1 127.0.0.1:1883 source 192.168.8.1server app2 127.0.0.1:1883 source 192.168.8.2server app3 127.0.0.1:1883 source 192.168.8.3server app4 127.0.0.1:1884 source 192.168.8.4server app5 127.0.0.1:1884 source 192.168.8.5server app6 127.0.0.1:1884 source 192.168.8.6

这里有一个技巧,需要在多个条目中声明它们,并给它们不同的应用程序名称。如果你为所有四个条目设置相同的应用程序名称,HAProxy将无法工作。如果你可以查看HAProxy状态报告的输出,你会发现即使这些条目具有相同的后端地址,HAProxy仍然将它们视为不同的应用程序。

这就是配置!现在你的HAProxy应该能够处理超过300k并发TCP连接,就像我的一样。


http://www.ppmy.cn/ops/99710.html

相关文章

【AI大模型】解锁AI智能:从注意力机制到Transformer,再到BERT与GPT的较量

文章目录 前言一、揭秘注意力机制:AI的焦点如何塑造智能1.什么是注意力机制?2.为什么需要注意力机制? 二、变革先锋:Transformer的突破与影响力1.什么是Transformer?2.为什么Transformer如此重要? 三、路径…

Java 入门指南:Map 接口

Map 接口是 Java 集合框架中的一个接口,它表示了一种键值对的映射关系。Map 接口提供了一种以键为索引的数据结构,通过键可以快速查找对应的值。在 Map 中,每个键只能对应一个值,键是唯一的,但值可以重复。 常用的实现…

vs code中编写html的配置,插件安装

首先安装vs code 插件安装下面三个: 功能分别是: html css support :就是支持html环境,因为vs code就是一个文本编辑器 live server:自动更新编写的文件在浏览器刷新 auto rename tag:自动修改另一半标签…

DAY52-图论BFS

kama101.孤岛的总面积 /*** 在外循环遇到没有标记过的岛屿1* param args*/public static void main(String[] args) {Scanner scan new Scanner(System.in);int nscan.nextInt();int mscan.nextInt();int[][] isoland new int[n][m];boolean[][] path new boolean[n][m];fo…

linux常用命令(部分)

1. ls - 列出目录内容 基本用法:ls [选项] [目录]示例:ls -l # 显示详细列表 ls -a # 包括隐藏文件 ls /etc # 列出 /etc 目录的内容2. cd - 改变当前工作目录 基本用法:cd [目录]示例:cd /var/log # 进入 /var/log 目录 cd .. # 上一级目录 cd ~ # 回到用…

每天一个数据分析题(四百九十一)- 主成分分析与因子分析

因子载荷矩阵是主成分载荷矩阵()的结果 A. 最小方差斜交旋转 B. 最大方差斜交旋转 C. 最小方差正交旋转 D. 最大方差正交旋转 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖…

Ai+若依(系统接口--Swagger):04篇

Swagger,能够自动生成 API 的同步在线文档,并提供Web界面进行接口调用和测试。 可以直接去测试:--有的接口测试需要权限 我们可以去这样操作 F12 报错404 是因为多了个前缀 /dev-api 我们去后台删掉: 重启刷新:

大数据技术之Flume应用案例(2)

目录 监控端口数据官方案例 步骤 1: 准备环境 步骤 2: 配置 Flume Agent 步骤 3: 启动 Flume Agent 步骤 4: 发送数据到 Flume 步骤 5: 查看 HDFS 中的数据 注意事项 示例说明 实时监控单个追加文件案例 需求分析 实现步骤 (1)确保环境变量配…