Elasticsearch官方文档翻译-节点离线后的延迟分配
本系列文章翻译ES官方8.0版本文档。本章对应内容地址 Delaying allocation when a node leaves
因为水平有限,翻译内容难免存在错漏,欢迎大家指出
节点离线后的延迟分配
当节点因为某些原因离线时,主节点会执行如下操作;
- 如果该离线节点存在主分片,则提升其他节点上的副分片为主分片。
- 分片该离线节点上的分片到其他节点。
- 再均衡余下节点上的分片。
这些操作旨在通过尽可能快的完成所有副本的设置以防止出现数据丢失的情况。
尽管我们在限制了节点级和集群级的并发恢复,但是如果离线节点短时间内恢复并加入集群就会在集群内部造成不必要的流量开销,如下面的情形
- Node 5离线
- 主节点提升原主分片在Node 5上的副分片为主分片
- 主节点重新分配原Node 5上的分片到其他节点上
- 所有新分配的分片都要通过网络从主分片那复制完整的数据
- 再均衡节点上的分片,很多分片迁移到其他节点
- 几分钟后Node 5恢复,重新加入集群
- 主节点通过再均衡,迁移分片到Node 5
这种情形下,如果主节点等待几分钟,Node 5重新加入集群后再近些分片的再分配,那么这些分片就分配到Node 5上从而减少网络开销。可通过配置index.unassigned.node_left.delayed_timeout 动态设置因节点离线导致的副本分片的延迟分配,其默认值为 1m。这个配置可以为活跃的索引或所有索引设置,如下:
PUT _all/_settings { "settings": { "index.unassigned.node_left.delayed_timeout": "5m" } }
如果开启了延迟分配,那么上面的场景会按出现如下操作:
- Node 5离线
- 主节点提升原主分片在Node 5上的副分片为主分片
- 主节点记录日志包含未分配的副分片将被延迟分配且记录延迟的时间
- 集群状态为yellow,因为存在未分配的分片
- Node 5在delayed_timeout之前恢复并加入集群
- 缺失的分片被重分配给Node 5
分片迁移的取消
如果延迟分配超时,则主节点会将缺失的分片分配到其他节点并开始分片的恢复。如果这时离线的节点恢复并且其分片和主分片有相同的sync-id,那么分片的迁移会取消,并且这个同步的分片会重新启用为副分片。
timeout的默认值设置为1m。即使分片的迁移已经开始,使用同步的分片并取消分片的迁移代价依然更小。
监控延迟分配的分片
使用cluster health API可以查看延迟分片的总数。如下
GET _cluster/health
这个请求会返回因为设置了延迟而未进行分配的分片数量(delayed_unassigned_shards)
永久的移除一个节点
如果一个离线节点不会再恢复并加入集群,并且你希望ES立即进行分片的再分配,那么可以设置timeout为0。如下
PUT _all/_settings { "settings": { "index.unassigned.node_left.delayed_timeout": "0" } }
如果想完成后重新恢复timeout,那么在丢失的分片开始恢复时就可以重新设置该值