35

我正在尝试用 Elasticsearch 替换 Solr 设置。这是一个新的设置,还没有生产,所以我有很多空间来摆弄东西并让它们正常工作。

我有非常非常大量的数据。我正在索引一些实时数据并将其保存 7 天(通过使用 _ttl 字段)。我不在索引中存储任何数据(并禁用了 _source 字段)。我预计我的索引将稳定在200 亿行左右。我会将这些数据放入 2-3 个命名索引中。到目前为止,多达几十亿行的搜索性能是完全可以接受的,但索引性能是一个问题。

我对 ES 如何在内部使用分片感​​到有些困惑。我创建了两个 ES 节点,每个节点都有一个单独的数据目录,每个都有 8 个索引和 1 个副本。当我查看集群状态时,我只看到每个节点的一个分片和一个副本。每个节点不是保持多个索引在内部运行吗?(检查磁盘存储位置表明肯定只有一个 Lucene 索引存在)。-- 已解决,因为我的索引设置未从配置中正确获取。使用 API 创建索引并指定分片和副本的数量现在已经完全符合我的预期。

此外,我尝试运行同一个 ES 节点的多个副本(来自相同的配置),它识别出已经有一个副本正在运行并创建自己的工作区。这些新的节点实例似乎也只有一个磁盘索引。-- 现在每个节点实际上都在使用多个索引,具有多个索引的单个节点足以限制整个系统,所以这不是问题。

您何时启动额外的 Elasticsearch 节点,以获得最大的索引性能?我应该有很多节点,每个节点都运行 1 个索引 1 个副本,还是更少的节点运行大量索引?为了让单个节点做更多的工作,我的配置是否缺少一些东西?

另外:是否有任何指标可以知道仅 HTTP 节点何时过载?现在我只有一个节点专门用于 HTTP,但除了 CPU 使用率之外,我无法判断它是否正常。何时启动额外的 HTTP 节点并拆分索引软件以指向各个节点?

4

1 回答 1

85

让我们先澄清一下术语:

  • Node:一个正在运行的 Elasticsearch 实例(一个 java 进程)。通常每个节点都在自己的机器上运行。
  • 集群:一个或多个具有相同集群名称的节点。
  • 索引:或多或少像一个数据库。
  • 类型:或多或少像一个数据库表。
  • Shard:实际上是一个 lucene 索引。每个索引都由一个或多个分片组成。分片可以是主分片(或简称分片)或副本

创建索引时,您可以指定分片数和每个分片的副本数。默认值为 5 个主分片和每个分片 1 个副本。分片自动均匀分布在集群中。副本分片永远不会分配在相关主分片所在的同一台机器上。

您在集群状态中看到的内容很奇怪,我建议您使用get settings API检查您的索引设置。看起来您只配置了一个分片,但无论如何,如果您有多个索引,您应该会看到更多分片。如果您需要更多帮助,您可以发布从 elasticsearch 获得的输出。

您使用多少分片和副本实际上取决于您的数据、您访问它们的方式以及可用节点/服务器的数量。最好的做法是稍微过度分配分片,以便在您向集群中添加更多节点时重新分配它们,因为在创建索引后(目前)您无法更改分片的数量。否则,如果您愿意对数据进行完整的重新索引,则可以随时更改分片的数量。

每个额外的分片都会产生成本,因为每个分片实际上都是一个 Lucene 实例。每台机器可以拥有的最大分片数量实际上取决于可用的硬件和您的数据。很高兴知道每个分片有 100 个索引或一个索引有 100 个分片实际上是相同的,因为在这两种情况下您都会有 100 个 lucene 实例。

当然,在查询时,如果您想查询由 100 个分片组成的单个弹性搜索索引,elasticsearch 需要全部查询才能获得正确的结果(除非您为文档使用特定路由,然后只查询特定分片)。这将产生性能成本。

您可以使用Cluster Nodes Info API轻松检查集群和节点的状态,通过它您可以检查很多有用的信息,这些都是您了解节点是否运行顺畅所需的全部信息。更简单的是,有几个插件可以通过漂亮的用户界面(无论如何在内部使用 elasticsearch API)检查这些信息:paramedicbigdesk

于 2012-09-13T20:16:31.603 回答