1

背景

我们现在正在使用 Elasticsearch 设计一个新系统的架构,并且我们计划使用 Elastic Cloud,基于对比他们的服务与 AWS 的服务的评论,以及在 EC2 实例上的自托管。在我们设计系统时,我试图从我的团队 6 个月前部署在 Elastic Cloud 上的一个小型测试项目中学习。虽然我花了很多时间阅读Elasticsearch DocsElasticsearch: The Definitive GuideElastic Cloud's Docs,但这里有一些概念我仍然不明白。

我们的测试项目的问题

我们的测试项目使用默认的 5 个主分片和每个主分片 1 个副本分片。它是使用 Elastic Cloud 上的默认部署选项配置的,具有单个节点,当前具有 2GB 内存。因为只有一个节点,并且副本分片从未分配到与其主分片相同的节点(原因 2),所以没有一个副本被分配。此外,该项目使用基于时间的数据,并且每天为每个账户创建一个索引,从而每天产生大约 10 个索引(或 100 个分片),并且随着时间的推移,会产生众所周知的Kagillion Shards。这个系统本来只打算一次有几个月的数据,所以解决方案是在这个部署的内存用完时手动删除旧数据。

新系统

我们的新系统旨在拥有 5 年的基于时间的数据,预计其大小将增长到 250 GB。当前的实现对基于时间的数据使用单个索引,每个主分片有 6 个主分片和 1 个副本。这个决定是基于单个分片的最大目标是 30GB 的阅读而做出的。

问题

  1. 我们的旧系统有一个节点的索引太多(超过 100 个)和分片太多(超过 1000 个),而我们的新系统似乎设计的太少了(一个索引用于 5 年以上的数据)。根据基于时间的数据建议,似乎更好的索引策略是每周或每月创建一个索引?话虽如此,根据SO 上的另一个答案,每个节点的最佳索引数是 1,那么如果我们只在一个节点上运行,那么首先为基于时间的数据创建多个索引有什么用处?
  2. 如何将节点添加到 Elastic Cloud 中的 ES 部署?目前测试项目中的所有副本节点都未分配,因为部署只有一个节点。有一个滑块可让您轻松选择部署中每个节点的内存(介于 1GB 和 250B 之间),但是我认为无法添加多个节点,这令人困惑,因为它似乎是 Elasticsearch 的基本功能。
  3. 我们测试项目的节点已经重启了好几次,总是在节点上有很多旧数据的时候,因此内存压力很大。解决方案是删除旧数据(因为测试项目一次只需要几个月的数据),但似乎节点在重新启动时并没有丢失数据。为什么会这样?
  4. 我们的测试项目没有拍摄快照,这些快照应该每 30 分钟在 Elastic Cloud 上自动发生一次。我已经询问了他们对此的支持,但只是想知道是否有人知道可能导致此问题的原因以及如何解决?
4

1 回答 1

1

我们的测试项目使用默认的 5 个主分片和每个主分片 1 个副本分片。它是使用 Elastic Cloud 上的默认部署选项配置的,只有一个节点

显然,在单个节点上,您不能拥有副本。所以你的索引应该已经配置了 0 个副本,你可以动态地让你的集群回到绿色(PUT index/_settings {"index.number_of_replicas": 0}),就这么简单。

另外,这个项目使用基于时间的数据,并且每天每个账户创建一个索引,导致每天大约 10 个索引(或 100 个分片)

我无法判断每天 50 个新的主分片(10 个索引)是否合理,因为您没有提供有关测试项目中数据量的任何信息。但可能太多了。

  1. 根据基于时间的数据建议,似乎更好的索引策略是每周或每月创建一个索引?

在一个索引中拥有五年的数据是完全可能的,它并不真正取决于数据的年龄,而是取决于它的增长量。您提到 250GB 并且您知道分片不应增长超过 30GB(这又取决于您的硬件规格,稍后会详细介绍),但是由于该索引只有 6 个分片,这意味着每个分片分片将增长超过 40GB(根据this可以),但为了安全起见,您可能应该增加到 8-9 个分片,或者将数据拆分为年/月索引。

每个分片 30GB 的限制也取决于你的节点有多少堆。如果您有 2GB 堆的节点,那么拥有 30GB 分片显然太大了。由于您在 ES Cloud 上并且计划拥有 250GB 的数据,因此您必须选择 16GB 堆 + 384GB 存储(或更大)的节点容量。因此,对于 16GB 堆,拥有 30GB 分片是合理的,但我认为您需要多个节点。您可以验证您使用了多少个节点GET _cat/nodes?v

  1. 话虽如此,根据 SO 上的另一个答案,每个节点的最佳索引数是 1...

克里斯所说的是理论/理想环境,这在现实中几乎不可能/不建议/不希望这样做。您确实希望在索引中有多个分片,原因是当您的数据增长时,您希望能够扩展到多个节点,这就是 ES 的重点,否则最好嵌入 Lucene直接在您的项目中的库。

  1. ...,那么如果我们只在一个节点上运行,那么首先为基于时间的数据创建多个索引的实用程序是什么?

首先使用 来检查您的集群中有多少个节点GET _cat/nodes?v,但很明显,如果您被分配了一个节点来将 250GB 的数据拆分为 6-8 个分片,那么单个节点确实并不理想。

  1. 如何将节点添加到 Elastic Cloud 中的 ES 部署?

现在,你不能。但是,在上一次 Elastic{ON} 会议上,Elastic 宣布可以选择您想要设置的节点数量或部署类型(热/温等)。

  1. 目前测试项目中的所有副本节点都未分配,因为部署只有一个节点。

在测试项目中你真的不需要副本,对吧?

  1. 解决方案是删除旧数据(因为测试项目一次只需要几个月的数据),但似乎节点在重新启动时并没有丢失数据。为什么会这样?

你是怎么删除数据的?在您删除数据和节点重新启动之前,您是否见证了数据确实消失了?

  1. 我们的测试项目没有拍摄快照,这些快照应该每 30 分钟在 Elastic Cloud 上自动发生一次。

这很奇怪,因为在 ES 云上,您的集群通常每 30 分钟拍摄一次快照。您在 Deployments > cluster-id > Elasticsearch > Snapshots 下看到了什么?ES Cloud 支持对此有何评论?GET _cat/repositories?v跑步时你会得到什么GET _cat/snapshots/found-snapshots?v?(用结果更新您的问题)

于 2018-06-28T05:14:23.013 回答