Elasticsearch Index Shard Allocation 索引分片分配策略

news2025/4/6 10:52:46

Elasticsearch 索引分片的分配策略说明

在上一篇《索引生命周期管理ILM看完不懂你锤我
》(https://mp.weixin.qq.com/s/ajhFp-xBU1dJm8a1dDdRQQ)中,我们已经学会了索引级别的分片分配过滤属性,也就是在配置文件中指定当前节点的属性值node.attr.node_type: hot,这个你还记得吗,不记得的话可以回去在复习一下哦。

这一篇文章中,我们主要学习一下索引分片的分配策略,也就是分片时是根据什么规则进行分配的呢?

版本:Elasticsearch 8.1

一、索引级自定义属性分片分配策略

我们有 5 个节点,node-1,node-2,node-3 增加属性 node.attr.role: masternode-4,node-5 增加属性 node.attr.role: slave
elasticsearch.yml 文件中配置如下:

node-1,node-2,node-3

# node-1,node-2,node-3
node.attr.role: master

node-4,node-5

# node-4,node-5
node.attr.role: slave

定义索引zfc-doc-000013,指定index.routing.allocation.include.roleslave,意思就是该索引分片只分配到node.attr.role的值为slave的节点上。

PUT zfc-doc-000013
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 3,
    "index.routing.allocation.include.role":"slave"
  }
}

当前集群为 5 个节点的集群,其中只有 node-4node-5roleslave ,所以创建的索引 zfc-doc-000013 只会在这两个节点 node-4node-5 中进行分配,而不会在 node-1node-2node-3中进行分配。

二、节点离开时触发分配

当集群中的节点由于未知的原因或者已知的原因离开集群时,主节点会做出以下反应:

  • 如果当前离开的节点上有主分片,会将其它的副本分片提升为主分片以替换该节点上的主分片;
  • 如果有足够多的节点,分配副本分片来替代当前节点丢失的副本分片;
  • 在剩余的节点之间进行重新平衡分片。

通过上述的操作可以让我们尽可能的防止数据丢失,但是如果离开的节点很快就恢复那么这可能就是没有必要的操作了。所以哪怕我们在节点级别和集群级别限制并发恢复,这种重新分配分片仍然会给系统带来大量的额外负载。

想象一下以下场景:

  • 节点 node-3 离开集群
  • 主节点将节点 node-3 上的主分片的副本分片提升为主分片
  • 主节点将新的副本分配给集群中的其它节点
  • 每个新副本都会通过网络创建主分片的完整副本
  • 更多的分片被移动到不同的节点以重新分片分配达到平衡
  • 几分钟之后节点 node-3 返回加入集群
  • 主分片将分片分配给节点 node-3 以重新平衡集群

集群初始分配状态

停掉节点 node-3

默认等待一分钟之后,系统自动进行分片的重新分配

节点恢复之后进行分片重新分配

由于节点离开造成的未分配分片可以通过修改参数 index.unassigned.node_left.delayed_timeout 动态设置延迟时间,默认 1m

可以在单个索引或者全部索引上进行设置该参数。


PUT zfc-doc-000013/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "2m"
  }
}

此设置不会影响副本分片升级为主分片,也不会影响之前未分配的副本的分配。需要注意的是,该设置在集群重启之后会失效。

2.1、取消分片分配

如果延迟分配超时,主节点会将丢失的分片分配给另一个节点,该节点将开始恢复。
如果离开的节点重新加入集群,并且其分片仍然具有与主分片相同的 sync-id,分片的重新分配将被取消,同步分片将恢复。
因此默认超时设置为一分钟,即使分片重新分配已经开始,取消的成本也很低。

我们可以通过如下 API 查看集群健康状态。

GET _cluster/health 

2.2、节点永久离开

如果一个节点离开集群之后确定不会在返回,我们可以通过设置参数 index.unassigned.node_left.delayed_timeout0 来让 Elasticsearch 马上分配未分配的分片。

PUT _all/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "0"
  }
}

三、索引恢复优先级

对于索引分片的重新分配,对于索引来说是有优先级的。

1、index.priority最高的优先

2、其次是索引的创建时间

对于如下例子,我们可以自己测试一下:

PUT zfc-doc-index_1

PUT zfc-doc-index_2

PUT zfc-doc-index_3
{
  "settings": {
    "index.priority": 10
  }
}

PUT zfc-doc-index_4
{
  "settings": {
    "index.priority": 5
  }
}
  • zfc-doc-index_3 第一个被恢复,因为它的优先级 index.priority 最高。
  • zfc-doc-index_4 第二个被恢复,它的优先级仅次于索引 zfc-doc-index_3
  • zfc-doc-index_2 第三个被恢复,它是最近创建的。
  • zfc-doc-index_1 最后被恢复。

四、节点总分片数限制

