如何对影子网络进行流量处理?


12

抱歉,这是一个新问题。

我听说过Netflix和Twitter能够在两种不同的基础设施之间复制Web流量的故事:一种是权威/可信的基础设施,可以回馈给用户。另一个是“影子”或测试基础结构,认为它正在返回用户但没有返回。关键是要在实际负载和时间上测试辅助基础结构。

我敢肯定,有一个词可以形容这一点,但是“ bridge”似乎不是正确的选择,“ replay”也不是。

谁能帮助我解决这种技术的问题和/或可以使用哪些工具来实现这一目标?

我想我应该补充一点,就是我听说过有效地“重放日志”的技术,但是要以真实的速度/分配来获取它确实很困难。

而且,我们不试图验证输出的“正确性”,而只是确保我们在新的基础架构中看不到错误/ stacktraces / etc。


这样做的明显方法(使用带有镜像端口的交换机来复制入站流量)似乎在那些“影子”服务器尝试答复时会引起问题。现在,您已经使我对这种显而易见的方式产生了兴趣。
DerfK

@DerfK:如果您不打算编写代码来模拟远程客户端的TCP / IP堆栈,则重播简单的第2层或第3层捕获将是有问题的。除非要编写大量代码,否则捕获第7层将是更多的方法。
埃文·安德森

我认为在数据包级别实现它并不困难。请参考tcpcopy(github.com/wangbin579/tcpcopy

Answers:


7

我个人称其为“通过会话重播进行负载测试”。我不知道这种测试技术有什么简单的统称。

我见过用于这种负载测试的基本策略是从生产系统中获取日志文件,然后在测试系统上重播它们。

您可以使用JMeterApache Bench之类的工具来重放日志文件中的请求。如果您正在考虑重放非常复杂的客户端/服务器交互(基于原始日志流的特定时序详细信息),希望真正行使应用程序的内在功能(查找竞争条件,时序相关的错误等),则可能着眼于编写特定于应用程序的测试工具来大规模模拟客户。

您将无法简单地捕获原始网络流量的负载,并使用任何基于TCP或IP的协议对其进行“重放”。TCP序列号将不匹配原始捕获的流量,并且将无法正常工作。IP层捕获将成为问题,因为您的模拟客户端将需要回答捕获的发件人的IP地址。最好捕获靠近第7层的流量,并使用它来重播会话,因为否则,您也正在考虑编写TCP模拟器。(我可以想象使用某种方法tshark来破坏TCP数据流中的第7层数据和定时,然后重播这些数据。)

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


1

您使用的服务如BrowserMob可以模拟很多人同时访问您的网站。这些服务不会重播记录的流量,因为那样的话,您将丢失对话的客户端。例如,您的服务器将尝试将数据包发送到Internet上不希望接收的数据包。但是这些公司所做的是研究日志(通常在应用程序级别,而不是数据包级别),并使用该信息来找出人们正在单击的页面,频率以及顺序。此数据用于编写脚本/宏,然后由BrowserMob重复执行。

正如另一位用户所述,ApacheBench如今并没有真正使用过。十年前,当您只需要弄清楚静态HTML文档或JPEG在繁重的工作量下能够以多快的速度交付时,它会更有帮助。与一群人在其网络浏览器上单击“重新加载”,“重新加载”,“重新加载”并没有太大区别。在测试具有更复杂工作流程的Web应用程序时,您需要一些更聪明的东西。


1

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

您可能遇到的最接近的情况是将原始同步数据包转发到影子服务器,然后将这些框的默认网关设置为不存在的位置。然后,无论何时用户尝试建立连接,他们都会在您的产品网络上获得一台真实的服务器,至少您会向影子网络发送一个syn数据包。达恩,现在你让我想知道如何也可以使这项工作:)


1

我能够在Netflix见面会上询问@adrianco

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

好处是:

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

缺点:

  • 必须有线程/ CPU周期可用于生产箱
  • 测试基础架构上的延迟可能会备份并影响您的生产环境
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.