正在开发一个非常即发即弃类型的应用程序,一个网络绘图应用程序,它从互联网上收集成千上万的项目(通常是数百万倍(,并将它们存储在nosql集合中(目前使用MongoDB(。这些集合非常不稳定,这意味着它们的创建和丢弃速度非常快。数据访问也是非常随机的,所以理论上,我的应用程序可以在系统运行时创建一个集合,在系统运行期间也可以删除——此外,几个月前创建的集合将被随机访问以进行更新和读取。我说的是成千上万的藏品,每个藏品可能有数百万份文件。
长话短说,MongoDB的问题是它在这种情况下似乎表现不佳。他们的缓存和WiredTiger引擎的设计方式不足以很好地处理对集合的随机访问以及动态创建和删除集合。复制已经成为一场噩梦,而且写入操作往往会停滞,数据库基本上会得到令人难以置信的备份。不幸的是,MongoDB似乎无法将我的应用程序扩展到成千上万的用户。
那么,话虽如此,有人知道或可以推荐一个适合这种工作负载的数据库吗?我们利用地理索引和全文索引,所以这基本上是唯一的要求。我愿意学习和尝试任何东西,最好是图形数据库,但性能和生产准备是关键。
强烈推荐用于"fire-and-forget"用例Apache Cassandra或更好的ScyllaDB(据我所知,Cassandra使用类固醇在C++中从头重写以获得最佳性能(。你可以在谷歌上搜索性能比较,两者在写性能方面都很出色(读性能不太好,请注意我说的"不太好",不差也不差(。
Apache Cassandra是免费的商业用途,所以这是另一个绿灯。语法很像SQL(请不要,我说了很多像不是SQL(,所以它相对容易快速学习。此外,我们还成功地在GNU/Linux和MicrosoftWindows服务器集群上运行了它。
正如在Cassandra上交付的那样,ScyllaDB的语法几乎相同。
在我的案例中,我们已经运行Cassandra集群近3年了,并完全在Apache Cassandra上迁移了我们所有的工作流程和以前的项目。我只能表达对性能的良好印象,尽管一开始最困难的事情是理解内部工作的基本概念和Cassandra的思维方式"先查询后数据模型"。
我希望它能对你的研究有所帮助。
您没有说明现有MongoDB部署的具体问题——"数据库正在备份"不是一份可操作的问题报告。
您还没有提到分片,这可能是针对您在MongoDB上描述的工作负载类型提出的第一个建议。
我得到的印象是,您可能只有一个庞大的复制集,在这个复制集中,您对整个数据集进行大量读取和写入,同时执行DDL。我不知道哪些数据库是为这种类型的工作负载设计的,但我的第一反应是将数据集分成更小的部分。
MongoDB在一定程度上提供了一种对整个数据集极其丰富的查询语言,并支持事务和分析用例。我的印象是,许多非关系数据存储(包括我对Cassandra的印象,尽管它可以追溯到2010年左右,而且不是最新的(不支持这种用例。当然,它们可能会提供更好的性能,但功能集会大大减少。因此,作为一种替代方案,我会考虑例如分片,它将更多的精力从数据库转移到应用程序,但如果需要,您仍然可以保留MQL和ACID事务。
我不知道你做了多少调整——不是说你做得不够,但你在这里问的问题基本上是"我有一个10 TB的数据集,我需要一个快速的数据库"。考虑到这种详细程度,您可能会得到一个数据存储列表。