如何在影子网络中传输流量?

如何在影子网络中传输流量?

抱歉,这是一个新手问题...

我听说过 Netflix 和 Twitter 能够在两个独立的基础设施之间复制网络流量:一个是权威/可信的基础设施,返回给用户;另一个是“影子”或测试基础设施,它认为自己会返回给用户,但实际上并没有。重点是在实际负载和时间上测试辅助基础设施。

我很确定有一个词可以描述这种情况,但是“桥梁”似乎不合适,‘重播’也不合适。

有人能帮我了解这种技术的名称和/或可以使用什么工具来实现它吗?

我想我应该补充一点,我听说过有效“重放日志”的技术,但在实际速度/分布下实现这一点确实很困难。

而且,我们不会尝试验证输出的“正确性”,而只是确保我们在新的基础设施中不会看到错误/堆栈跟踪/等等。

答案1

我个人称之为“通过会话重放进行负载测试”。我不知道有任何简单的术语来概括这种测试技术。

我所见过的这种负载测试的基本策略是从生产系统中提取日志文件并在测试系统上重播它们。

您可以使用以下工具JMeter或者Apache Bench重放日志文件中的请求。如果您希望重放非常复杂的客户端/服务器交互(基于原始日志流的特定时间详细信息),以真正锻炼应用程序的内部结构(寻找竞争条件、与时间相关的错误等),那么您可能需要编写特定于应用程序的测试工具来大规模模拟客户端。

您无法简单地捕获大量原始网络流量并使用任何基于 TCP 或 IP 的协议“重放”它。TCP 序列号不会与原始捕获的流量匹配,而且它不会起作用。IP 层捕获将会出现问题,因为您的模拟客户端需要回答捕获的发送者的 IP 地址。您最好捕获更接近第 7 层的流量并使用它来重放会话,因为否则,您也需要编写 TCP 模拟器。(tshark例如,我可以想象使用类似的东西从 TCP 流中获取第 7 层数据和时间并重放它。)

简单地重放网络流量可以模拟负载,但不一定能捕获缺陷。如果您想要进行负载测试,您的模拟客户端将需要接收来自测试服务器的响应并解析它们以确保正确性任何测试应用程序是否正确响应。由于您的应用程序将生成动态响应数据,因此您的模拟客户端不太可能简单地将测试服务器的响应与生产服务器记录的响应进行比较。这是您将开始编写特定于您的应用程序及其输出的测试工具的地方。

答案2

您使用类似BrowserMob模拟许多人同时访问您的网站。这些服务不会重放记录的流量,因为那样的话,您将错过客户端的对话。例如,您的服务器将尝试向 Internet 上不期望接收它们的计算机发送数据包。但这些公司所做的是研究日志(通常在应用程序级别,而不是数据包级别),并使用该信息来确定人们点击了哪些页面、点击频率以及点击顺序。这些数据用于编写 BrowserMob 随后重复的脚本/宏。

另一位用户提到,ApacheBench 现在用得不多了。10 年前,当你只需要确定静态 HTML 文档或 JPEG 在高负载下能以多快的速度提供时,它更有用。这与一群人在 Web 浏览器上一遍又一遍地点击重新加载、重新加载、重新加载没什么不同。在测试具有更复杂工作流程的 Web 应用程序时,你需要一些更智能的东西。

答案3

我认为您无法在网络层执行此操作,尽管您可能可以获得专门用于硬件负载平衡器的内核来处理第二台服务器。基本上,网络流量(TCP)将需要对发送/接收的每个数据包进行确认。因此,如果用户向您的网络发送数据包,它将被复制到您的生产网络和影子网络。每个网络中的服务器都会回复,生产服务器的数据包将被转发回您的机器,您的机器会回复确认,然后它们会愉快地继续对话。但是,如果您丢弃影子服务器的数据包,它将看不到确认。因此,它将尝试重新发送它,同时降低所有网络活动的传输速度(这称为窗口化)。它将继续重试发送它,直到超时,会话被拆除。老实说,您甚至无法完成握手以建立连接。

最接近此目的的方法是将原始同步数据包转发到影子服务器,然后将这些盒子的默认网关设置为某个不存在的位置。然后,每当用户尝试建立连接时,他们都会在您的生产网络上获得一个真正的服务器,并且至少您会向影子网络发送一个 syn 数据包。该死,现在你让我想知道你如何才能做到这一点 :)

答案4

我可以问@阿德里安科在 Netflix 聚会上讨论此事。

答案是他们编写了自己的工具,该工具基本上是一个 ServletFilter(抱歉,是 Java 特定的术语),它可以重新创建当前请求并在目标服务器上执行异步的即发即弃调用。

其好处有:

  • 针对您的测试(“暗”)基础设施的“真实世界”流量模式
  • 无需录制然后重播

缺点:

  • 生产设备上必须有足够的线程/CPU 周期
  • 测试基础设施的延迟可能会影响生产环境

相关内容