mongodb中的会话表

时间:2012-12-27 07:48:53

标签: mongodb session

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

  1. 当用户登录时,生成随机令牌并授予用户,然后使用令牌作为主键将记录插入会话表,该主键是可分片的。如果存在,旧的令牌记录将被删除。
  2. 使用令牌的用户访问服务
  3. 我的问题是,如果系统保持删除过期的会话密钥,会话集合的大小(考虑我需要在令牌字段上进行分区的shard'ed情况)可能会增长到非常大并包含很多'缺口'过期的会话,如何优雅地处理这个问题(或任何更好的设计)?

    提前致谢。

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

4 个答案:

答案 0 :(得分: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

Mongo Shell: db.repairDatabase()

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

  1. use case中显示的上限集合。
  2. 通过将expireAfterSeconds添加到Expire data with a TTL
  3. ensureIndex到索引。
  4. 使用TTL和remove清洁会话计划方。
  5. 面对同样的问题,我使用解决方案3来提供灵活性。

    您可以在this answer中找到有关删除和磁盘优化的完整概述。

答案 3 :(得分:0)

TTL是好的,然而所有修复都没有。 --repair不是设计为在数据库上定期运行,实际上可能每3个月一次。它会执行许多内部操作,如果经常运行,会严重损害服务器性能。

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

因此,如果你想在这里节省磁盘空间,你需要确保文件不会相互超过,幸运的是你有一个相对静态的模式:

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

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

现在,如果他们不这样做,你会遇到一个棘手的问题。 MongoDB不会自动为每个集合提供可用空间(但是每个数据库都有,因为这与删除文件相同)因此您必须在数据库上运行--repair或者在集合上运行compact()才能实际获得你的空间回来了。

话虽如此,我相信你的文件会彼此相对大小,所以我不确定你是否会在这里看到问题,但你也可以尝试:http://www.mongodb.org/display/DOCS/Padding+Factor#PaddingFactor-usePowerOf2Sizes一个经常有插入的集合删除,它应该有助于在这方面的表现。