首页 > 解决方案 > 具有高读取和非常低数据的最佳 Elasticsearch 索引分片

问题描述

我正在关注Elasticsearch 索引的“选择分片数量”的 AWS 文档。
我的 ES 索引读取 TPS 将非常高(大约 1300 TPS,并且可以增加到 6500 TPS),但是将出现的数据量将非常少(小于 GB)。

  1. 为了配合高reads,我打算实现横向扩展(增加数据节点的数量)
  2. 由于数据非常少,根据上述文档,分片数量应为 1(最佳所需分片大小 ~ 10GB-50GB,我的数据小于 1GB)

问题:

  1. 据我了解,一个分片并不分布在数据节点上。(一个分片只能驻留在一个数据节点上)。这种理解正确吗?
  2. 这里In Elasticsearch, each query is executed in a single thread per shard. Multiple shards can however be processed in parallel, as can multiple queries and aggregations against the same shard.。如果上面的理解是正确的,如果我只有一个分片,所有的请求将在一个数据节点上单线程。因此不能实现水平缩放。
    考虑到高 TPS 和低数据,索引的最佳主分片/副本数应该是多少?
    我是不是该
    1. 仍然有一个分片,但有多个副本(与主机数量成正比),或者
    2. 多个主分片本身(其大小以 MB 为单位)和一个副本(以节省内存)。(我没有看到我的集群中的节点出现严重故障,以至于我需要多个副本!)

标签: amazon-web-serviceselasticsearchaws-elasticsearch

解决方案


  1. 是的,你是对的。设置映射时,您可以设置分片(主)和副本(副本)的数量。副本分片基本上是主分片的克隆,它们具有弹性,但也有利于读取性能(它们可以提供读取操作)。但是它们可能会损害写入性能,因为弹性需要跨节点复制数据以使它们保持最新。根据节点的数量,您可以决定主分片和副本分片的数量,同时考虑弹性(如果节点出现故障会发生什么)
  2. 是的,如果您有一个零副本的分片,根据文档,它将是一个单线程。这不一定是坏事或好事。请记住,在一个请求的情况下,该请求由多个线程(包含部分数据的多个分片)提供服务,最终这些记录需要累积才能提供给客户端。这会损害性能。此外,即使你有副本,如果你只有一个主分片,那意味着你的索引的所有数据都在一个分片中(主分片或副本)。这意味着任何分片(因此任何线程)都可以处理不同的请求,但是每个请求将由一个线程处理(不需要发生累积,这对于 MB 的数据来说并不是一件坏事)

由于数据量很小,并且您需要非常高的吞吐量,因此我会选择拥有 1 个主节点和与节点数量一样多的副本 - 1(它将保存主节点)。现在节点的数量取决于。您必须进行测试,但您可以使用 3 个节点(这是一种常见的弹性/高性能首次设置)。所以总共有 1 个主副本和 2 个副本。检查该设置并尝试对其进行压力测试。

对于压力测试,您可以使用rally,这是 elasticsearch 在测试新版本时使用的框架。


推荐阅读