如何配置Elasticsearch将索引分片副本固定分配到指定按需节点
配置步骤
步骤1:给节点打自定义标签
首先编辑on-demand节点的elasticsearch.yml配置文件,添加自定义属性标识节点类型:
node.attr.node_type: on_demand
你也可以给2台spot实例添加对应的标签方便后续规则匹配:
node.attr.node_type: spot
修改完成后逐个重启节点(注意先重启数据节点最后重启主节点,避免集群脑裂),重启后执行以下命令验证标签是否生效:GET _cat/nodeattrs?v
返回结果中如果能看到on-demand节点的attr列显示node_type、value列显示on_demand即为配置成功。
步骤2:配置分片分配规则
存量索引批量配置
执行以下请求给所有已存在的索引添加分配规则,要求每个索引至少有一个分片(主/副均可)分配到on-demand节点:
PUT /*/_settings { "index.routing.allocation.include.node_type": "on_demand" }
如果需要严格要求副本必须落在on-demand节点,你可以调整规则为:
PUT /*/_settings { "index.routing.allocation.require.node_type": "on_demand", "index.routing.allocation.total_shards_per_node": 1 }
新建索引自动生效(推荐)
创建全局索引模板,后续所有新建的索引会自动继承该规则,无需重复配置:
PUT _index_template/force_on_demand_replica { "index_patterns": ["*"], "priority": 150, "template": { "settings": { "number_of_replicas": 1, "index.routing.allocation.include.node_type": "on_demand" } } }
步骤3:验证配置结果
执行以下命令查看所有分片的分布情况,确认每个索引都至少有一个分片在on-demand节点上:GET _cat/shards?v
注意事项
- 提前评估on-demand节点的存储、内存资源,确保可以承载所有索引的至少一个分片,避免节点过载
- 如果你的集群索引副本数大于1,ES会自动保证至少一个副本落在on-demand节点,其余副本可正常分配到spot实例
- spot实例被回收后,集群会自动在剩余节点补全缺失的分片副本,不会出现数据丢失的情况
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

