我们正在为我们的客户构建一个电子表格Web应用程序。他们可以上传任何csv(20 MB +),然后对数据执行操作(如下所列)。数据高度非结构化。
在过去的几个月里,我们尝试了几种架构:
最初,我们以2d数组格式存储整个网格,例如[{a:' b',x:' y'},{a:' e'}]在PostGreSQL的JSON数据类型中。但是,任何更新的单元格都需要将整个CSV存储在数据库中。这使得应用程序非常慢。
接下来,我们转移到了MongoDB。这提高了性能,但我们仍然遇到性能和可伸缩性问题。以下是我们的结构。
我们目前的数据库设计:
PostgreSql结构:
表 - 数据集
id,名称,描述等......
Mongo结构:
第1行
_id,column1:value1,column2:value2,_data_set_id = datasets.id
第2行
_id,column1:value1,column2:value2,_data_set_id = datasets.id
......等等
此外,我们在_data_set_id键上有一个mongo索引,以支持以下类型的更快查询。
( db.coll.find({_data_set_id: xyz}) )
我们还使用来自第三方供应商的托管mongo,负责分片,备份,正常运行时间等(我们没有开发人员)
对数据的操作有两种类型:
我们已经优化到mongo在行数少于10k的数据集中工作得相当好的程度。但是,除此之外,我们无法扩展。我们目前在Mongo有大约25GB的数据,在接下来的几周内我们将达到50GB。 我们当前的产品是原型,现在,我们正在重新考虑我们的数据库架构,以便更好地扩展。
我们数据库的最关键要求是:
所以,
P.S
我们确实意识到我们只能实现CAP中的2个,并且还经历了Cassandra vs Mongodb vs Couchdb vs Redis
我们还在评估Couchdb(主 - 主复制,MVCC等但没有动态查询),Cassandra(querying on unstructured data is not possible)和HBase(ColumnStore)作为替代方案。
答案 0 :(得分:0)
我强烈怀疑您的数据库实际上没有分片。如果您支付分片费用,您可能无法获得好处。
然后您可以按索引进行分片,这样可以节省您的时间,因为数据最终会存储在一个或两个分片服务器上,然后这些服务器可以根据您的_data_set_id _更快地响应。
尝试输入:
sh.status()
这应该是您的数据库的分布情况。它可能只在一个碎片上。
在设置分片之前,请仔细阅读这些位。在不重建整个系列的情况下重做分片非常困难!