Elasticsearch、Cassandra和Elasticsearch with Cassandra的比较

138
我正在学习NoSQL,并正在寻找一些不同的选项来满足我的客户需求。在提出这个问题之前,我已经阅读了各种资源(作为一个对NoSQL知识了解较少的人)。
我需要以更快的速度存储和读取数据。 完全故障安全且易于扩展。 能够通过分析查找数据。
最终,我列出了以下的候选清单:Cassandra 和 Elasticsearch
我理解的是,Cassandra 是我完美的NoSQL存储解决方案,因为我可以使用索引编写和读取数据。它可能会在分析方面失败,如果我未正确设计数据模型或者没有从长期的角度考虑到这一点(这可能在不断变化的世界中相当困难)。
而 Elastic Search 在索引方面最好(由 Lucene 支持),并且可以通过输入任意文本来随机搜索数据。但是,即使我想要检索 from_date 到 to_date 的数据,它是否仍然有效呢?我认为是可以的。但真正的问题是,它是一个搜索引擎,还是像 Cassandra 一样完美的 NoSQL 数据存储?如果是,为什么我们还需要 Cassandra 呢?
如果这两个选项都处于不同的领域,请解释一下!我们该如何将它们结合起来以获得更有效的解决方案?

2
你应该考虑使用DSE Search = Cassandra + solr集成 = 最佳组合:一个可扩展的数据库,由Solr提供强大的搜索功能驱动。 - Bereng
1
@Bereng,我猜DSE是商业软件,而我们不打算使用商业软件。 - RaceBase
3
如果您是一家年净收入小于200万美元的初创企业,他们将允许您免费使用DSE(至少一两年)。 - Aaron
8个回答

177

我们的一个应用程序使用存储在Cassandra和ElasticSearch中的数据。 我们尽可能使用Cassandra来访问这些记录,并将数据复制到查询表中,以符合特定的应用程序请求。 对于比我们的查询表更自由的搜索,ElasticSearch可以很好地执行该功能。

我们曾经问过自己同样的问题…“为什么不直接从ElastsicSearch获取所有内容?”

答案是,ElasticSearch被设计成搜索引擎,而不是持久性数据存储。 有时ElasticSearch会丢失写入数据。 在ElasticSearch中进行模式更改很困难,需要删除并重新加载所有内容。 为此,我编写了任务,旨在使ElasticSearch与我们的Cassandra集群保持同步。 还有一个最近在Quora上关于这个主题的讨论, 提出了类似的观点。

说到这里,ElasticSearch作为一个搜索引擎表现得非常好。而Cassandra则作为可扩展的高性能数据存储器也表现不俗。但是查询数据和搜索数据是不同的。有时我们需要其中之一,而两者的组合对于我们的应用程序来说效果很好。它可能适用于您的应用程序,也可能不适用。
至于分析方面,我在使用Cassandra Spark连接器时取得了一些成功,以服务更复杂的OLAP查询。
编辑20200421:
我已经针对类似问题撰写了更新的答案: ElasticSearch vs. ElasticSearch+Cassandra

33
有人能否详细解释一下“查询”和“搜索”数据之间的区别? - Dror
29
例如,如果你知道你的数据的ID(们),你只需请求它(们)(Cassandra),如果你不知道你的数据的ID(们),那么你就要搜索它(们)(Elasticsearch)。 - arsenik
2
@Gladwell 这完全取决于你的数据大小和查询复杂度。理论上,Elastic可以胜任所有任务。然而,如果你需要支持多区域/数据中心,并且处理大型数据集(用于查询),我更倾向于信任Cassandra比Elastic更好地扩展。 - Aaron
1
@Aaron...支持大数据集的扩展是这两个引擎都擅长的。我们的组织将弹性搜索用作主要数据库、警报引擎、分析工具,现在xpack支持机器学习了;它还提供我们边缘物联网周围的业务统计数据。 - AnthonyJClink
1
这个问题需要重新审视,以适应 ES 7.5 版本。 - user1870400
显示剩余6条评论

33

Cassandra + Lucene 是一个很好的选择。针对这个问题有不同的方案,例如:


需要记住的一件事,在2.1版本中,你现在可以“插入”自定义索引器...所以例如你可以模仿Statio在C的分支中正在做的事情,但是在主线C上进行。我不知道有任何广泛的努力去做这个,但我打算像这样把Lucene索引放到C*中。更多信息请查看:https://issues.apache.org/jira/browse/CASSANDRA-8717 - Evan Volgas

