粗糙一点的做法就是直接进程杀死并重启
ps -ef|grep elasticsearch # 查看es的进程号
kill -9 ${pid} # 直接杀死es进程
cd ${elasticsearch}/bin # 进入es的bin目录下
./Elasticsearch -d # 启动ES服务
但是这样做会导致节点丢失,节点变成Yellow状态,数据不一致等问题,而且要求每个索引文档都必须要有副本!否则会导致该索引健康状态变成Red从而致使搜索无法使用
下面正题开始
1. 设置索引副本数为0
PUT 索引/_settings
{
"number_of_replicas": 0
}
原因在第三步解释
2. 设置ES节点不接受分片分配
curl -X PUT http://127.0.0.1:9200/_cluster/settings?pretty -d '{"transient": {"cluster.routing.allocation.enable": "none"}}'
或者在kibana执行命令
PUT /_cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}
原因下一步解释
3. 移动分片到其它ES节点
POST _cluster/reroute
{
"commands": [
{
"move": {
"index": "${索引}",
"shard": ${分片下标},
"from_node": "${原ES节点}",
"to_node": "${新ES节点}"
}
}
]
}
现在来解释为啥要设置副本数为0,并且节点不接受分片分配
1.设置副本数为0是为了让节点下线后,集群状态能更快恢复到Green,因为有副本数的存在容易导致负载不均衡问题,而且副本的存在会导致集群恢复Green的速度变慢
2.设置当前ES节点不分配分片是为了当副本数为0时,该ES节点下线后不会导致集群里因为不存在该节点拥有的索引而致使索引状态变成Red进而导致搜索直接挂掉
4. 重启ES节点
ps -ef|grep elasticsearch # 查看es的进程号
kill -9 ${pid} # 直接杀死es进程
cd ${elasticsearch}/bin # 进入es的bin目录下
./Elasticsearch -d # 启动ES服务
5. 重新将ES节点设置为接收分片平衡
curl -X PUT http://127.0.0.1:9200/_cluster/settings?pretty -d '{"transient": {"cluster.routing.allocation.enable": "all"}}'
或者在kibana执行命令
PUT /_cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "all"
}
}
6. 等到集群恢复到Green后重复2~4步骤重启其它ES节点
7. 恢复到原先的副本数
目前我司的集群只有3个ES节点,不到10个的索引,所以整个过程不会太过繁琐
但是如果数据量更大或者集群更大,建议参考官方文档
参考文档:
官网: https://www.elastic.co/guide/en/elasticsearch/reference/7.x/restart-upgrade.html PS:记得切换到自己使用的版本查看文档
如果帮到你,请点个赞吧 O(∩_∩)O~