如何不重启(不停机)Elasticsearch集群节点的情况下更换Elasticsearch集群节点角色

本文介绍了如何在不停机的情况下,将Elasticsearch数据节点转换为仅主节点。通过elasticsearch-node repurpose命令,可以在下线节点后进行角色转换,清理数据并重新启动,实现角色变更,避免数据丢失。
摘要由CSDN通过智能技术生成

一般操作方式(更换data节点角色需要重启)

正常情况下如果节点不包含data角色,没存数据,可以直接更换节点角色,如果节点上有数据就很麻烦,一般情况下需要将该节点通过以下api驱逐数据(支持*通配符)

PUT _cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.exclude._ip" : "192.168.2.*"
  }
}

直到当前节点上分片数为0才可以修改节点角色,然后重启该节点
当下面api执行结果不显示这个节点的ip时就说明数据已经全部迁移到其他节点

GET _cat/shards?v&h=ip

确认节点角色,可以通过下方接口查看

GET _nodes

推荐方式(更换data节点角色无需重启)

问题细节:

线上环境有4个节点,单节点为48核的物理机,252G的内存。

数据每日增量不大,累计数据就一个TB左右。数据的类型为文书类数据。

核心数据就一个索引,设置了48个分片。

只设置了一个主节点(同时是数据节点),其余三个仅数据节点。

2、问题解读

抛开节点配置、集群部署层面的问题。

问题转化为:主节点&数据节点角色的节点如何转化为仅主节点?

3、模拟一把

3.1 构建模拟环境

模拟环境:4核、8GB 云服务器,Elasticsearch 7.12.0 版本 四节点。

node-022:主节点&数据节点

node-023:仅数据节点

node-024:仅数据节点

node-025:仅数据节点

集群部署完成未导入任何数据截图如下:

3.2 构造数据

基于 kibana 样例数据(kibana_sample_data_ecommerce)构建索引。

新索引 kibana_sample_data_ecommerce_02

主分片数:48

副本分片数:1

Mapping 和数据:

同 kibana_sample_data_ecommerce 保持一致。

索引数据迁移基于 reindex 实现。

POST _reindex
{
  "source": {
    "index": "kibana_sample_data_ecommerce"
  },
  "dest": {
    "index": "kibana_sample_data_ecommerce_02"
  }
}

数据构造完毕后,截图如下:

3.3 节点角色变化实战
这里有个前提:能不能不停机转换节点角色?

看我们开篇的节点角色划分是没戏了。仅一个主节点,且更换角色的节点也是主节点。

3.3.1 步骤 1:将主节点&数据节点 node-022 的属性改为仅主节点。
修改 elasticsearch.yml 的节点属性配置部分,如下:

node.master: true
node.data: false

3.3.2 步骤 2:下线 主节点&数据节点 node-022。
kill 掉对应的 elasticsearch 进程即可。

3.3.3 步骤 3:重新启动 主节点&数据节点 node-022。
启动主节点后,报错如下:

What?elasticsearch-node repurpose 是什么鬼?

3.3.4 步骤 4:执行 elasticsearch-node repurpose 实现角色转换前处理工作。

bash-4.2$ ./bin/elasticsearch-node repurpose
 
 
    WARNING: Elasticsearch MUST be stopped before running this tool.
 
... ...
Found 29 shards in 6 indices to clean up
Use -v to see list of paths and indices affected
Node is being re-purposed as master and no-data. Clean-up of shard data will be performed.
Do you want to proceed?
Confirm [y/N] y
Node successfully repurposed to master and no-data
 

以上指令及返回结果解读如下:

(1)执行 elasticsearch-node repurpose 的前置条件是:当前节点已被停用。

(2)节点角色转换为仅主节点(确切的说是:候选主节点)。

(3)当输入 y 确认后,清理了 6 个索引(含 29 个分片)的数据。

3.3.5 步骤5:再次启动主节点 node-022
这时候,节点能正常启动。

同时,其余节点会再建立与主节点 node-022 的连接。

节点分片会被重新分配,本质是:原有主节点上关联的副本分片提升为主分片,主分片再重新生成对应的副本分片。

查看下主节点角色,如下 node-022 变成了:仅主节点角色,已没有数据节点角色。

至此,主节点&数据节点变成了仅主节点。

3.3.6 角色变换小结
第一:仅需要下线主节点,其他节点可以保持原有状态,无需下线。

第二:需要借助:elasticsearch-node repurpose 实现角色转换。

4 elasticsearch-node repurpose 原理
4.1 elasticsearch-node 上线版本
7.0.0 版本,也就意味着:7.0 之前的版本不具备该功能。

https://github.com/elastic/elasticsearch/pull/37979

4.2 elasticsearch-node repurpose 全局视角

4.3 elasticsearch-node 工具作用
以下是官方文档翻译:

可以在节点关闭时对它们执行某些不安全的操作。通过此命令可以调整节点的角色,不安全地编辑集群设置,并且即使灾难(disaster,集群异常)与磁盘上的数据不兼容,也可以在灾难(disaster)后恢复某些数据或启动节点。

https://www.elastic.co/guide/en/elasticsearch/reference/current/node-tool.html

4.4 elasticsearch-node 工具用法
能实现的功能有很多,支持的参数也有好几个,诸如:

repurpose

remove-settings

remove-customs

unsafe-bootstrap

detach-cluster

override-version

篇幅原因,建议直接参看官方文档。

我们契合本文主题,只讲解一下更换角色命令的使用。

4.5 elasticsearch-node repurpose 用法详解
elasticsearch-node repurpose 的作用:如果节点曾经是数据节点或候选主机节点,但已被重新设计为不具有其中一个角色或改为其他角色,则可用于从节点中删除不需要的数据。

核心用途一句话概括:更改节点角色、删除不必要的数据。

使用该命令的核心四个步骤:

步骤 1:停止需要更换角色的节点。

步骤 2:通过 elasticsearch.yml 更新节点角色。

步骤 3:执行 elasticsearch-node repurpose。

步骤 4:重新启动节点。

文中 3.3 节的实现就是用的这四个步骤。

提示:

1、要删除索引数据,所以会有交互提示,输入“y“代表确认删除。

2、会保留 meta 元数据信息,确保集群可用。

5、小结
类似问题,广靠猜没有用,实际操作一把,会发现“新大陆”。

之前我也不知道,7.X 版本的这个 elasticsearch-node 命令行工具非常人性化。

涉及到更换集群节点角色的场景,不妨一试!

欢迎留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少林码僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值