Elasticsearch 的集群在分配分片的时候,Elasticsearch 会尽可能的将单个索引的分片尽可能的分配在尽可能多的节点上,但是有时不是那么的均匀。我们可以通过以下设置修改允许每个节点上单个索引的分片总数的限制,index.routing.allocation.total_shards_per_node 分配给单个节点的最大分片数,默认没有限制。

PUT zfc-doc-000013/_settings
{
  "settings":{
    "index.routing.allocation.total_shards_per_node": 2
  }
}

也可以在不考虑索引的情况下限制节点可以拥有的分片数量 cluster.routing.allocation.total_shards_per_node 分配给每个节点的主分片和副本分片的最大数量,默认 -1 没有限制。

PUT _cluster/settings?flat_settings=true
{
  "transient":{
    "cluster.routing.allocation.total_shards_per_node":2
  }
}

Elasticsearch 会在分片的重新分配期间进行校验该参数,有如下场景:
一个 Elasticsearch 集群,有三个节点,cluster.routing.allocation.total_shards_per_node 设置为100,并且具有如下的分片分布情况

  • 节点1:100个分片
  • 节点2:98个分片
  • 节点3:1个分片

如果节点3发生故障,Elasticsearch 会将其分片重新分配到节点2,并不会分配到节点1,因为分配到节点1会超过设置的100分片限制。

需要注意的是,如果我们设置了该参数,可能会导致部分分片无法进行分配。

下面我们用个例子来说明,首先看如下是我本地 Elasitcsearch 集群的部分索引

我们通过使用 API 动态修改参数之后,让其重新进行分片分配会发生什么情况呢?

如下语句意思就是每个节点主分片加副本分片数量不能大于 2,所以在下次发生分片的重新分配时肯定会无法进行分配。

PUT _cluster/settings?flat_settings=true
{
  "transient":{
    "cluster.routing.allocation.total_shards_per_node":2
  }
}

停止 node-3 节点之后,分片无法分配。

在上面更改集群的设置时,我们可能已经注意到了,使用的是 transient ,还可以使用 persistent,他俩的区别就是transient 的配置会在集群重启之后失效,persistent会持久化保存。

不过这几个配置的优先级如下:

1、transient

2、persistent

3、elasticsearch.yml

4、设置的默认值

五、索引级别数据层过滤

索引级别过滤与前面的自定义属性分片分配类似,不过索引级别使用的是_tier_preference 来控制索引分配到哪个数据层。

这块不是特别了解的可以参考文章开头引用的索引生命周期那篇文章,该文章内通过例子展示了索引的生命周期。

我们还是用一个例子来说明
首先在elasticsearch.yml 定义角色
node-1,node-2中定义 node.roles: ["data_hot", "data_content"]
node-3,node-4中定义 node.roles: ["data_warm","data_content"]
node-5中定义 node.roles: ["data_cold","data_content"]

关于节点角色的定义,可以参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-node.html#master-node

集群按照上面的配置完成之后,启动如下

通过 API 定义索引 zfc-doc-index_1 的分片分配策略在 data_warm

PUT zfc-doc-index_1
{
  "settings": {
    "number_of_replicas": 2,
    "number_of_shards": 3,
    "index.routing.allocation.include._tier_preference": "data_warm"
  }
}

按照预期的设定,索引的分片应该是分布在 node-3,node-4 中,结果如下:

可以看到,有分片是没有进行分配的,所以这也是修改分片分配策略时需要特别注意的一点。

总结

通过上面的学习,我们知道了:

  • 可以通过自定义属性 node.attr.[] 控制分片的分配
  • 可以通过索引级别的角色 index.routing.allocation.include._tier_preference 进行数据层的过滤分配
  • 分片的分配过程中是可以通过 index.priority 指定优先级的
  • 可以通过 index.routing.allocation.total_shards_per_node 控制每个节点上单个索引的分片数量
  • 可以通过 cluster.routing.allocation.total_shards_per_node 控制每个节点上所有主分片加副本分片的总数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

srm-50——攻防世界

