工作在一个非常火和忘记类型的应用程序,一个网络爬网应用程序,收集成千上万的项目(往往是数百万倍)从互联网和存储在一个nosql收集(目前使用mongodb为这个)。这些集合非常不稳定,这意味着它们的创建和删除速度非常快。数据访问也是非常随机的,因此理论上,我的应用程序可以在系统运行时创建一个集合,在系统运行时也可以删除--而且,几个月前创建的集合将被随机访问以进行更新和读取。我说的是成千上万的藏品,每一个藏品可能有数百万份文档。
长话短说,mongodb的问题是,它在这种情况下的表现似乎很差。他们的缓存和wiredtiger引擎的设计方式不适合处理对集合的随机访问,也不适合动态地创建和删除集合。复制已经变成了一场噩梦,而且通常情况下,写操作会暂停,数据库基本上得到了难以置信的备份。不幸的是,将我的应用程序扩展到成千上万的用户似乎是mongodb的禁忌。
那么,有人知道或者可以推荐一个适合这种工作负载的数据库吗?我们利用地理索引和全文索引,所以这基本上是唯一的要求。我愿意学习和尝试任何东西,最好是图形数据库——但性能和生产准备是关键。
2条答案
按热度按时间92vpleto1#
您没有说明现有mongodb部署的具体问题-“数据库正在备份”不是可操作的问题报告。
您还没有提到分片,这可能是您在mongodb上描述的工作负载类型的第一个建议。
我得到的印象是,你可能有一个单一的副本集,这是巨大的,你正在做大量的读取和写入整个数据集,你正在做ddl的同时。我不知道哪些数据库是为这种工作负载设计的,但我的第一React是将数据集分成更小的部分。
mongodb在一定程度上提供了一种对整个数据集极其丰富的查询语言,并支持事务性和分析性用例。我的印象是,许多非关系型数据存储(包括我对cassandra的印象,尽管它可以追溯到2010年左右,并且不是最新的)都不支持这种类型的用例。当然,他们可以提供更好的性能,但在一个大大减少了功能集。因此,作为一种替代方法,我会考虑例如分片,它将更多的工作从数据库转移到应用程序,但是如果需要,仍然可以保留mql和acid事务。
我不知道您已经做了多少调整—不是假设您做得不够,但您在这里要问的问题基本上是“我有一个10 tb的数据集,我需要一个快速的数据库”。考虑到这种详细程度,您可能得到的最多的是一个数据存储列表。
new9mtju2#
强烈推荐用于“fire and forget”用例apache cassandra或更好的scylladb(据我所知,cassandra是用c++从头重写的,以获得最佳性能)。你可以做谷歌搜索的性能比较,两者都是优秀的情况下的写性能(不是那么好的读性能,请注意我说的“不是那么好”,不坏或最坏)。
apachecassandra是免费的商业用途,所以这是另一个绿灯。语法很像sql(请不要,我说了很多像不是sql),所以它相对容易学习快。此外,我们还成功地在gnu/linux和microsoftwindows服务器集群上运行了它。
正如在Cassandra身上交付的,锡拉的语法基本相同。
在我的例子中,我们已经运行cassandra集群将近3年了,并且只在apachecassandra上迁移了我们所有的工作流程和以前的项目。我只能表达关于性能的良好印象,尽管最困难的是在开始时理解内部工作的基本概念和cassandra的“先查询再数据模型”的思维方式。
我希望它能对你的研究有所帮助。