我担心这个问题,因为它不是一个纯粹的编程问题,因为我正在寻求一个(知情的)建议。
我有一个用JavaScript编写的分析前端,在浏览器中发生了大量的聚合和图表(dimple.js,甚至stats.js,...)
我想使用JSON或来自某些高性能数据结构服务器的分隔数据来提供此应用程序。除了加载之外没有写入。数据大小可能是1-5 GB,如果不是数百个并发读者,可能会有数十个,但仅限于高峰时段。此数据由Apache Hive收集并由Apache Hive提供。
现在我的问题是为此选择数据库/数据存储区服务器。 (我非常了解SQL / NoSQL的选择,所以我真的在寻求非常具体要求的建议)
此数据存储的要求和规格如下:
大多数情况下,如果不是所有的查询都是由网络,基于JS的前端发起的。
数据可以作为JSON或平板表格csv,psv,tsv。
此商店的总数据量将为1-5 GB,未来可能会增长,但不会即将发生(6-12个月)
此数据存储区中的数据将每天刷新/加载到此商店。可能永远不会在实时。
可以通过一些RESTful Web服务,Socket IO等访问数据。
访问速度越快越好。速度很重要。
必须有敏感数据保护的安全/身份验证方法。
它需要相当稳定,而不是需要修补的补丁。
自由开源许可证。
到目前为止,我最初的考试候选人是Postgres(针对大缓存进行了优化)和Mongo。只是因为我非常了解他们。 我也熟悉Redis,Couch。
我自己没有做基准测试,但我看过Postgres比Mongo更快的基准测试(同时提供JSON格式)。 Mongo对网络友好。
我正在考虑具有持久性的内存商店,例如Redis,Aerospike,Memcached。到目前为止,我最喜欢Redis 3.0。
所以,我在这里问你是否对生产质量数据库有任何建议,以满足我的需要。
欢迎任何民事和知情建议。
答案 0 :(得分:-1)
您的数据到底是什么样的?既然你说CSV像导出一样,我假设这是通常在关系数据库中找到的表格式结构化数据吗?
一些选项:
<强> 1。不要使用数据库
鉴于数据集较小,只需将其提供给内存。您可能花费几个小时来编写一个快速的应用程序,其中包含任何体面的Web框架,只需将数据加载到内存中(例如,从平面文件中),然后以您需要的任何格式和方式搜索并返回此数据。 / p>
<强> 2。使用嵌入式数据库
您还可以尝试像SQLite这样的嵌入式数据库,它可以提供内存性能,但具有可靠的SQL接口。由于它只是一个单文件数据库,您可以让另一个进程生成一个新的DB文件,然后在更新应用程序的数据时将其交换出来。
第3。使用完整的数据库系统
使用常规关系数据库。 mySQL,PostgreSQL,SQL Server(Express Edition)都是免费的,可以轻松处理该数据集,并将其全部缓存在RAM中。如果它是读取查询,我就不会看到几百个并发用户的任何问题。如果需要更高的性能,还可以使用memSQL社区版。它们都支持安全性,非常可靠,并且您无法通过SQL获取数据访问权。
如果您的数据不是关系或表格,则使用键/值系统,并且更适合作为简单的值或文档。但是请记住,KV商店在扫描或聚合方面并不是很好,并且没有加入。 Memcached只是一个分布式缓存,不能将它用于实际数据。 Redis和Aerospike都是很棒的键/值系统,Redis为您提供了许多不错的数据结构。 Mongo有利于数据的灵活性。对于类似高级搜索的查询,Elasticsearch是一个很好的选择。
如果你要去这些数据库系统,你仍然需要一个瘦的应用层来与数据库连接,然后以适当的格式为你的前端返回数据。
如果您想跳过该部分,请改用CouchDB或Riak。两者都是面向文档的,并且具有带有JSON响应的本机HTTP接口,因此您可以直接从前端使用它,尽管这可能会导致安全问题,因为任何人都可以看到javascript调用。