首先,我将尝试描述该问题。我们使用以下网络配置:
- 安装了 haproxy 的 machine1
- 带有应用程序的 machine2(在这种情况下,我们可以假设它只是 RabbitMq 服务)
- machine3 作为测试服务器(machine2 的副本)
所有流量都流向机器 1 的端口(例如 777)。Haproxy 将流量重定向到机器 2 的端口(例如 888)。机器 2 上的应用程序监听端口 888 并处理请求。我们还将机器 3 作为测试服务器,当我们准备下一个版本时,我们想用实际负载对其进行测试。
所以现在的问题是:是否可以将传入的网络流量从机器 1 的端口 777 复制到机器 2 的端口 888 并且(当我们需要时)复制到机器 3 的端口 888?
PS抱歉我的英语不好
答案1
如果您的流量使用 TCP 进行通信,则任何第 2 层流量复制都将不起作用。这是因为 TCP 握手是一个双向过程,其中客户端需要将响应数据包发送回客户端。
如果在更高级别上进行此类流量复制,则问题在于对客户端的响应。如果两台服务器接收相同的流量,并且都发送响应,应该发送哪个响应?
您应该能够在 HAProxy 中设置流量处理规则,该规则会在服务器之间划分流量。这样您就可以将真实流量发送到测试服务器。
但是,将生产用户发送到测试服务器并不是一个好主意。
唯一好的解决方案是使用专门设计的工具来设置适当的负载测试。使用这些工具,您可以设置负载测试的测试场景,并像真实客户端一样执行请求。
答案2
唯一与您所问的类似的东西是交换机上的端口镜像。这会分割流量,但您不能让两台服务器响应相同的数据包。端口镜像通常与只听设备一起使用,用于报告或跟踪。它无法为您提供负载测试。