Elasticsearch-通用架构和Elastic Cloud问题

时间:2018-06-25 14:11:50

标签: elasticsearch elastic-cloud

背景

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

我们的测试项目的问题

我们的测试项目默认使用5个主分片和每个主分片1个副本分片。它是使用Elastic Cloud上的默认部署选项配置的,具有单个节点,当前具有2GB内存。因为只有一个节点,而且副本碎片从未分配给它们的主碎片(reason 2),所以没有副本被分配。另外,该项目使用time-based data,并且每天为每个帐户创建一个索引,从而导致每天大约10个索引(或100个分片),随着时间的流逝,谚语Kagillion Shards逐渐增多。该系统以前一次只能存储几个月的数据,因此解决方案是在此部署上的内存用完时手动删除旧数据。

新系统

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

问题

  1. 我们的旧系统有一个节点,索引过多(超过100个),分片过多(超过1000个),看来我们的新系统设计得太少了(一个索引可以存储5年以上的数据)。根据{{​​3}}建议,似乎更好的索引策略是每周或每月创建一个索引?就是说,根据time-based data,每个节点的最佳索引数是1,如果我们仅在一个节点上运行,那么首先为基于时间的数据创建多个索引的实用程序是什么? / li>
  2. 如何在Elastic Cloud中将节点添加到ES部署中?当前,测试项目中的所有副本节点都未分配,因为部署只有一个节点。有一个滑块可让您轻松选择部署中每个节点的内存(介于1GB和250B之间),但是我看不到添加多个节点的方法,这令人困惑,因为这似乎是Elasticsearch的基本功能。
  3. 我们的测试项目的节点已经多次重启,总是在该节点上有很多旧数据时才会重启,因此会导致内存压力。解决方案是删除旧数据(因为测试项目一次只能存储几个月的数据),但是看来节点重新启动时并没有丢失数据。为什么会这样?
  4. 我们的测试项目没有快照,应该每30分钟自动在Elastic Cloud上进行一次快照。我已经问过他们对此事的支持,但只是想知道是否有人知道这可能导致什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

  

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

很显然,在单个节点上,您不能拥有副本。因此,索引应该已经配置了0个副本,并且可以动态地进行操作以使群集恢复为绿色(PUT index/_settings {"index.number_of_replicas": 0}),就这么简单。

  

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

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

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

完全有可能在单个索引中包含五年的数据,这实际上并不取决于数据的年代久远,而取决于数据的增长量。您提到了250GB,并且您知道一个分片不应增长到超过30GB(这又取决于下面的硬件规格,稍后会再介绍),但是由于该索引只有6个分片,这意味着每个分片分片将增长40GB以上(根据this可以确定),但是为了安全起见,您应该增加到8-9个分片,或者将数据分成年/月索引。

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

  
      
  1. 话虽如此,根据关于SO的另一个答案,每个节点的最佳索引数是1 ...
  2.   
克里斯说的是理论/理想的背景,几乎不可能/不建议/不希望在现实中进行。您确实希望索引中包含多个分片,原因是当数据增长时,您希望能够扩展到多个节点,这就是ES的重点,否则最好嵌入Lucene。库直接在您的项目中。

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

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

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

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

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

您在测试项目中确实不需要副本,对吗?

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

您如何删除数据?从删除数据到重新启动节点之间,您是否见证数据确实消失了?

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

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