停止服务和终止守护进程确实是关闭节点的正确方法。但是,如果您想要关闭节点进行维护,则不建议直接执行此操作。事实上,如果你没有副本,你就会丢失数据。
当你直接关闭一个节点时,Elasticsearch会等待1m (默认时间)让它恢复在线。如果没有,那么它将开始将碎片从该节点分配到浪费大量IO的其他节点。
一种典型的方法是通过执行以下命令暂时禁用分片分配:
代码语言:javascript运行复制PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}现在,当您关闭一个节点时,ES不会尝试将该节点的分片分配到其他节点,您可以执行您的维护活动,然后一旦节点启动,您可以再次启用分片分配:
代码语言:javascript运行复制PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}来源:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/restart-upgrade.html
如果不是所有的索引都有副本,那么执行这种类型的活动将会使一些索引停机。在这种情况下,一种更简洁的方法是在关闭节点之前将所有分片迁移到其他节点:
代码语言:javascript运行复制PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}这会将所有分片从10.0.0.1移动到其他节点(根据数据的不同需要时间)。完成所有操作后,您可以杀死该节点,执行维护并使其恢复在线。这是一个较慢的操作,如果您有副本,则不需要此操作。
(使用通配符代替_ip、_id和_name就可以了。)
更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/allocation-filtering.html
其他答案已经解释了如何终止进程。