amazon-web-services - 具有高读取和非常低数据的最佳 Elasticsearch 索引分片
问题描述
我正在关注Elasticsearch 索引的“选择分片数量”的 AWS 文档。
我的 ES 索引读取 TPS 将非常高(大约 1300 TPS,并且可以增加到 6500 TPS),但是将出现的数据量将非常少(小于 GB)。
- 为了配合高reads,我打算实现横向扩展(增加数据节点的数量)
- 由于数据非常少,根据上述文档,分片数量应为 1(最佳所需分片大小 ~ 10GB-50GB,我的数据小于 1GB)
问题:
- 据我了解,一个分片并不分布在数据节点上。(一个分片只能驻留在一个数据节点上)。这种理解正确吗?
- 从这里,
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 和低数据,索引的最佳主分片/副本数应该是多少?
我是不是该- 仍然有一个分片,但有多个副本(与主机数量成正比),或者
- 多个主分片本身(其大小以 MB 为单位)和一个副本(以节省内存)。(我没有看到我的集群中的节点出现严重故障,以至于我需要多个副本!)
解决方案
- 是的,你是对的。设置映射时,您可以设置分片(主)和副本(副本)的数量。副本分片基本上是主分片的克隆,它们具有弹性,但也有利于读取性能(它们可以提供读取操作)。但是它们可能会损害写入性能,因为弹性需要跨节点复制数据以使它们保持最新。根据节点的数量,您可以决定主分片和副本分片的数量,同时考虑弹性(如果节点出现故障会发生什么)
- 是的,如果您有一个零副本的分片,根据文档,它将是一个单线程。这不一定是坏事或好事。请记住,在一个请求的情况下,该请求由多个线程(包含部分数据的多个分片)提供服务,最终这些记录需要累积才能提供给客户端。这会损害性能。此外,即使你有副本,如果你只有一个主分片,那意味着你的索引的所有数据都在一个分片中(主分片或副本)。这意味着任何分片(因此任何线程)都可以处理不同的请求,但是每个请求将由一个线程处理(不需要发生累积,这对于 MB 的数据来说并不是一件坏事)
由于数据量很小,并且您需要非常高的吞吐量,因此我会选择拥有 1 个主节点和与节点数量一样多的副本 - 1(它将保存主节点)。现在节点的数量取决于。您必须进行测试,但您可以使用 3 个节点(这是一种常见的弹性/高性能首次设置)。所以总共有 1 个主副本和 2 个副本。检查该设置并尝试对其进行压力测试。
对于压力测试,您可以使用rally,这是 elasticsearch 在测试新版本时使用的框架。
推荐阅读
- javascript - 列表中的每个孩子都应该有一个唯一的“关键”道具:无法确定我的代码中的问题
- mongodb - MongoDB服务未读取配置文件
- subquery - Couchbase N1QL 查询与使用 USE KEYS 连接的子查询
- google-cloud-platform - 从单个 Google Compute Engine 中删除默认防火墙规则
- vbscript - 如何在 VBScript 变量中设置日文字符(UTF-8)
- google-apps-script - Google Sheets - Track and Log highest value of other (dynamic) cell
- javascript - 用Jquery将TD标签放入对象?
- tags - Storage System for NFC Cards
- python - 间隔比较不适用于 if 语句 - python
- firebase - How can I get my Firebase Data into React-Native Map Marker instead of a Flatlist