拦截到 memcached 的流量以进行统计/分析
Posted
技术标签:
【中文标题】拦截到 memcached 的流量以进行统计/分析【英文标题】:Intercepting traffic to memcached for statistics/analysis 【发布时间】:2008-11-08 04:51:52 【问题描述】:我想建立一个统计监控平台来监视特定的服务,但我不知道该怎么做。处理截获的数据不是我关心的,只是如何去做。一个想法是在客户端应用程序和服务之间设置一个代理,以便所有 TCP 流量首先到达我的代理,然后代理会将截获的消息委托给等待线程/fork 以传递消息并接收结果。另一个是尝试嗅探客户端和服务之间的流量。
我的主要目标是避免客户端和应用程序之间的传输速度出现任何严重损失,但要在客户端和服务之间实现 100% 完整的通信。
环境:UBuntu 8.04
语言:c/c++
在后台,我正在考虑使用完全在内存中运行的 sqlite DB 或从属于我的进程的 20-25MB 内存缓存守护进程。
更新: 具体来说,我正在尝试跟踪 memcache 守护程序的键的使用情况,将设置/获取成功/失败的数量存储在键上。这个想法是大多数键都有某种分隔字符 [`|_-#] 来创建一种命名空间。这个想法是在守护进程和客户端之间介入,通过配置的分隔符将键分开并记录它们的统计信息。
【问题讨论】:
【参考方案1】:您到底想跟踪什么?如果您想要一个简单的数据包或字节计数,或基本标头信息,那么iptables
将为您记录:
iptables -I INPUT -p tcp -d $HOST_IP --dport $HOST_PORT -j LOG $LOG_OPTIONS
如果您需要更详细的信息,请查看iptables ULOG
目标,它将每个数据包发送到用户空间进行分析。
请参阅http://www.netfilter.org 了解非常 详尽的文档。
【讨论】:
【参考方案2】:如果您想采用嗅探器方式,使用 tcpflow 而不是 tcpdump 或 libpcap 可能更容易。 tcpflow 将只输出 TCP 有效负载,因此您无需关心自己重新组装数据流。如果您更喜欢使用库而不是将一堆程序粘合在一起,那么您可能会对 libnids 感兴趣。
libnids 和 tcpflow 也可用于其他 Unix 风格,并且不限制您仅使用 Linux(与 iptables 相反)。
http://www.circlemud.org/~jelson/software/tcpflow/ http://libnids.sourceforge.net/
【讨论】:
【参考方案3】:您没有提到一种方法:您可以修改 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 对我来说似乎是最明智的方法。
顺便说一句:您看过 memcached 的内置统计报告吗?我认为它的粒度不足以满足您的需求,但是如果您还没有看到它,请在进行实际工作之前先看一下:-D
【讨论】:
我要解决的问题是要知道 wtf memcache 和应用程序正在执行“密钥是否即将过期,或者是否有更多集合然后获取” 设置与获取是内置统计数据可以回答的问题。【参考方案4】:iptables 提供 libipq,一个用户空间数据包队列库。从手册页:
Netfilter 提供了一种机制 将数据包从堆栈中传递出去 排队到用户空间,然后接收 这些数据包返回内核 有一个指定做什么的判决 与数据包(如 ACCEPT 或 降低)。这些数据包也可能是 之前在用户空间中修改 重新注入内核。
通过设置定制的 iptables 规则将数据包转发到 libipq,除了为它们指定判断之外,还可以进行数据包检查以进行统计分析。
另一个可行的选择是通过带有套接字过滤器支持的 libpcap 或 PF_PACKET 套接字手动嗅探数据包。
【讨论】:
以上是关于拦截到 memcached 的流量以进行统计/分析的主要内容,如果未能解决你的问题,请参考以下文章
Python网络编程7-对Telnet流量进行解码分析与拦截
在电商行业,采用flink进行热门实时流量统计,流量PV和UV分析市场营销分析恶意登录监控订单支付实时监控等场景的解决方案