当前位置: 首页 > news >正文

Elasticsearch分片的主动迁移

shard

分片存储了一个索引的一部分数据,多个分片组成了一个完整的索引。分片的形式提升了一个索引查询和写入的并发能力,以横向的方式提升了集群数据存储的上限。比如一个索引1000G,但是集群内最大的数据节点的磁盘容量是500G,在没有分片的情况下,这个索引是无法写入到这个集群的。将这个索引拆分成2个分片理论上两个同样配置的节点就可以存储这个索引所有的数据。 分片这种结构在合理的设置下突破物理硬件的上限,综合利用硬件群集的能力。

根据集群的分配策略,分片在集群内会出现从一个节点移动到另一个节点的情况。而下面几种情况都会触发这种迁移的发生。

  • 新建或删除索引
  • 集群节点变动:新增、减少
  • 节点重启
  • 手动reroute

查看分片迁移的状态

分片的迁移是需要消耗集群内部带宽、cpu、磁盘、内存资源的,实际集群维护过程中有时需要人工干预分片迁移的进度、修复迁移失败的分片。

  1. 查看正在迁移的分片
#在kibana中执行
GET _cat/recovery?v&&active_only=true
  1. 如果有分配失败的分片,查看失败的原因
GET _cluster/allocation/explain?pretty

鉴于分片的迁移需要消耗集群的资源,对于所有主动触发的分片迁移,如:重启、扩缩容等操作建议放在业务低峰期进行。分片迁移过程中可以调整并发的分片数和分片恢复的速度上限以缩短集群恢复时间。

对于非主动触发的分片迁移,如果对业务产生影响,可以通过命令控制分片恢复的速度,减少对业务的影响。

  1. 调整分片并发和速度
PUT _cluster/settings
{ "persistent": {"cluster.routing.allocation.node_concurrent_recoveries": 2,"indices.recovery.max_bytes_per_sec": "40mb/s" }
}

cluster.routing.allocation.node_concurrent_recoveries 分片恢复的并发进程数

indices.recovery.max_bytes_per_sec 索引恢复时带宽上限

使用上面的命令根据需要调大或调小集群分片恢复的并发数和带宽上限,以控制集群恢复的时间和对业务影响的程度。

分片的自动迁移

以下情况会触发分片的自动迁移:

  • 新建或删除索引
  • 集群节点变动:新增、减少
  • 节点重启

手动迁移分片

API介绍

分片主动迁移,es提供api实现人为主动操作分片在节点上的分配。

POST /_cluster/reroute
request样例
POST /_cluster/reroute?metric=none
命令可接受的参数

dry_run 请求中加上dry_run参数后,这个请求只会根据当前集群状态计算命令执行的结果并返回它,并不会在集群上真正执行.

POST /_cluster/reroute?dry_run

explain 解释这个请求可执行(不可执行)的原因

POST /_cluster/reroute?dry_run

metric 指定命令返回的内容

POST /_cluster/reroute?metric=master_node可指定的模块:
master_node	     	#显示主节点部分
metadata					#显示元数据部分
node		    			#显示节点部分
routing_table	   	#显示路由表部分
version  	       	#显示版本信息

retry_failed 重试分配失败的分片

POST  _cluster/reroute?retry_failed=true

master_timeout 主节点超时时间

timeout 命令超时时间

请求体内容

样例:

POST /_cluster/reroute?metric=none
{"commands": [{"move": {"index": "test", "shard": 0,"from_node": "node1", "to_node": "node2"}},{"allocate_replica": {"index": "test", "shard": 1,"node": "node3"}}]
}

_cluster/reroute 支持的post方法的请求,请求体内需要提供commands参数。 commands需要提供一个列表,指定要操作的内容。

commands可接受的子命令:move、cancel、allocate_replica、allocate_stale_primary、allocate_empty_primary。

样例:

move 将一个分片从一个节点移动到另外一个节点

