如何在 MongoDB 分片环境中记录所有查询?

Posted

技术标签:

【中文标题】如何在 MongoDB 分片环境中记录所有查询?【英文标题】:How can I log all queries in a MongoDB sharded environment? 【发布时间】:2017-06-14 13:23:36 【问题描述】:

为了符合新规定,我需要使用发起者的用户名记录发送到数据库的所有查询。 在非分片环境中,我只需使用命令 db.setProfilingLevel(2) 将分析级别设置为 2。我可以在集群的每个节点上执行相同的操作,但是我不知道如何访问 system.profile 集合。

有没有办法将 mongos 收到的所有查询直接记录在日志文件中?我看到企业版中提供了一些审核参数,有没有办法与社区版做类似的事情?

理想的日志应包含:

db/集合 经过身份验证的用户 时间戳 查询

【问题讨论】:

Quoting the documentation: 您不能在 mongos 实例上启用分析。要在分片集群中启​​用分析,您必须为集群中的每个 mongod 实例启用分析。。所以这样做并简单地访问每个节点的数据。没有什么能阻止你这样做。或者坐等jira.mongodb.org/browse/SERVER-1957 这真的应该在dba,stackexchange.com 上询问,这是关于数据库管理和配置的问题和答案。 *** 适用于:基于“编程”的问题,而这不是。请将您的帖子移至相应的网站,而不是在此处发布。 我无法将问题移至 dba.stackexchange.com,我没有足够的声誉。如果你愿意,你就可以做到。 这完全不真实。任何人都可以删除自己的帖子,任何人都可以在网站上发帖。事实上,您纯粹通过在另一个 stackexchange 站点上创建链接帐户来“获得”100 名声望。这应该是足够的理由单独做。 【参考方案1】:

您可以通过将threshold for 'slow' operations 设置为零来使分析函数记录每个查询:

db.setProfilingLevel(0, 0);

这不会启用完整的profiler,但会记录一些关于每个查询的数据,并将其写入服务器日志,如下所示:

2017-06-15T09:15:58.809+0000 I COMMAND [conn305112] query mydatabasename.mycollectionname planSummary: COLLSCAN ntoreturn:1000 ntoskip:0 nscanned:0 nscannedObjects:6 keyUpdates:0 writeConflicts:0 numYields:0 nreturned:6 reslen:4863 锁: Global: acquireCount: r: 2 , Database: acquireCount: r: 1 , Collection: acquireCount: r: 1 1ms

这并不能真正为您提供您所要求的信息,但如果您想要,那么我认为您必须为 MongoDB Enterprise 付费才能获得auditing functionality。

【讨论】:

我确实需要执行每个操作的用户都符合要求,我会检查企业版或percona版本。

以上是关于如何在 MongoDB 分片环境中记录所有查询?的主要内容,如果未能解决你的问题,请参考以下文章

[译文]还原MongoDB 分片集群到另一个环境

MongoDb分片集群认证

如何处理 MongoDB 主分片空间不足?

mongodb数据库都有哪些优势

MongoDB分片集群部署

MongoDB 记录所有查询