曾国藩:一勤天下无难事

ES集群节点维护

2019.03.14

写在前边的话

由于生产环境需要,现将ES集群节点进行精减维护,以下为具体操作步骤: >注:操作时请使用root权限执行

数据迁移

ES集群运行中,每个节点数据都是平均的,下线维护一个节点,先把该节点数据迁移到其他节点,避免发生意外。 以下使用Kibana进行操作。

例如,如果准备对172.31.1.34节点做维护

  • 迁移命令如下:

    PUT _cluster/settings
    {
    "transient": {
        "cluster.routing.allocation.exclude._ip": "172.31.1.34"
    }
    }
    
  • 迁移后进行查看:

    GET _cluster/settings
    

    返回以下内容:

    {
    "persistent": {},
    "transient": {
        "cluster": {
        "routing": {
            "allocation": {
            "enable": "all",
            "exclude": {
                "_ip": "172.31.1.34"
            }
            }
        }
        }
    }
    }
    

这样172.31.1.34节点数据会逐步迁移到其他数据节点。最后该节点会保留一个searchguard副本,这个是正常的。根据数据量大小迁移完成时间也不一样,等待完成后可继续操作。

修改开机启动项

  • 目的:

    防止启动挂载错误的磁盘,执行错误的定时任务。

  • 具体步骤:

    vim /etc/fstab
    
    crontab -e
    

    将以上两个位置/es挂载点注释。

容器备份

  • 目的:

    防止出问题时候重建本机,保存2两条命令

  • 具体步骤:执行history,把es镜像及启动历史命令记录下来。

    docker pull index.alauda.cn/alaudaorg/elasticsearch-basic-http:v20181001.003257
    
    docker run -d --name elasticsearch5 --restart=always --log-driver=json-file --net host -v /es/data:/esdata -e HOST_IP=172.31.1.32 -e NODE_MODEL="data" -e ES_JAVA_OPTS="-Xms31g -Xmx31g" -e ALAUDA_ES_TTL=7d -e ALAUDA_ES_CLUSTERS="172.31.1.40,172.31.1.41,172.31.1.42" -e ALAUDA_ES_USERNAME="xxxxx" -e ALAUDA_ES_PASSWORD=xxxx -e ALAUDA_ES_SHARDING=20 -e ALAUDA_ES_EXPECTED_NODE=14 -e ALAUDA_ES_MASTER_NODE=3 index.alauda.cn/alaudaorg/elasticsearch-basic-http:v20181001.003257
    
  • 核对:

    执行docker ps, 运行的ES版本镜像与历史命令对比,重点核对ES的版本一致即可。

停止容器

  • docker ps记录容器id
  • docker stop 容器id

更换服务器规格

登陆AWS管理界面。停止ES实例,修改服务器规格,把r4.4xlarge修改为r4.2xlarge。如果主机挂载了es额外硬盘,修改为新硬盘。

稳妥方式先创建新的数据磁盘挂载到/es目录,然后再删除原来数据磁盘。新建的磁盘需要格式化为ext4后挂载到/es。

重启后登陆服务器,首先停止ES容器(因为ES容器是开机自启动的) 格式化新磁盘并进行挂载:

mkfs.ext4 /dev/xvdg
mount /dev/xvdg /es/

最后启动ES实例。

配置ES上线

启动ES容器后用docker logs查看日志,载kibana确认节点加入集群。登陆kibana管理端,查询:

get _cluster/settings

{
"persistent": {},
"transient": {
    "cluster": {
    "routing": {
        "allocation": {
        "enable": "all",
        "exclude": {
            "_ip": "172.31.1.34"
        }
        }
    }
    }
}
}

更新节点目前不分片分片数据。重新加入集群后,恢复分片数据,命令:

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

以下返加True为正确

{
"acknowledged": true,
"persistent": {},
"transient": {
    "cluster": {
    "routing": {
        "allocation": {
        "exclude": {
            "_ip": ""
        }
        }
    }
    }
}
}

再次查询发现已经没有不可用的节点

GET _cluster/settings

{
"persistent": {},
"transient": {
    "cluster": {
    "routing": {
        "allocation": {
        "enable": "all",
        "exclude": {
            "_ip": ""
        }
        }
    }
    }
}
}

执行完毕,触发ES的数据再平衡,索引数据会从其他节点重新分配给该节点。多观察。直到各节点shard数一致。

恢复开机启动项

    vim /etc/fstab
    crontab -e
    >将盘符修改为新盘符

至此一个节点从r4.4xlarge变更为r4.2xlarge。