默认是会用kibana的。下边的命令都是在kibana上执行的。

描述

我们对集群进行了升级,虽然已经将全部的数据都迁移到了新的集群上,但是由于之前文档不够充分,我们不能百分之百的保证之前的旧集群没有在使用。所以我们采用新老集群三个月内并存的方案。先直接退出两台机器,将数据分到其他的机器上。然后再关闭集群。只使用新集群,如果业务受到影响,就将旧集群恢复重启。

由于旧集群占用了过多的机器资源(六台机器,800G的内存),所以我们想要将机器从中释放两台。

注意事项

想要将机器退出集群,或者将节点退出集群。都应该关注一个问题,就是该节点是否是 master节点。比方说集群配置了最少需要三个具有master资格的节点。集群只有三个具备master资格的节点。此时你将一个master节点退出了,那么集群就失去了可用性。整个集群就完全不能使用了。

want 将节点退出集群
    if(是master节点){
        if(一定要退出master这个节点){
            需要重新修改集群的配置,配置该节点不具备master节点的资格。然后再重启集群,此时这个            节点就不是master节点了。可以退出。
        }else{
            选其他的非master节点退出
        }
    }
想要修改 master的个数:参考文章

https://blog.csdn.net/u011598442/article/details/104725953?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

两套方案

  1. 利用es的自动恢复的机制。通过关闭集群中的机器,让master节点,自动的恢复。这个前提是需要机器有至少一个副本,才能保证不丢数据。
  2. 将机器排除到注册表之外。这种方案好处是不影响线上的继续使用,操作方便。只需要执行一个命令,剩下的就交给集群自己来完成。

方案一

步骤1:暂停数据写入程序
步骤2:关闭集群shard allocation

关闭集群分片自动分配

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}
步骤3:手动执行POST /_flush/synced

打开集群分片自动分配
POST /_flush/synced

步骤4:重启结点
步骤5:重新开启集群shard allocation

#打开集群分片自动分配
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}

步骤6:等待recovery完成,集群health status变成green
步骤7:重新开启数据写入程序

方案二

一开始的时候,我从官网上看到的这个api,担心es只是将这个台机器给排除在集群之外,会丢失数据。实际上不是,在调用这个api的时候,其实es不仅将这台机器给排除在外,并且将这上边的分片给分配到其他的节点上去了。
我在测试集群上进行了实验。测试通过以后,再在集群上进行操作最后成功将一台机器给分离出去。

操作步骤就一个,直接在kibana上执行下边的命令。

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

补充说明:因为我的需求是将一台机器完全的分离出去。所以我在调用api的时候,是直接将某个ip的节点全部从注册表剔除。
es 官网api给我们提供的还包括:将某个名字的节点给剔除出去。注意,如果你想把多个节点踢出去,这个api,只能一个一个踢出,踢出完了以后,还要吧节点停了。否则你先踢出了一个,然后踢出了第二个,第二个的分片还会到第一次踢出的节点上。

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "{nodeName}"
  }
}
方案实施以及结果

最终采用第二套方案,因为我们的集群是没有副本的。不能使用第一个种方案。
第二种方案也更简单一点

结果展示:可以看到我们 254机器上已经没有任何数据了

再来看一下有数据的节点(其他正常使用的ip):

看到节点上没有数据了以后,就可以将集群上的es实例给关闭了
最终看到结果

如何查看节点上有没有数据了:
先再kibana上点击左侧监控,然后点击右侧 Nodes 进去

然后再点击:进去就可以看到上边截图的数据了

第二种方案的参考文档

可以查看es官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.9/voting-config-exclusions.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