优化Elasticsearch 每个索引应该有多少个分片?,330页PDF,10万字的知识点总结

======

这是一个重要的话题, 很多用户对如何分片都有所疑惑, 有个最好的理由就是. 在生产环境中, 随着数据集的不断增长, 不合理的分配策略可能会给系统的扩展带来严重的问题.

同时, 这方面的文档介绍也非常少. 很多用户只想要明确的答案-他们需要特定的答案,而不是模糊的数字范围和任意大的数字的警告。

当然,我也有一些答案. 不过先要看看它的定义和描述,我们提出了几个常见的用例,并为每个用例提供了我们的建议。

定义

==

如果你刚接触ElasticSearch, 那么弄清楚它的几个术语和核心概念是非常必要的.

(如果你已经有ES的相关经验, 可以跳过这部分)

假设ElasticSearch集群的部署结构如下:

优化Elasticsearch 每个索引应该有多少个分片?

在参考此图时请记住这些定义:

cluster(集群) - Elasticsearch集群由一个或多个节点组成,可通过其集群名称进行标识。

node(节点) - 单个Elasticsearch实例。在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。

index(索引) - 在Elasticsearch中,索引是文档的集合

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

开源分享完整内容戳这里

shard(分片) - 因为Elasticsearch是一个分布式搜索引擎,索引通常会拆分为分布在多个节点上的称为分片的元素。Elasticsearch自动管理这些分片的排列。它还根据需要重新平衡分片,因此用户无需担心细节。

replica(副本) - 默认情况下,Elasticsearch为每个索引创建五个主分片和一个副本。这意味着每个索引将包含五个主分片,每个分片将具有一个副本。

对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求, 它们的唯一区别在于只有主分片才能处理索引请求.

在上图示例中, 我们的ElasticSearch集群有两个节点, 并使用了默认的分片配置. ES自动把这5个主分片分配到2个节点上, 而它们分别对应的副本则在完全不同的节点上. 对,就这是分布式的概念.

请记住, 索引的number_of_shards参数只对索引有效而不是对整个集群生效.该参数定义了每个索引的主分片数(不是群集中的主分片总数).

关于副本

====

副本主要是为了提高搜索性能,用户可以随时添加或删除副本。它们为您提供了额外的容量、更高的吞吐量和更强的故障切换能力。我们始终建议生产群集有两个副本用于故障转移。

谨慎分配你的分片

========

当在ElasticSearch集群中配置好你的索引后, 你要明白在集群运行中你无法调整分片设置. 如果以后你发现需要调整分片数量, 那么您需要重新索引所有源文档-reindex(虽然重建索引比较耗时,但可以在没有停机的情况下完成).

主分片配置非常类似于硬盘分区,其中原始磁盘空间的重新分区需要用户备份,配置新分区以及将数据重写到新分区

2~3GB的小型静态数据集

=============

分配分片时主要考虑的你的数据集的增长趋势.

我们也经常会看到一些不必要的过度分片场景. 从ES社区用户对这个热门主题(分片配置)的分享数据来看, 用户可能认为过度分配是个绝对安全的策略(这里讲的过度分配是指对特定数据集, 为每个索引分配了超出当前数据量(文档数)所需要的分片数).

Elastic在早期确实鼓吹过这种做法, 然后很多用户做的更为极端–例如分配1000个分片. 事实上, Elastic目前对此持有更谨慎的态度.

稍有富余是好的, 但过度分配分片却是大错特错. 具体定义多少分片很难有定论, 取决于用户的数据量和使用方式.一百个很少使用的碎片可能没问题;而两个使用量很大的碎片可能太多了.

要知道, 你分配的每个分片都是有额外的成本的:

  • 每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源

  • 每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分片开始竞争相同的硬件资源时, 性能便会逐步下降

  • ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差

我们的客户通常认为随着业务的增长, 他们的数据量也会相应的增加, 所以很有必要为此做长期规划. 很多用户相信他们将会遇到暴发性增长(尽管大多数甚至都没有遇到过峰值), 当然也希望避免重新分片并减少可能的停机时间.

如果你真的担心数据的快速增长, 我们建议你多关心这条限制: ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 我们推荐你最多分配7到8个分片.

总之, 不要现在就为你可能在三年后才能达到的10TB数据做过多分配. 如果真到那一天, 你也会很早感知到性能变化的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值