8
在解决这个问题之后,我意识到像Cassandra这样的NoSQL数据库非常适合在可靠的写操作中保存数据模式,并且不想利用Elasticsearch提供的索引操作。如果您想保留一些索引数据,则Elasticsearch是不错的选择,如果您信任自己的方案并且只会进行更多的读取而不是写入,则可以使用它。
我的情况是数据分析。因此,我在elastic search中保留了很多我的Latices,因为后来我想要频繁地遍历数据以确定下一步该怎么做。如果我想在分析堆栈中的数据模式中进行大量更改,我将使用Cassandra。
此外,还有许多好看的表示工具,如Kibana,可以用于显示带有良好图形的数据。也许我有点懒,但它们非常好看,对我很有帮助。

4

使用Cassandra和ElasticSearch的组合可以提供最多的功能。它允许您查找键值表,同时还可以在索引中搜索数据。

这种组合为应用程序提供了很大的灵活性,非常理想。


4

Elassandra 是Cassandra和Elasticsearch的组合解决方案,它使用Elasticsearch来索引数据,Cassandra作为数据存储。关于性能我不太确定,但根据这篇文章,它的表现很好。
如果您的应用程序需要搜索功能,那么Elassandra是最好的开源选项。虽然DSE搜索也可用,但价格昂贵。


2
卡桑德拉在按ID检索数据方面表现出色。我不太了解二级索引的性能,但我怀疑它不会像 Elasticsearch 一样快。当涉及到全文搜索功能时,Elasticsearch 显然胜过其他(例如:文本分析,相关性评分等)。
卡桑德拉在更新性能方面也表现出色。Elasticsearch 支持更新,但是一个更新实际上是一个重建索引和软删除的原子操作。
如果需要额外的故障安全性,卡桑德拉拥有非常好的复制模型。Elasticsearch 也可以,我并不认为ES特别不可靠(它有时也存在问题,就像所有的软件一样)。
Elasticsearch 还支持聚合功能以进行实时分析。由于搜索速度非常快,因此对数据子集的分析也将非常快。
如果你的需求已经被一个工具很好地满足了(例如,这里看起来ES会表现良好),那么就只使用一个工具即可。如果你有来自两个世界的需求,则可以选择以下方式之一:
使用其中之一,并解决其缺点。例如,您可以通过使用更多的分片和硬件来处理 Elasticsearch 的许多更新。或者,同时使用两种方法并确保它们同步。

2
我们开发了一个应用程序,其中使用了Elasticsearch和Cassandra。类似的数据存储在Cassandra中,并索引到Elasticsearch中。
我们的应用程序UI具有搜索、聚合、数据导出等功能。后端微服务不断地获取大量数据(在Kafka主题上),并将其存储到Cassandra中。一旦数据存储在Cassandra中,服务将确保将数据索引到Elasticsearch中。
Cassandra充当Elasticsearch的“真相来源”。在需要重新索引ES索引的情况下,我们查询Cassandra并将数据重新索引到ES中。
这个解决方案对我们很有帮助,因为它非常容易扩展,并且搜索和聚合速度更快。

0
  • Elasticsearch是建立在Lucene索引之上的,如果您想要将索引存储在Elasticsearch中,与将索引存储在Cassandra本身中相比,它的检索性能更佳。
  • 如果您的需求与实时检索无关,则可以将Elasticsearch用作NoSQL数据库。有人认为ElasticSearch会丢失写入数据和模式更改很困难,但如果您的数据量不太大,您可以轻松地将Elasticsearch作为具有最佳索引的搜索引擎以及NoSQL数据库。有几种方法可以避免这种情况。我曾经在Elasticsearch中进行过模式更改,如果您的数据结构一致,那么它不会产生任何问题。
  • 作为ElasticSearch或SOlr的支持者,我已经在两个搜索引擎上工作过,并且我发现只要正确配置,两个搜索引擎都可以流畅地使用。
  • 唯一的缺点是,如果您的目标是实时结果,并且不能容忍响应延迟的毫秒级别,则最好寻求其他NoSQL数据库(如Cassandra或couchbase)的帮助。
  • Cassandra与Solr一起使用比Cassandra与ElasticSearch一起使用效果更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接