什么是集群重平衡
集群重平衡(Cluster Rebalancing) 是Elasticsearch自动调整分片分布的机制,目的是在集群中所有节点间均匀分配分片,以实现:
- 负载均衡
- 存储空间均衡
- 查询性能优化
- 集群资源最大化利用
重平衡触发场景
重平衡通常在以下情况下自动触发:
-
节点变化
- 新节点加入集群
- 节点离开或宕机
- 节点重启
-
分片分布不均
- 某些节点分片过多
- 某些节点存储空间不足
- 新索引创建后的分片分配
-
集群配置变更
- 副本数量调整
- 分片分配规则修改
重平衡设置选项
cluster.routing.rebalance.enable
参数详解
"cluster.routing.rebalance.enable": "all"
可选值说明:
值 | 说明 | 适用场景 |
---|---|---|
all | 允许所有分片重平衡(默认) | 正常运行状态 |
primaries | 只允许主分片重平衡 | 副本恢复时减少负载 |
replicas | 只允许副本分片重平衡 | 主分片稳定时优化副本分布 |
none | 完全禁用重平衡 | 维护期间或紧急情况 |
相关控制参数
1. 重平衡并发控制
"cluster.routing.allocation.cluster_concurrent_rebalance": "2"
- 控制整个集群同时进行重平衡的分片数量
- 数值越大重平衡越快,但消耗更多资源
2. 重平衡阈值设置
"cluster.routing.rebalance.weight.index": "55%"
"cluster.routing.rebalance.weight.shard": "45%"
- 控制何时触发重平衡的阈值
- 基于索引分布和分片数量的权重
3. 磁盘使用阈值
"cluster.routing.allocation.disk.threshold_enabled": true
"cluster.routing.allocation.disk.watermark.low": "85%"
"cluster.routing.allocation.disk.watermark.high": "90%"
- 当磁盘使用率超过阈值时触发重平衡
重平衡过程
1. 评估阶段
├── 分析当前分片分布
├── 计算节点负载差异
└── 确定重平衡目标
2. 决策阶段
├── 选择需要移动的分片
├── 确定目标节点
└── 生成重平衡计划
3. 执行阶段
├── 在目标节点创建分片副本
├── 同步数据
└── 删除原节点分片
实际应用场景
场景1:节点扩容
# 添加新节点后,启用重平衡自动分配分片
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.rebalance.enable": "all"
}
}
场景2:维护期间
# 维护期间禁用重平衡,避免不必要的分片移动
PUT /_cluster/settings
{
"transient": {
"cluster.routing.rebalance.enable": "none"
}
}
场景3:紧急恢复
# 只允许主分片重平衡,优先保证数据可用性
PUT /_cluster/settings
{
"transient": {
"cluster.routing.rebalance.enable": "primaries"
}
}
监控重平衡状态
# 查看重平衡进度
GET /_cat/recovery?v&active_only=true
# 查看分片分布
GET /_cat/shards?v&s=node
# 查看集群健康状态
GET /_cluster/health?level=shards
最佳实践建议
- 正常运行: 保持
"enable": "all"
- 维护期间: 临时设置为
"none"
- 性能调优: 根据集群规模调整并发数量
- 监控告警: 设置重平衡时间过长的告警
- 计划变更: 在业务低峰期进行集群变更操作
重平衡是Elasticsearch自动维护集群健康和性能的重要机制,合理配置这些参数可以显著提升集群的稳定性和性能。