我们现在正在使用Elasticsearch设计新系统的体系结构,并计划基于将其服务与AWS的服务进行对比并在EC2实例上进行自我托管的评论来使用Elastic Cloud。在设计系统时,我试图从6个月前我的团队在Elastic Cloud上部署的一个小型测试项目中学习。虽然我花了很多时间阅读Elasticsearch Docs,Elasticsearch: The Definitive Guide和Elastic Cloud's Docs,但是这里有些概念我还是不明白。
我们的测试项目默认使用5个主分片和每个主分片1个副本分片。它是使用Elastic Cloud上的默认部署选项配置的,具有单个节点,当前具有2GB内存。因为只有一个节点,而且副本碎片从未分配给它们的主碎片(reason 2),所以没有副本被分配。另外,该项目使用time-based data,并且每天为每个帐户创建一个索引,从而导致每天大约10个索引(或100个分片),随着时间的流逝,谚语Kagillion Shards逐渐增多。该系统以前一次只能存储几个月的数据,因此解决方案是在此部署上的内存用完时手动删除旧数据。
我们的新系统旨在基于它拥有5年的时间数据,预计该数据将增长到250 GB。当前的实现对基于时间的数据使用单个索引,每个索引有6个主分片和1个副本。做出此决定是基于阅读,即单个分片的最大大小应为30GB。
答案 0 :(得分:1)
我们的测试项目默认使用5个主分片和每个主分片1个副本分片。它是使用Elastic Cloud上的默认部署选项和一个节点配置的
很显然,在单个节点上,您不能拥有副本。因此,索引应该已经配置了0个副本,并且可以动态地进行操作以使群集恢复为绿色(PUT index/_settings {"index.number_of_replicas": 0}
),就这么简单。
此外,该项目使用基于时间的数据,并且每天每个帐户创建一个索引,导致每天大约10个索引(或100个分片)
由于您没有提供有关测试项目中数据量的任何信息,我无法确定每天有50个新的主分片(10个索引)是否合理。但这可能太多了。
- 根据基于时间的数据建议,似乎更好的索引策略是每周或每月创建一个索引?
完全有可能在单个索引中包含五年的数据,这实际上并不取决于数据的年代久远,而取决于数据的增长量。您提到了250GB,并且您知道一个分片不应增长到超过30GB(这又取决于下面的硬件规格,稍后会再介绍),但是由于该索引只有6个分片,这意味着每个分片分片将增长40GB以上(根据this可以确定),但是为了安全起见,您应该增加到8-9个分片,或者将数据分成年/月索引。
每个分片的30GB容量限制还取决于您的节点有多少堆。如果您的节点具有2GB的堆,那么拥有30GB的分片显然太大了。由于您正在使用ES Cloud,并且计划拥有250GB的数据,因此必须选择16GB堆+ 384GB存储(或更大)的节点容量。因此,对于16GB的堆,拥有30GB的碎片是合理的,但是我认为您将需要多个节点。您可以使用GET _cat/nodes?v
验证有多少个节点。
克里斯说的是理论/理想的背景,几乎不可能/不建议/不希望在现实中进行。您确实希望索引中包含多个分片,原因是当数据增长时,您希望能够扩展到多个节点,这就是ES的重点,否则最好嵌入Lucene。库直接在您的项目中。
- 话虽如此,根据关于SO的另一个答案,每个节点的最佳索引数是1 ...
- ...,如果我们仅在一个节点上运行,那么首先为基于时间的数据创建多个索引的实用程序是什么?
首先使用GET _cat/nodes?v
检查集群中有多少个节点,但是很明显,如果您为6-8个分片上的250GB数据分割分配了单个节点,那么单个节点确实不理想。
- 如何在Elastic Cloud中将节点添加到ES部署中?
现在,您不能。但是,在上一次Elastic {ON}会议上,Elastic announced可以选择您要设置的节点数或部署类型(热/热等)。
- 当前未分配测试项目中的所有副本节点,因为部署只有一个节点。
您在测试项目中确实不需要副本,对吗?
- 解决方案一直是删除旧数据(因为测试项目一次只能存储几个月的数据),但是看来节点重新启动时并没有丢失数据。为什么会这样?
您如何删除数据?从删除数据到重新启动节点之间,您是否见证数据确实消失了?
- 我们的测试项目没有快照,应该每30分钟自动在Elastic Cloud上发生一次。
这很奇怪,因为在ES云上,您的群集通常每30分钟获得一次快照。您在Deployments> cluster-id> Elasticsearch> Snapshots下看到什么? ES Cloud支持对此有何评论?运行GET _cat/repositories?v
和GET _cat/snapshots/found-snapshots?v
会得到什么? (用结果更新您的问题)