Elasticsearch Reroute API 的使用

本文通过一个 Elasticsearch 集群中主分片分配不均衡的例子演示一下 Cluster reroute API 的使用。

对于 Elasticsearch 分片分配策略不了解的同学可以点一下关注,后面更文之后获取第一手资料。

环境信息

Windows 10

Elasticsearch 8.1

JDK17

初始集群状态

分片1分片2分片4 都在 node-2 节点上

我们可以使用如下命令移动索引 my-index-0000010node-2 节点上的 主分片1 移动到 node-1 节点上

POST /_cluster/reroute?metric=none
{"commands": [{"move": {"index": "my-index-0000010", "shard": 1,"from_node": "node-2", "to_node": "node-1"}}]
}

移动完成之后结果如下。

下面我们看一个例子,如果我们索引 my-index-0000010node-2 节点上的 主分片4 移动到 node-4 节点会发生什么情况呢,大家可以猜想一下,看一下是不是和你想得一样。

如下命令是移动索引 my-index-0000010node-2 节点上的 主分片4node-4 节点上去。

POST /_cluster/reroute?metric=none
{"commands": [{"move": {"index": "my-index-0000010", "shard": 4,"from_node": "node-2", "to_node": "node-4"}}]
}

返回结果如下所示,我们只需要关注NO的地方即可,我已经在下图标示出来了,提示的意思就是,node-4 节点上已经存在 分片4 的副本,不允许进行 move 操作

对于如上这种情况,那么我们该如何进行分片的迁移呢?

首先可以知道的是,如果我们把节点node-2上的分片4移动到node-4节点上是不被允许的,因为node-4上面已经存在分片4的副本分片,那么我们可以反过来思考,如果想让节点 node-2 上的分片可以均衡分配,只需要让 Elasticsearch 触发一下正常的分片分配即可,所以我们使用如下的语句,来让 Elasticsearch 进行 node-2 节点上 主分片4 的重新分配。

POST /_cluster/reroute?metric=none
{"commands": [{"cancel": {"index": "my-index-0000010","shard": 4,"node": "node-2"}}]
}

如果你执行完了上面的语句,你会发现,报错了

那是因为 Elasticsearch 对于主分片的 cancel 操作,需要添加 allow_primary 属性,设置为true 即可,修改之后的语句如下所示。

POST /_cluster/reroute?metric=none
{"commands": [{"cancel": {"index": "my-index-0000010","shard": 4,"node": "node-2","allow_primary": true}}]
}

返回如下结果代表执行成功。

{"acknowledged" : true,"state" : {"cluster_uuid" : "dyCQnpMvSd2w3Hn9tcBTig"}
}

继续查看当前的 Elasticsearch 分片分配情况如下所示。可以看到 主分片4 已经到了节点 node-4上面了。

对于节点 node-5 上面的 分片2 也可以执行同样的操作,执行完成之后,Elasticsearch 进行默认的分片分配策略进行重新分配,结果如下。

POST /_cluster/reroute?metric=none
{"commands": [{"cancel": {"index": "my-index-0000010","shard": 2,"node": "node-5","allow_primary": true}}]
}

未分配分片进行分配

首先创建一个索引 my-index-0000011,分片数量为1,副本分片数量为1

PUT /my-index-0000011
{"settings": {"number_of_replicas": 1,"number_of_shards": 1}
}

通过页面可以看到 主分片分配到了 node-5 上,副本分片在 node-2 上。

添加一条测试数据

PUT my-index-0000011/_doc/1
{"name":"zuiyu"
}

我们同时停掉节点 node-2node-5,观察索引 my-index-0000011 的分片分配情况。

可以看到因为两个节点的同时离开,造成了分片无法重新分配,这是因为该索引 my-index-0000011 的主分片与副本文件同时离开,Elasticsearch 集群无法找到有效的分片充当主分片,所以分片会无法分配。针对这种情况下的分片无法分配问题,可以使用如下方式进行解决,具体解决方式看业务来选择。

  • 第一种方式就是重启异常的节点,等待恢复。
  • 第二种就是手动触发分片分配,但是会造成数据丢失

说到分片未分配,需要重新分配问题,那么就要提到我们的第三个命令 allocate_replica,用法如下:

POST /_cluster/reroute?metric=none
{"commands": [{"allocate_replica": {"index": "my-index-0000011","shard": 0,"node":""}}]
}

对于我们的情况就没法使用了,因为索引 my-index-0000011 的主分片与副本分片同时丢失,Elasticsearch 集群无法获取到正确的副本来进行恢复。此时就要用到另外的两个命令了。

需要注意的是,这另外的两个命令都会造成数据丢失

会造成数据丢失

会造成数据丢失

所以需要一个另外的参数来清晰的告诉你,你在做什么,以后丢了数据是你允许的。参数就是 accept_data_loss, 当该参数为 true 时,表示如果丢了数据,我可不背这锅。

如下两个命令为原始数据无法恢复且允许接收数据丢失的情况下使用

allocate_stale_primary

该参数的意思就是,如果有该索引的副本分片存在(但是该分片是过时的,也就是说不是最新的副本分片),Elasticsearch 会将主分片分配给该副本分片,所以这个情况下会造成数据丢失。显然对于我们目前的情况来说也是不合适的,下面我们来看另一个命令。

allocate_empty_primary

该参数命令会为索引分配一个全新的空的主分片,相当于没有数据,也就造成数据丢失了,而且是完全丢失。当之后拥有数据副本的节点再次加入集群时,该分片的数据会被删除。
这个命令对我们这个情况来说是可以实现的,不过就是在数据不被需要的时候是可以使用的。所以使用场景就要看我们每个人的业务场景了。
用法如下所示:

POST /_cluster/reroute?metric=none
{"commands": [{"allocate_empty_primary": {"index": "my-index-0000011","shard": 0,"node":"node-3","accept_data_loss":true}}]
}

总结

对于分片未分配的问题,可以使用 API 来进行查看分片分配情况。使用 move 命令修改主分片的存储节点位置;使用 cancel 命令撤销主分片节点存储位置,使 Elasticsearch 重新分配索引分片;使用 allocate_replica 手动触发分片重新分配;使用 allocate_stale_primary 分配一个过时的副本分片来充当主分片;使用 allocate_empty_primary 生成一个新的空分片来充当主分片。

备注

使用如下命令获取索引分片分配情况,不加参数随机返回一个有问题的索引,加了参数就按照参数指定的来返回。

GET _cluster/allocation/explain
{"index": "my-index-0000011","shard": 0,"primary": true
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA面试题】什么是引用传递?什么是值传递?

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 前言 博客的正文部分可以详细介绍Java中参数传递的机制,强调Java是按值传递的,并解释了基本数据类型和对象引用在这种传…

鳄鱼目标检测数据集VOC格式100张

鳄鱼是一种生活在热带和亚热带地区的爬行动物,属于爬行纲鳄形目鳄鱼科。它们的体形庞大,有粗壮的四肢和强壮的尾巴,一般能长到2-6米长,体重可达500公斤以上。鳄鱼的皮肤粗糙,呈灰褐色或黑色,布满了坚韧的鳞…

XSKY星辰天合星海架构荣获 IT168 “2023 年度技术卓越奖”

近日,"2023 年度技术卓越奖"获奖名单公布,XSKY 星辰天合的星海架构(XSEA,极速全共享架构)获得行业 CIO/CTO 大咖、技术专家及 IT 媒体三方认可,成功入选! “技术卓越奖”评选由国内著…

【Linux驱动】字符设备驱动程序框架 | LED驱动

🐱作者:一只大喵咪1201 🐱专栏:《RTOS学习》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀Hello驱动程序⚽驱动程序框架⚽编程 🏀LED驱动⚽配置GPIO⚽编程驱动…

最小二乘法简介

最小二乘法简介 1、背景描述2、最小二乘法2.1、最小二乘准则2.2、最小二乘法 3、最小二乘法与线性回归3.1、最小二乘法与线性回归3.2、最小二乘法与最大似然估计 4、正态分布(高斯分布) 1、背景描述 在工程应用中,我们通常会用一组观测数据去…

电商数仓项目----笔记六(数仓ODS层)

ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,此处选择gzip。 (3)…

C++入门-【13-C++ 多维数组】

C 多维数组 C 支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4]; 二维数组 多维数组最简单的形式是二维数组。一个二维数组&am…

用23种设计模式打造一个cocos creator的游戏框架----(二十三)中介者模式

1、模式标准 模式名称:中介者模式 模式分类:行为型 模式意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 结构图&#xff…

竞赛保研 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖,适合作为竞…

Linux基本指令(一)

前言 基本知识 文件文件内容文件属性(对文件的操作就是对这两部分进行操作) 在Linux中以 . 开头的文件叫隐藏文件 以-开头的是普通文件 以d开头的是目录文件 几个指令 先快速认识几个指令,方便后续的详细介绍 whoami 查看当前使用Linux系统的用户是谁 pwd …

要参加微软官方 Copilot 智能编程训练营了

GitHub Copilot 是由 GitHub、OpenAI 和 Microsoft 联合开发的生成式 AI 模型驱动的。 GitHub Copilot 分析用户正在编辑的文件及相关文件的上下文,并在编写代码时提供自动补全式的建议。 刚好下周要参加微软官方组织的 GitHub Copilot 工作坊-智能编程训练营&…

【51单片机系列】C51中的中断系统扩展实验

本文是关于51单片机中断系统的扩展实验。 文章目录 一、 扩展实验一:使用外部中断0控制蜂鸣器,外部中断1控制直流电机二、扩展实验二:修改定时器初值,设定3秒钟的定时时间让LED模块闪烁三、扩展实验三:使用定时器1和数…

法线贴图实现地形模型皱褶、凹凸不平的纹理效果

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色,它通过模拟表面的微…

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱&#xf…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件,Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用,以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改,而C…

springboot集成websocket全全全!!!

一、界面展示 二、前置了解 1.什么是websocket WebSocket是一种在单个TCP连接上进行全双工通信的持久化协议。 全双工协议就是客户端可以给我们服务器发数据 服务器也可以主动给客户端发数据。 2.为什么有了http协议 还要websocket 协议 http协议是一种无状态,非…

可视化开发

可视化开发 数据可视化 交互式可视化 文章目录 可视化开发前言一、可视化开发二、Python数据可视化大屏GIS图像智能识别处理软件开发三、可视化开发必备总结前言 可视化开发可以帮助开发者通过图形化界面和拖放操作来创建、编辑和测试应用程序。使用这些工具,开发者可以提高开…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课: 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建&基本状态&内部任务)、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

代码随想录算法训练营Day7 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串

LeetCode 344 反转字符串 本题思路:反转字符串比较简单,定义两个指针,一个 i 0, 一个 j s.length-1。然后定义一个临时变量 tmp,进行交换 s[i] 和 s[j]。 class Solution {public void reverseString(char[] s) {int i 0;int …

在Excel中,如何简单快速地删除重复项,这里提供详细步骤

当你在Microsoft Excel中使用电子表格时,意外地复制了行,或者如果你正在制作其他几个电子表格的合成电子表格,你将遇到需要删除的重复行。这可能是一项非常无脑、重复、耗时的任务,但有几个技巧可以让它变得更简单。 删除重复项 …