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集群性能数十倍提升优化实践(上篇)