可以知道这道题是二类题型,你完成某个事情给你flag 我们输入正确的东西,给“flag” 运行一下可以知道这些关键词 直接关键词在字符串里面 找到运行得到的东西 INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) {HMODULE Mo…

Vue 组件通信方式

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

天津想转行学python培训班靠谱吗?

现在的职业如此繁多,很多人把高薪当成衡量工作好坏的重要标准,因此IT行业以超出其他行业几倍薪资水平成为不错的选择,而Python又以其简单易学好上手成为大家所青睐的学习目标。 Python发展前景如何 Python语言就业发展方向广泛:…

SpringSecurity+OAuth2.0 搭建认证中心和资源服务中心

目录 1. OAuth2.0 简介 2. 代码搭建 2.1 认证中心(8080端口) 2.2 资源服务中心(8081端口) 3. 测试结果 1. OAuth2.0 简介 OAuth 2.0(开放授权 2.0)是一个开放标准,用于授权第三方应用程序…

java垃圾回收GC过程

GC(Gabage Collection) 用于回收堆中的垃圾数据 清理方法 1.标记-清理 对数据标记,然后清理 缺点:容易产生内存碎片 2.标记-整理 对标记后的数据清理,剩下数据前移 缺点:每次清理后数据都要迁移&#xff0…

代码随想录二刷 | 回溯 | 组合优化

代码随想录二刷 &#xff5c; 回溯 &#xff5c; 组合优化 剪枝优化 剪枝优化 在遍历的过程中有如下代码&#xff1a; for (int i startIndex; i < n; i) {path.pop_back();backtracking(n, k, i 1);path.pop_back(); }n 4&#xff0c;k 4的话&#xff0c;那么第一层f…

qemu使用

百度qemu bios 问题 坑爹的玩意&#xff0c;编译qemu 还需要python3.5以上 解决方法&#xff1a; CentOS7安装Python3.8-CSDN博客 https://www.cnblogs.com/Oliver.net/p/7211967.html 编译python3.8还由于openssl过低 参考 QEMU启动x86-Linux内核_qemu-system-x86-…

SaaS多租户篇

文章目录 1. 多租户是什么2. 技术组件2.1 如何实现多租户的DB封装2.2 如何实现多租户的redis封装2.3 如何实现多租户的Web和Security封装2.4 如何实现多租户的Job封装2.5 如何实现多租户的 MQ 与 Async 封装&#xff1f;2.6 如何实现多租户的 AOP 与 Util 封装&#xff1f; 3.业…

【Qt之模型视图】5. Qt库提供的视图便捷类

1. 前言 Qt提供了一些便捷的视图类&#xff0c;如QListWidget提供项目列表&#xff0c;QTreeWidget显示多级树结构&#xff0c;QTableWidget提供单元格项的表格。每个类都继承了QAbstractItemView类的行为&#xff0c;QAbstractItemView类实现了项目选择和标题管理的通用行为。…

《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型

第五章 HTML 解释器和 DOM 模型 1.DOM 模型 1.1 DOM标准 DOM &#xff08;Document Object Model&#xff09;的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。这里的文档可以是 HTML 文档、XML 文档或者 XHTML 文档。D…

ubuntu 相关内容

ubuntu 优盘安装&#xff1a; 台式机安装纯ubuntu系统的操作步骤-CSDN博客https://blog.csdn.net/youngwah292/article/details/127032009?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170583039216800213099577%2522%252C%2522scm%2522%253A%252220140713.1301…

音视频开发ffmpeg

ffmpeg数据结构 重要的结构体 压缩数据 avpacket 帧数据 avframe 管家&#xff1a; avformatcontext 格式上下文 文件是一种协议 解协议&#xff08;http、rtsp rtmp mms tcp udp…&#xff09; AVIOContext URLProtocol URLContext存储音视频中的协议类型和状态 有缓冲区…

74.搜索二维矩阵 - 力扣(LeetCode)

题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…

爬虫案例—雪球网行情中心板块数据抓取

爬虫案例—雪球网行情中心板块数据抓取 雪球网行情中心网址&#xff1a;https://xueqiu.com/hq 目标&#xff1a;市场一览板块、热股榜板块、新股预告板块、关注排行榜板块 import datetimeimport requestsheaders {user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10…

算法优化:LeetCode第122场双周赛解题策略与技巧

接下来会以刷常规题为主 &#xff0c;周赛的难题想要独立做出来还是有一定难度的&#xff0c;需要消耗大量时间 比赛地址 3011. 判断一个数组是否可以变为有序 public class Solution {public int minimumCost(int[] nums) {if (nums.length < 3) {// 数组长度小于3时&a…

即插即用篇 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

章鱼网络 Community Call #17|打造全新 Omnity 跨链协议

香港时间2024年1月8日12点&#xff0c;章鱼网络举行第17期 Community Call。 对于 Octopus Community 而言&#xff0c;2023年是一个分水岭。我们如期兑现我们的承诺&#xff0c;成功上线了包括 $NEAR Restaking 和 Adaptive IBC 在内的完整的 Octopus 2.0。 自从我们在2023年…

编曲学习:Cubase12导入Cubasis工程的方法!

Steinberg 发布 Cubasis 3 项目导入器&#xff0c;可将 Cubasis 的项目导入到 Cubase 使用https://m.midifan.com/news_body.php?id35635 我偶然看到这个文章&#xff0c;不过发现Cubase12默认好像没有这个选项&#xff0c;心想着要是移动端能和PC端同步&#xff0c;感觉会挺…

腾讯云服务器价格查询,2024更新

腾讯云服务器租用优惠价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月&#xff1b;云服务器CVM S5实例2核2G配置280.8元一年、2核4G…

力扣509. 斐波那契数

动态规划 思路&#xff1a; 斐波那契数通式&#xff1a;F(n) F(n - 1) F(n - 2)&#xff1b;以此为状态转移方程&#xff0c;对其进行动态规划&#xff1b;边界条件&#xff1a; F(0) 0F(1) 1使用两个变量来存储上一组结果&#xff1b; class Solution { public:int fib(…