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

时间:2008-11-08 04:51:53

标签: c++ c linux networking memcached

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

我的主要目标是避免客户端和客户端之间传输速度的任何严重损失。应用程序,但在客户端和客户之间获得100%完整的通信服务。

环境:UBuntu 8.04

语言:c / c ++

在后台我想到使用一个完全在内存中运行的sqlite数据库或者一个20-25MB内存来自我的进程的memcache dameon。

更新:    具体来说,我试图跟踪memcache守护进程的密钥使用情况,在密钥上存储#ssets /获取成功/失败。这个想法是大多数键都有某种分隔字符[`| _-#]来创建一种命名空间。我们的想法是介入守护进程和客户端,通过配置的分隔符将密钥拆分并记录它们的统计信息。

4 个答案:

答案 0 :(得分:1)

你想要跟踪的是什么?如果您想要简单计算数据包或字节数或基本标头信息,那么iptables将为您记录:

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

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

请参阅http://www.netfilter.org了解非常全面的文档。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您没有提及一种方法:您可以修改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.

简而言之,代理可能更容易编码,但实现它可能是一种巨大的痛苦,它最好是完美的或它取消你的缓存。更改app或memcached对我来说似乎是最认真的方法。

BTW:你看过memcached的内置统计报告?我不认为它的粒度足以满足您的需求,但如果您还没有看到它,请在做实际工作之前先看一下:-D

答案 3 :(得分:0)

iptables提供 libipq ,一个用户空间数据包排队库。从联机帮助页:

  

Netfilter提供了一种机制   将数据包传递出栈   排队到用户空间,然后接收   这些数据包重新进入内核   判决指明要做什么   使用数据包(例如ACCEPT或   下降)。这些数据包也可能是   在用户空间之前修改   重新注入内核。

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

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