1

我正在研究 mongo db 中可扩展会话表(自定义身份验证)的架构设计。我知道 Mongo DB 的可扩展性是从设计继承而来的,也有要求。我的用户案例很简单,

  1. 当用户登录时,会生成一个随机令牌并授予用户,然后使用令牌作为主键将记录插入会话表,这是可分片的。如果存在旧令牌记录将被删除。
  2. 使用令牌的用户访问服务

我的问题是,如果系统继续删除过期的会话密钥,会话集合的大小(考虑到我需要在令牌字段上分区的分片情况)可能会增长到非常大并且包括很多过期会话的“间隙”,如何优雅地处理这个问题(或任何更好的设计)?

提前致谢。

编辑:我的问题是关于存储级别。如果经常删除和插入记录,mongodb如何管理磁盘空间?它应该是一种(自动)收缩机制。希望不会阻止对集合的读取。

4

4 回答 4

0

我不得不建议你使用TTL您可以在http://docs.mongodb.org/manual/tutorial/expire-data/阅读更多关于它的信息,它非常适合您的工作。这仅从 2.2 版开始可用

mongo如何存储数据: http ://www.mongodb.org/display/DOCS/Excessive+Disk+Space

清理已删除记录的方法:

命令行: mongod --repair

请参阅:http ://docs.mongodb.org/manual/reference/mongod/#cmdoption-mongod--repair

蒙哥壳: db.repairDatabase()

请参阅:http ://docs.mongodb.org/manual/reference/method/db.repairDatabase/

所以你可以有一个自动清理脚本来执行修复,记住这会阻塞 mongo 一段时间。

于 2012-12-27T08:10:29.253 回答
0

我同意@Steven Farley,在创建索引时,您可以设置 ttl,在 python 中通过 pymongo 驱动程序我们可以这样做

http://api.mongodb.org/python/1.3/api/pymongo/collection.html#pymongo.collection.Collection.create_index

于 2012-12-27T08:17:55.693 回答
0

有几种方法可以实现会话:

  1. 如本用例所示,封顶集合。
  2. 通过将 expireAfterSeconds 添加到ensureIndex使带有 TTL 的数据过期
  3. 清理会话程序端使用 TTL 并删除.

面对同样的问题,我使用了解决方案 3,因为它提供了灵活性。

您可以在此答案中找到删除和磁盘优化的一个很好的概述。

于 2012-12-27T09:09:15.060 回答
0

TTL是好的,但修复不是。--repair不是为了在数据库上定期运行而设计的,实际上可能每 3 个月运行一次。它做了很多内部工作,如果经常运行,会严重损害您的服务器性能。

现在关于在这样的环境中重用磁盘空间;当您删除记录时,它将释放该“块”。如果另一个文档适合该“块”,它将重新使用该空间,否则它将实际创建一个新范围,这意味着一个新的“块”也就是更多空间。

所以如果你想在这里节省磁盘空间,你需要确保文档不超过彼此,幸运的是你有一个相对静态的模式可能:

{
    _id: {},
    token: {},
    user_id: {},
    device: {},
    user_agent: ""
}

这应该意味着文档有望重用它们的空间。

如果他们不这样做,现在你会遇到一个棘手的部分。MongoDB 不会自动归还每个集合的可用空间(但会针对每个数据库执行,因为这与删除文件相同),因此您必须--repair在数据库或compact()集合上运行才能真正取回空间。

话虽这么说,我相信您的文档将是相对大小的,所以我不确定您是否会在这里看到问题,但您也可以尝试:http ://www.mongodb.org/display/DOCS/Padding+Factor #PaddingFactor-usePowerOf2Sizes对于经常有插入和删除的集合,它应该有助于这方面的性能。

于 2012-12-27T09:09:56.510 回答