MongoDB 记录可疑流量

Posted

技术标签:

【中文标题】MongoDB 记录可疑流量【英文标题】:MongoDB Logging Suspicious Traffic 【发布时间】:2015-02-18 20:40:07 【问题描述】:

我想保留一组类似于以下架构的可疑流量:

"_id": ObjectId(###),
"count": NumberInt(6),
"ip": NumberInt(2147483647),
"requests": 
[ "uri": "/path/to/something/",
  "last": NumberInt(1419023477)
  "count": NumberInt(2) ],
[ "uri": "/path/to/something/else/",
  "last": NumberInt(1419023478)
  "count": NumberInt(4) ]

有人可以帮我做一个简单的 upsert 吗:

将请求 URI 添加到嵌入文档数组中 增加对该 URI 的请求数 设置该 URI 的最后请求日期 最后增加该 IP 的总体请求计数

有人让我发布我目前所拥有的:

$db->coll->update(array('ip' => $ip),
                array('$addToSet' => array('req' => array('$set' => array('last'  => $timestamp),
                                                          '$inc' => array('count' => 1)))),
                array('upsert' => true)
                );

如您所见,它尚未搜索具有匹配 uri ($uri) 的嵌入式文档

【问题讨论】:

您编写代码,我们帮助修复它。不是相反。 请编辑问题以添加您尝试过的实现。 您的文档结构无效。 requests 是一个对象数组吗? 我还没有权限对你的回答发表评论,wdberkeley。 URI 的数量是固定的(总共 24 个),所以我并不担心数组越界。但正如你所说,如果列表增加,这是一件值得考虑的事情。 IP 刚刚转换为整数(只是因为我更喜欢整数):php.net/manual/en/function.ip2long.php 【参考方案1】:

我会更改您的文档结构。天真地,一个 IP 将向不断增长的 URI 集合发出请求。在 MongoDB 中让数组无限增长并不是一个好主意,您会发现处理它们既慢又麻烦。我建议将每个文档都基于请求,而不是基于 IP,因此文档看起来像:


    "ip" : "192.168.1.1",
    "uri" : "/food/cookies/chocolatechip",
    "timestamp" : ISODate("2014-12-22T18:44:26.860Z")

我将last 作为日期时间输入,这几乎总是您应该更喜欢 MongoDB 中的日期时间。我将其重命名为时间戳,因为将其称为 last 不再有意义。另外,您为什么将ip 存储为数字?我不是 IP 地址规则方面的专家,但我认为这很危险,因为 192.168.1.1 与 19.216.81.1 不是同一个 IP 地址,但是当您删除 .'s 时,两者都会给出相同的数字。

现在,您只需插入一个新文档即可完成单个 upsert 的所有目标。您可以使用.count() 查找计数,使用.sort() 查找最近的请求,并且可以索引必要的查询,因此这些操作很快。

【讨论】:

以上是关于MongoDB 记录可疑流量的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB征文 | OPPO百万级高并发MongoDB集群性能数十倍提升优化实践

性能提升数十倍!百万级高并发MongoDB集群优化实践

高考填志愿的上亿流量高峰,看MongoDB如何应对

百万级高并发MongoDB集群性能数十倍提升优化实践(上篇)

百万级高并发mongodb集群性能数十倍提升优化实践(上篇)

百度起诉搜狗劫持 hao123 流量;MongoDB 收购数据库托管公司 mLab