正在拦截到memcached的流量以进行统计/分析

Intercepting traffic to memcached for statistics/analysis

本文关键字:统计 分析 流量 memcached      更新时间:2023-10-16

我想建立一个统计监控平台来监控特定的服务,但我不确定如何进行。处理截获的数据不是我关心的问题,只是如何进行。一个想法是在客户端应用程序和服务之间设置一个代理,这样所有TCP流量都会首先到达我的代理,然后,代理将截获的消息委托给等待的线程/叉,以传递消息并接收结果。另一种是尝试嗅探客户端&服务

我的主要目标是避免客户端和服务器之间传输速度的任何严重损失;应用程序,但在客户端&服务

环境:UBuntu 8.04

语言:c/c++

在后台,我想使用一个完全在内存中运行的sqlite DB,或者一个20-25MB的memcache dameon来处理我的进程。

更新:特别是,我试图跟踪memcache守护进程的密钥使用情况,在密钥上存储sets/gets-success/defaults的数量。其想法是,大多数键都有某种分隔字符[`|_-#]来创建某种名称空间。这个想法是在守护进程和客户端之间介入,通过配置的分隔符将密钥分开,并记录它们的统计信息。

您到底想跟踪什么?如果你想要一个简单的数据包或字节计数,或者基本的头信息,那么iptables会为你记录:

iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS

如果您需要更详细的信息,请查看iptables ULOG目标,它将每个数据包发送到用户空间进行分析。

请参阅http://www.netfilter.org对于非常彻底的文档。

如果你想采用嗅探器的方式,使用tcpflow而不是tcpdump或libpcap可能会更容易。tcpflow将只输出TCP有效负载,因此您不需要自己重新组装数据流。如果你更喜欢使用库而不是将一堆程序粘在一起,你可能会对libnid感兴趣。

libnids和tcpflow也可用于其他Unix版本,并且不限制您仅使用Linux(与iptables相反)。

http://www.circlemud.org/~jelson/software/tcpflow/http://libnids.sourceforge.net/

您没有提到一种方法:您可以修改memcached或您的客户端来记录所需的统计信息。这可能是最简单、最干净的方法。

在代理和libpcap方法之间,有几个折衷方案:

- If you do the packet capture approach, you have to reassemble the TCP
  streams into something usable yourself. OTOH, if your monitor program
  gets bogged down, it'll just lose some packets, it won't break the cache.
  Same if it crashes. You also don't have to reconfigure anything; packet
  capture is transparent. 
- If you do the proxy approach, the kernel handles all the TCP work for
  you. You'll never lose requests. But if your monitor bogs down, it'll bog
  down the app. And if your monitor crashes, it'll break caching. You
  probably will have to reconfigure your app and/or memcached servers so
  that the connections go through the proxy.

简言之,代理可能更容易编码,但实现它可能是一件痛苦的事,它最好是完美的,否则会占用你的缓存。对我来说,更改应用程序或memcached似乎是最明智的方法

BTW:你看过memcached内置的统计报告吗?我认为它不够精细,无法满足您的需求,但如果您还没有看到它,请在进行实际工作之前先看一看:-D

iptables提供了libipq,一个用户空间数据包排队库。来自手册页:

Netfilter提供了一种机制将数据包从堆栈中传出排队到用户空间,然后接收这些数据包返回到内核有一个明确的判决与数据包(如ACCEPT或下降)。这些数据包也可能是之前在用户空间中修改重新注入内核。

通过设置定制的iptables规则,将数据包转发到libipq,除了指定它们的判决外,还可以进行数据包检查以进行统计分析。

另一个可行的选择是通过支持套接字过滤器的libpcap或PF_PACKET套接字手动嗅探数据包。