ElasticSearch或Couchbase或其他东西

时间:2014-07-22 22:23:33

标签: elasticsearch couchbase database nosql

背景: 我有一个庞大的数据流 - 每小时达到1000000条记录,ttl是3小时......每个"文件"包含大约20个属性,我需要使用" =="," IN"同时搜索多达15个属性。 " BETWEEN"比较。

由于大多数都没有不可搜索的属性,因此没有理由将文档存储两次(在Couchbase和ElasticSearch索引中),所以我认为将它存储在ElasticSearch中是一个好主意。我没错?

或许有人可以推荐我更好的数据库来完成这样的任务?我将来需要一个 easy 水平扩展(MySQL的自定义分片不是一个选项)...... 这个数据是某种缓存,所以最终的一致性和差的耐久性是可以的......

根据CAP定理,我主要需要A和P ......

2 个答案:

答案 0 :(得分:7)

关于性能,如果您使用适当大小的硬件,则不应该每小时索引1M文档。我已经远远超过了Elasticsearch而没有任何问题。这里有一个详细的文章,您可能会发现有关基准测试和调整大型Elasticsearch集群的大小有用:

ElasticSearch setup for a large cluster with heavy aggregations

对于TTL仅为3小时的短暂缓存系统,我同意将数据存储在多个存储库中是浪费。您可以将数据存储在Couchbase中并实时或接近实时地将其复制到Elasticsearch中,但为什么还要烦恼呢?不确定在两个地方获得数据会带来什么好处。

对于与您的特定用例有关的性能问题,我强烈建议您进行基准测试。我搜索多个非文本字段时,我发现Elasticsearch(以及Solr)的一个优势是他们(对我而言)出色的性能。您倾向于将ES视为文本搜索目的(它确实擅长),但它也是一个不错的通用数据库。我发现,与其他一些NoSQL解决方案相比,在搜索多个参数时,它具有很强的性能。

就此用例中的ES基准测试而言,我会查看许多不同的索引选项。 ES支持文档的TTL,因此很容易自动清除缓存:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-ttl-field.html

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-index_.html

但是你可能想要每小时都有不同的索引 - 关于ES的一件事(由于它在下面使用Lucene进行索引和文件存储)是删除工作的方式与大多数数据库不同。文档被标记为已删除但未被删除,然后将定期合并下面的文件(称为段),此时将创建新段而不删除已删除的文档。对于单个索引中的大量删除大量用例,这可能会导致相当数量的磁盘活动。解决这个问题的方法是为每小时创建一个新索引,然后在其中的数据超过3个小时之后将索引全部删除。

您可能会发现以前关于Elasticsearch中TTL与时间序列索引的讨论很有用:Performance issues using Elasticsearch as a time window storage

最后,关于简单的水平扩展,Elasticsearch在这里非常好 - 您添加了一个具有正确集群名称的新节点,ES负责其余部分,自动将分片迁移到新节点。在您的用例中,您可能希望使用复制因子,因为更多节点上的更多副本是提高查询性能的简便方法。

答案 1 :(得分:1)

对于缓存(类缓存系统)的用例,我认为Elasticsearch将来只会给你带来问题。我假设您根本不需要索引,因为您没有查看类似搜索的功能。

我没有使用过Couchbase,但我听说过它很好。我听说过使用Couchbase进行更多过滤的用例和Elasticsearch用于更多搜索目的(以及Couchbase无法做到的事情)。

对于可伸缩性,据我所知,从非常高级别的角度来看,两者看起来相似。当群集中的节点出现故障时,两者都支持轻松分片和复制,并重新平衡分片和辅助副本升级到主分片。具体情况可能有所不同。

但是说实话,你必须自己尝试一下,然后像流量一样进行测试。我曾与Elasticsearch合作,我知道你不能总是说它是否是你的用例的正确选择,因为它在生产中对于应用程序的行为方式可能会因其在性能方面的行为而有所不同。

但我认为你走在正确的轨道上。