【问题标题】:ElasticSearch vs. ElasticSearch+CassandraElasticSearch 与 ElasticSearch+Cassandra
【发布时间】:2020-07-28 03:41:05
【问题描述】:

我的主要问题是集成 Cassandra 和 Elasticsearch 与仅使用 Elasticsearch 相比有什么好处?

事实上,StackOverflow 上有类似问题的答案(例如,herehere)。但有几点:

  • 很多答案都是旧的。这些年来可能发生了很大变化。
  • 提到的一点是“有时 ElasticSearch 会丢失写入”。但是,可以想象那些所谓的损失可能是因为这些年来已经解决的一些错误。可以假设,例如,Cassandra 也可能存在一些导致数据丢失的错误。 Cassandra 和 Elasticsearch 之间是否存在任何导致 Elasticsearch 丢失数据但不会导致 Cassandra 丢失数据的根本差异?
  • 提到“在 ElasticSearch 中,如果不清除所有内容并重新加载,很难进行架构更改。”假设我们的数据模型相对稳定或至少向后兼容,这对我们来说可能不是主要问题。此外,由于 Elasticsearch 中的动态映射,它可能会根据新要求(例如额外字段)进行自我调整。
  • 关于 Elasticsearch 中的索引延迟,Cassandra 也没有提供一致性。因此,在 Cassandra 中,您可能还会面临读取写入数据的延迟。

总的来说,Cassandra 与 Elasticsearch 结合使用时提供了哪些额外功能?

附:如果问题得到一般性的回答可能会更好。但是,如果有必要,假设我们只将行追加到数据库中,从不删除或更新任何内容。我们希望能够在数据中进行全文搜索。

【问题讨论】:

    标签: elasticsearch cassandra nosql


    【解决方案1】:

    因此,作为链接答案之一 (Elasticsearch vs Cassandra vs Elasticsearch with Cassandra) 的作者,我想我应该在这里权衡一下。

    那些所谓的损失可能是由于这些年来已经解决的一些错误。

    这是一个绝对正确的陈述。我写的答案已经有将近六年的历史了,而 ElasticSearch 在那个时候已经发展成为一个更加更可靠的产品。话虽如此,Cassandra 可以做一些 ElasticSearch 无法做到的事情(反之亦然)。

    Cassandra 提供了哪些额外功能...

    我能想到几个,在这里总结一下:

    • 写入吞吐量/性能/延迟

    ElasticSearch 是一个基于 Lucene 项目的搜索引擎。以低延迟处理大量写入吞吐量并不是它的设计目的。至少不是“开箱即用”。有一些方法可以将 ElasticSearch 配置得更好,如下所述:Techniques to Achieve High Write Throughput With ElasticSearch。但就以最少的配置构建新集群而言,您将花费更少的时间来设计 Cassandra 来完成此任务。

    “有时 ElasticSearch 会丢失写入”

    是的,我写的。再次,ElasticSearch 得到了改进。很多。但我仍然看到这种情况发生在高写入吞吐量条件下。当集群被设计为具有特定水平的吞吐量,并且应用程序超过这些容差导致节点因写入背压而不堪重负时,写入将丢失。

    Cassandra 也不能幸免于这个问题。它只是对它有更高的容忍度。如果您同时使用它们,构建类似 Kafka 的架构来“限制”每个的写入吞吐量将是一个好方法。

    • 多数据中心高可用性 (MDHA)

    凭借定义逻辑数据中心和可用区(机架)的能力,Cassandra 一直擅长将数据集复制到多个区域。 这对 ElasticSearch 来说是个问题,因为它没有逻辑数据中心的概念,而且它的“主”节点不是活动/活动的。

    • 对等节点与基于角色的节点

    作为我的 MDHA 观点的后续,ElasticSearch 现在允许在集群中指定具有“角色”的节点。您可以指定多个节点充当“主”角色,负责添加和更新索引。任何节点都可以将搜索流量引导到在“数据”角色下工作的节点。事实上,提高写入吞吐量的一种方法(我的第一个话题)是指定一个或两个节点担任“摄取”角色,这可以防止读写流量相互干扰。

    这偏离了 Cassandra 的方法,即每个节点都是对等节点,并且可以处理读取和写入。能够对所有节点一视同仁,简化了维护和管理。而“不”,尽管普遍存在误解,“种子”节点 not 并没有什么特别的。

    • 查询与搜索

    对我来说,这是两者的根本区别。查询与搜索相同。它们可能看起来很相似,但它们却大不相同。

    通过匹配一个或多个列/属性上的模式来检索数据是搜索。同样通过搜索,结果的数量更多是事先未知的。当然,Cassandra 在过去几年中添加了一些功能,以允许基于 LIKE 查询的模式匹配(我不推荐使用它)。但是当需要“搜索”数据集的能力时,Cassandra 无法与 ElasticSearch 竞争。

    通过在特定键(列)上提供特定值来检索数据是查询。通过查询,也更容易对要返回的结果数量有准确的预期。如果我正在构建一个应用程序并且我知道我只曾经需要基于具有特定键的静态预定义查询来检索数据,那么我每次都会选择 Cassandra。 p>

    使用 Cassandra,我还可以调整查询一致性,需要来自更多或更少副本的操作确认。同样,我还可以根据应用程序的位置将这些操作定向到特定的地理区域。

    ...当与 Elasticsearch 结合使用时?

    他们很好地互相称赞。 Cassandra 擅长 ElasicSearch 不擅长的某些事情(上文详述)(反之亦然……说了很多)。应用程序的要求可能需要同时搜索查询。有时,您的应用需要高速键查找“哦,我们也需要搜索。”

    总结,tl;dr;

    因此,虽然我在这里写了很多,但我将继续讨论的重点是为工作选择合适的工具。当我需要搜索时,我会选择 ElasticSearch。当我需要在高可用性、地理感知的场景中查询时,我会选择 Cassandra。我仍然看到应用程序同时使用两者(串联),所以两者都有其优点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-17
      • 2016-09-02
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2011-09-15
      相关资源
      最近更新 更多