POST /_cluster/reroute
{"commands": [{"move": {"index": "test",				#索引名"shard": 0,							#分片编号"from_node": "node1", 	#分片源节点"to_node": "node2"			#分片迁移目标节点}}]
}

cancel 撤销一个分片的分配,默认操作对象为副本分片。执行后可以强制重新初始化副本分片并从主分片同步数据。如果确认需要操作主分片,需要在请求主体中增加allow_primary参数并置为true.

#未验证
POST /_cluster/reroute
{"commands": [{"cancel": {"index": "test",				#索引名"shard": 0,							#分片编号"node": "node1" 				#分片源节点}}]
}

allocate_replica 分配一个未分配的分片到指定节点

POST /_cluster/reroute?metric=none
{"commands": [{"allocate_replica": {"index": "test", 		#索引名"shard": 1,					#分配编号"node": "node3"			#分片分配的节点}}]
}

allocate_stale_primary 将一个保留有过期数据的副本分片提升为主节点

POST /_cluster/reroute
{"commands": [{"allocate_stale_primary": {"index": "test",				#索引名"shard": 0,							#分片编号"node": "node1" 				#分片源节点"accept_data_loss": "true"	#接受潜在的数据丢失}}]
}POST /_cluster/reroute
{"commands" : [{"allocate_stale_primary" : {"index" : "jy_seal_car_detail20240628","shard" : 4,"node" : "Z6GsmF8CQHSp2iaw_SpkZA","accept_data_loss" : true  }}]
}

accept_data_loss #执行这条命令后,如果一个持有最新副本(good copy)的节点重新加入当前集群,新节点上的最新副本(good copy)会被分配的过期副本(stale copy)上的数据所覆盖。为了确保执行命令时了解到这条命令的风险,增加将accept_data_loss设置为true

allocate_empty_primary 分配一个空分片到指定节点

POST /_cluster/reroute
{"commands": [{"allocate_empty_primary": {"index": "test",				#索引名"shard": 0,							#分片编号"node": "node1" 				#分片源节点"accept_data_loss": "true"	#接受潜在的数据丢失}}]
}

accept_data_loss #请求中值设置为true. 这条命令的执行将会导致分配的这个主分片原来的数据全部丢失。如果后续有一个节点重新加入集群,且这个节点上有执行分片的数据,新节点上的这个分片数据将会被删除。

allocate_stale_primary、allocate_empty_primary这两条命令操作对象都是主分片,有一定丢失数据的风险。

一般情况下主分片的分配都会由es集群自动处理完成,只有在极端情况下才需要使用下面两条命令。造成主分片分配失败的原因:

  • 新索引创建但是集群内node都不满足分配策略导致主分片无法分配,主分片处理未分配状态。
  • 当前集群内数据节点上找不到数据的最新副本分片,为防止数据丢失,系统不会将过期副本分片提升为主分片,主分片处理未分配状态。

一般用于在原始数据无法恢复,并且可以接受数据丢失的情况下。 如果是遇到临时可修复的问题,不要使用这两条命令,使用上面提到的retry_failed来修复分片的分配。

注意一旦执行了这两条命令,当有一个新的节点加入当前集群后,如果新节点上带有这个分片的副本,那么新节点上的副本将会被删除覆盖

使用场景

各个节点上分片数一致,但因为不同的索引大小不一,导致个别节点磁盘使用率超90%,其他节点在50%左右。这种情况下一旦发生节点重启,90%磁盘使用率的节点可能会被打满?

解决:这种场景下,只能是手动将快写满的节点上的分片迁移到其他节点。

手动迁移任意一个分片都会触发集群的自动平衡,以恢复集群到平衡状态。比如,从node1上迁移一个分片到node2上之后,动态平衡会从node2再迁移一个分片到node1。可以通过配置cluster.routing.rebalance.enable参数,禁用动态平衡以维持手动迁移分片的结果。

禁用自动平衡(支持索引级别配置)

PUT /_cluster/settings
{"transient" : {"cluster.routing.rebalance.enable" : "none"}
}

手动将分片从磁盘使用率超90%的节点上将分片移走

POST /_cluster/reroute
{"commands": [{"move": {"index": "test",				#索引名"shard": 0,							#分片编号"from_node": "node1", 	#分片源节点"to_node": "node2"			#分片迁移目标节点}}]
}

解决索引及分片问题后恢复集群自动平衡

PUT /_cluster/settings
{"transient" : {"cluster.routing.rebalance.enable" : "all"}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • controller 中 worker 最不适合做什么操作
  • 超简单!用这两款AI工具,小白也能轻松打造个人写真
  • 【Linux基础】Linux基本指令(二)
  • Gemma 2 2B:针对小型 LLM 提示工程关注点
  • Nginx+Tomcat负载均衡、动静分离群集
  • 基于HTML弹性布局做的支付宝界面
  • Mamba 永远不会忘记任何标记
  • 【iOS】OC关键字总结及底层原理(下)
  • 利用单张/多张图内参数标定 OpenCV Python
  • 大数据算法岗位分析推荐:基于Python的招聘大数据爬虫可视化分析推荐系统(完整系统源码+数据库+详细开发文档+万字论文+详细部署教程等全资料)
  • 数据结构-------队列
  • Dubbo框架实现RPC远程调用包括nacos的配置和初始化
  • 如何解决 windows11系统 使用中电脑突然自动休眠的问题
  • 使用消息队列、rocketMq实现通信
  • OpenAI 发布 GPT-4o 模型安全评估报告:风险等级为“中等”|TodayAI
  • 2017-08-04 前端日报
  • Angular 2 DI - IoC DI - 1
  • avalon2.2的VM生成过程
  • canvas绘制圆角头像
  • CSS中外联样式表代表的含义
  • ECMAScript入门(七)--Module语法
  • Gradle 5.0 正式版发布
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java读取Properties文件的六种方法
  • LeetCode29.两数相除 JavaScript
  • mysql常用命令汇总
  • Spring Cloud Feign的两种使用姿势
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从零开始的无人驾驶 1
  • 服务器从安装到部署全过程(二)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 使用 @font-face
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 突破自己的技术思维
  • 温故知新之javascript面向对象
  • 转载:[译] 内容加速黑科技趣谈
  • 最简单的无缝轮播
  • FaaS 的简单实践
  • UI设计初学者应该如何入门?
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Redis 入门到精通(一)数据类型(4)
  • #include
  • (1)svelte 教程:hello world
  • (zt)最盛行的警世狂言(爆笑)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)hibernate配置管理
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (黑马点评)二、短信登录功能实现
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Linux整合apache和tomcat构建Web服务器