Elasticsearch单节点集群扩展及旧节点平滑下线方案咨询
实现流程
阶段1:新节点环境部署与预配置
- 3台新服务器全部安装和旧集群版本完全一致的7.5.0版本Elasticsearch,版本不匹配会直接导致节点加入失败
- 确保新旧节点之间9200、9300端口互通,无防火墙/安全组限制
- 修改所有节点(包括旧节点
elk-old)的elasticsearch.yml配置:- 旧节点新增配置:
node.attr.storage: old,修改完成后重启旧节点ES服务 - 3台新节点统一配置:
cluster.name: elasticsearch和旧集群名称保持完全一致node.attr.storage: new标记为新存储节点discovery.seed_hosts: ["旧节点IP地址"]配置旧节点为集群发现种子- JVM堆内存设置为31G左右,不超过32G,其余内存、线程等配置和旧节点对齐
- 旧节点新增配置:
- 逐个启动新节点的ES服务,执行
GET _cat/nodes?v确认3台新节点全部成功加入集群,集群整体状态为green
阶段2:配置分片分配规则,实现新旧索引分片隔离
- 执行以下API创建全局索引模板,要求所有后续新建的索引分片全部分配到打了
storage: new标签的新节点上:
PUT _template/new_index_allocation { "index_patterns": ["*"], "order": 100, "settings": { "index.routing.allocation.require.storage": "new" } }
- 执行以下API批量给所有存量旧索引设置分片锁定规则,禁止存量分片迁移到新节点:
PUT /*/_settings { "index.routing.allocation.require.storage": "old" }
- 执行
GET _cluster/health?v确认集群状态为green,无异常分片迁移任务,此时新写入的索引都会落在新节点,存量索引全部留在旧节点,读写服务不受任何影响
阶段3:规则有效性验证
- 新建一个测试索引,执行
GET 测试索引名/_settings确认索引配置自动带上了index.routing.allocation.require.storage: new的规则 - 执行
GET _cat/shards/测试索引名?v确认测试索引的分片全部分布在3台新节点上,分配规则生效 - 随机查询几个存量旧索引的数据,确认读取服务正常,旧索引分片未发生迁移
阶段4:1个月后旧节点下线操作
等1个月后存量旧索引已经被预设的生命周期规则自动删除完毕后,执行以下操作下线旧节点:
- 执行集群分片排除规则,把旧节点从集群分配列表中移除,若存在漏删的少量索引,集群会自动将对应分片迁移到新节点:
PUT _cluster/settings { "transient": { "cluster.routing.allocation.exclude._name": "elk-old" } }
- 执行
GET _cat/shards?v确认所有分片都已经不在elk-old节点上 - 关停旧节点的Elasticsearch、kibana、apm-server服务即可
- 清理集群的旧节点排除规则:
PUT _cluster/settings { "transient": { "cluster.routing.allocation.exclude._name": null } }
- 按需修改kibana、apm-server的配置,将ES访问地址切换为新节点地址即可
内容的提问来源于stack exchange,提问作者supportth
相关产品推荐
相关产品推荐

