ElasticSearch Scale Forever

时间:2015-02-25 17:08:41

标签: elasticsearch

enter image description here

ElasticSearch社区: 假设我有一个名叫Twetter的客户,他今天雇用了我,为181字的社交媒体网站建立搜索功能。

假设我无法预测未来扩展所需的分片数量,并且存储大小已经达到数十TB。

假设索引后我不需要编辑任何文档。这仅供搜索。

参考上面的图片,似乎有一些文件指向滚动索引' ref1 ref2 ref3我可以在其中创建单个索引(例如,名为tweets1 - > N的索引)。当一个索引填满时,我可以简单地添加一个带有新索引的新机器,并将其添加到同一个集群和别名中进行搜索。

这种架构是否适用于生产?

对此滚动指数有任何长期影响吗?架构而不是预测碎片计数和在该估计内的缩放?

1 个答案:

答案 0 :(得分:1)

elasticsearch中的分片只是一个lucene索引。弹性搜索索引只是lucene索引(分片)的集合。鉴于此,对于您的情况下的容量规划,您只需要确定只有一个分片可以存储在索引中的文档数量,并且仍然可以获得所需的查询性能。

潜在的lucene指数耗尽了资源。根据您的文档在lucene索引中的索引方式,群集中的任何单个节点都能够处理有限数量的分片。您始终可以通过向群集添加更多节点来进行扩展。只需监控资源使用情况和查询响应时间,以了解何时添加更多节点。

创建名为tweet_1tweet_2tweet_3等的索引是非常合理的,而不是担心重新分析数据。它最终完成了同样的事情。只需使用index alias隐藏数字。

一旦弄清楚每个分片可存储多少文档以获得查询性能,然后确定每个索引需要多少分片,然后将这些数字相乘,并将索引限制在代码中的该数量的文档中。达到上限后,您只需转到新索引即可。以下是我在代码中执行的操作,以确定将文档发送到哪个索引(我有顺序ID):

$index = 'file_' . (int)($fid / $docsPerIndex);

请注意,我正在使用index templates,因此它可以自动创建新索引,而无需在达到上限时手动滚动。

另一个考虑因素是您将要执行的查询类型。随着数据的增长,您有两种扩展选项。

  1. 您需要在群集中有足够的节点来并行化查询,以便它可以轻松搜索所有索引并仍然快速响应。
    1. 您需要为索引命名,以便知道要查询哪些索引,并且只需要查询群集中索引的子集。
    2. 请记住,如果您有顺序或可预测的ID,那么elasticsearch可以有效地执行基于id的查询,而无需实际查询整个群集。如果让ES自动分配ID(假设您使用ES> = 1.4.0),它将使用可预测的ID(flake ids)。这也加快了索引速度。随机ID会造成最糟糕的情况。

      如果您的查询将基于时间,则必须在此方案下搜索每个查询的整个索引集。对于基于时间的查询,您希望根据一段时间(例如,每天或每月根据您在该时间范围内收到的数据量)推送指数,并将其命名为tweets_2015_01,{{1}通过这样做,您可以根据请求的搜索时间范围缩小您在查询时搜索的索引集。