当你想停用 Elasticsearch 中的节点时,通常的过程不是直接销毁节点。 如果你这样做,那么你就有数据丢失的风险,这不是你想要对应该是可靠的数据库做的事情。
这样做的问题是,节点很可能会通过 Elasticsearch 处理的恰当命名的分片分配分配给它们的分片。
Elasticsearch 中的 master 负责分片分配以及何时在节点之间移动分片以重新平衡集群。
那么随着这一切的进行,如何才能停用 Elasticsearch 节点呢? 是不是太冒险了?
幸运的是,有一种方法,叫做集群级分片分配过滤。
通过集群级别的分片分配过滤器,你可以控制 Elasticsearch 从任何索引为整个集群分配分片的位置。
你可以通过 Cluster API 设置这些过滤器; 具体来说,你可以对 _cluster/settings 端点执行 PUT 请求。
假设你要停用 IP 地址为 10.0.0.1 的节点。
为此,你将使用以下命令在集群上执行 PUT 请求:
PUT _cluster/settings
{
“persistent” : {
“cluster.routing.allocation.exclude._ip” : “10.0.0.1”
}
}
然后,Elasticsearch 将知道移动与此匹配的节点分片。 你应该看到分片将变为 0。
当它们确实变为 0 时,就可以安全地停用该节点。
不过,按 IP 地址排除并不是唯一的过滤方式。 事实上,有许多属性可以用来排除。
这是一个列表:
- _name:可以通过节点名匹配节点
- _host_ip:可以通过主机IP地址匹配节点(IP与主机名相关联)
- _publish_ip:可以通过发布 IP 地址匹配节点
- _ip:你可以匹配 _host_ip 或 _publish_ip
- _host:可以通过主机名匹配节点
- _id:可以通过节点 id 匹配节点
- _tier:可以通过节点的数据层角色匹配节点
你可以做的另一件很酷的事情是在您的过滤器中使用通配符来进行集群级别的分片分配。
例如,假设你想排除所有匹配前缀 myfirstdatabase 的 Elasticsearch 节点。
你可以这样做:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.exclude._name": "myfirstdatabase*"
}
}
因此,名为 myfirstdatabase-1 的节点将被排除在分片分配之外,myfirstdatabase-2 也是如此。