我正在开发mongo db中可扩展会话表(自定义身份验证)的架构设计。我知道Mongo DB的可扩展性是从设计继承而且还有要求。我的用户案例很简单,
我的问题是,如果系统保持删除过期的会话密钥,会话集合的大小(考虑我需要在令牌字段上进行分区的shard'ed情况)可能会增长到非常大并包含很多'缺口'过期的会话,如何优雅地处理这个问题(或任何更好的设计)?
提前致谢。
编辑:我的问题是存储级别。如果频繁删除和插入记录,mongodb如何管理磁盘空间?它应该是一种(自动)收缩机制。希望不会阻止对集合的读取。
答案 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驱动我们可以这样做
答案 2 :(得分:0)
有几种方法可以实现会话:
面对同样的问题,我使用解决方案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一个经常有插入的集合删除,它应该有助于在这方面的表现。