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.mzph.cn/news/239679.shtml

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

相关文章

嵌入式系统与物联网:智能化、互联世界的构建者

随着科技的飞速发展,我们的生活、工作以及整个社会结构都经历着深刻的变革。在这个过程中,嵌入式系统和物联网(IoT)技术扮演了关键的角色。本文将探讨嵌入式系统如何与物联网相互作用,以及它们在构建智能化、互联的世界…

SVM —— 代码实现

SMO 算法的实现步骤: 代码如下: import numpy as np import matplotlib.pyplot as plt import seaborn as sns import random# 设置中文字体为宋体,英文字体为 times new roman sns.set(font"SimSun", style"ticks", fo…

Vue.js 教程

Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。 Vue 只关注视图层, 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 阅读本教程前,您需要了解的…

利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等

本文介绍通过MultCloud平台,在国内实现谷歌Drive、OneDrive、百度网盘等不同云盘之间数据的传输、共享等操作的免费方法。 有的时候,我们希望对自己不同网盘之间的数据加以传输、共享;例如,我们可以将自己谷歌Drive中的数据&#…

贪心法之活动安排问题

问题: 给定n个活动,每个活动有一个开始时间si和结束时间fi,选择出最大的互不相容的活动 集合。 思路: 将所有活动按照结束时间从小到大排序。 选择第一个活动,并将其加入最终的选择集合中。 依次考虑剩余的活动&#x…

antdesignpro实现滚动加载分页数据

原理解析:每滚动一次相当于翻页,请求后端时给的页码参数要想办法加1,后端才能根据页码给出相应数据 注意后端收到页码参数之后要准确计算出每页的首行数据,关键逻辑代码: # 根据前端传的页码,进行计算下一…

芯片到底是怎么访问外设

微型计算机的组成:CPURAM硬盘等 什么是FLASH? FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NV…

MACBOOK 通过iterm2连接堡垒机跳转服务器

本公司是通过齐治堡垒机连接远程服务器的环境,因为连接过程中需要自动输入密码和选择主机,所以要使用expect工具,编写expect脚本remote.exp #!/usr/bin/expectif { $argc ! 7 } {send_user "usage: expect $argv0 \[JUMP_HOST\] \[JUM…

spring基于Xml管理bean---Ioc依赖注入:对象类型属性赋值(1)----外部bean的引入(bean和bean之间的引入)

文章目录 注入普通属性的方式1、set方法注入2、构造器(构造方法)注入 总结:注入对象类型属性 注入普通属性的方式 1、set方法注入 2、构造器(构造方法)注入 总结: set方法注入和构造器方法的注入&#…

java并发编程八 CAS 与 volatile和原子整数与原子引用

文章目录 CAS 与 volatile慢动作分析volatile为什么无锁效率高CAS 的特点 原子整数原子引用不安全实现安全实现-使用锁安全实现-使用 CAS CAS 与 volatile 在java并发编程七六中,可以看到的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线…

Ubuntu 22.04.3 Server通过修改yaml配置文件方法设置静态IP

目录 1.查看网卡信息 2.修改yaml配置文件 3.应用新的网络配置 4.重新启动网络服务 文章内容 本文介绍Ubuntu 22.04.3 Server系统通过修改yaml配置文件配置静态 ip 的方法。 1.查看网卡信息 使用ifconfig命令查看网卡信息获取网卡名称​ 如果出现Command ifconfig not fo…

3.[BUUCTF HCTF 2018]WarmUp1

1.看题目提示分析题目内容 盲猜一波~ : 是关于PHP代码审计的 2.打开链接,分析题目 给你提示了我们访问source.php来看一下 大boss出现,开始详细手撕~ 3.手撕PHP代码(代码审计) 本人是小白,所以第一步&…

首涂第二十八套_新版海螺M3多功能苹果CMSv10自适应全屏高端模板

首涂第二十八套_新版海螺M3多功能苹果cmsv10自适应全屏高端模板 多功能苹果cmsv10自适应全屏高端模板开源授权版 这是一款带“主题管理系统”的模板。这是一款好模板。 花大价钱收购了海螺这两个模板的版权。官方正品,非盗版。关闭域名授权 后台自定义菜单 请把…

Wavesurfer.js绘制波形图

HTML使用Wavesurfer.js 要使用wavesurfer.js,首先需要在HTML文件中引入Wavesurfer.js库,然后创建一个音频元素并将其添加到页面中。接下来,初始化Wavesurfer实例并配置相关选项。以下是一个简单的示例: 在HTML文件中引入Wavesurf…

【音视频】Mesh、Mcu、SFU三种框架的总结

目录 三种网络场景介绍 【Mesh】 【MCU】(MultiPoint Control Unit) 【SFU】(Selective Forwarding Unit) 三种网络架构的优缺点 Mesh架构 MCU架构(MultiPoint Control Unit) SFU架构(Selective Forwarding Unit) 总结 参考文章 三种网络场景介绍 【Mesh】 Mesh架构…

【计算机网络】TCP心跳机制、TCP粘包问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

electron使用electron-builder进行MacOS的 打包、签名、公证、上架、自动更新

一、前言 由于electron在macOS下的坑太多&#xff0c;本文不可能把所有的问题都列出来&#xff0c;也不可能把所有的解决方案贴出来&#xff1b;本文也不太会讲解每一个配置点为什么要这么设置的原因&#xff0c;因为有些点我也说不清&#xff0c;我尽可能会说明的。所以&…

<软考高项备考>《论文专题 - 24 整合管理(2) 》

3 过程2-制订项目管理计划 3.1 问题 4W1H过程1-制定项目章程做什么定义、准备和协调项目计划的所有组成部分&#xff0c;并把它们整合为一份综合项目管理计划的过程&#xff1b;作用&#xff1a;生成一份综合文件&#xff0c;用于确定所有项目工作的基础及其执行方式为什么做…

dotnet命令创建C#项目,VSCode打开

在命令行中创建项目并运行 1.首先安装.net 下载地址:.NET | 构建。测试。部署。 2.在 cmd 控制台输入 dotnet --vesion 检查版本号是否正常 3.我用git bash环境输入命令创建项目 // 创建文件夹 mkdir MyVSCode // 进入该文件夹 cd MyVSCode/ // 创建控制台项目 dotnet …

03-基于GEC6818开发板实现BMP图片的加载——实例分析

03-基于GEC6818开发板实现加载一张图片 实现基于GEC6818开发板实现加载一张BMP文件。其中详细解析了一张BMP格式图的内容。 其他相关GEC6818开发板的内容可以参考 01-基于粤嵌GEC6818实现屏幕的显示固定颜色进行自动切换 02-基于GEC6818开发板的画正方形、画圆的操作——使用mm…