ES生产集群部署之针对集群重启时的shard恢复耗时过长问题定制的重要参数

探讨ES集群重启时shard重分配问题,分析默认配置下资源浪费现象,提出配置调整方案,如gateway.recover_after_nodes与gateway.expected_nodes参数,以减少网络磁盘负担,加速集群恢复。


shard recovery配置以及集群重启时的无意义shard重分配问题

在集群重启的时候,有一些配置会影响shard恢复的过程。首先,我们需要理解默认配置下,shard恢复过程会发生什么事情。如果我们有10个node,每个node都有一个shard,可能是primary shard或者replica shard,你有一个index,有5个primary shard,每个primary shard有一个replica shard。如果我们将整个集群关闭了进行一些维护性的操作,比如给机器安装新的磁盘之类的事情。当我们重启集群的时候,肯定节点是一个接一个的启动的,可能会出现5个节点先启动了,然后剩下5个节点还没启动。

也许是因为剩下的5个节点没来得及启动,或者是因为一些原因耽搁了,总之不管是什么原因,就是现在只有5个节点是在线的。这5个节点会通过gossip协议互相通信,选举出一个master,然后组成一个集群。他们会发现数据没有被均匀的分布,因为有5个节点没有启动,那么那5个节点上的shard就是不可用的,集群中就少了一半的shard。此时在线的5个node就会将部分replica shard提升为primary shard,同时为每个primary shard复制足够的replica shard。

最后,可能剩下的5个节点加入了集群。但是这些节点发现本来是他们持有的shard已经被重新复制并且放在之前的5个node速度回当了,此时他们就会删除自己本地的数据。然后集群又会开始进行shard的rebalance操作,将最早启动的5个node上的shard均匀分布到后来启动的5个node上去。

在这个过程中,这些shard重新复制,移动,删除,再次移动的过程,会大量的耗费网络和磁盘资源。对于数据量庞大的集群来说,可能导致每次集群重启时,都有TB级别的数据无端移动,可能导致集群启动会耗费很长时间。但是如果所有的节点都可以等待整个集群中的所有节点都完全上线之后,所有的数据都有了以后,再决定是否要复制和移动shard,情况就会好很多。

所以现在问题我们已经知道了,那么我们就可以配置一些设置来解决这个问题。首先我们需要设置一个参数,gateway.recover_after_nodes: 8。这个参数可以让es直到有足够的node都上线之后,再开始shard recovery的过程。所以这个参数是跟具体的集群相关的,要根据我们的集群中节点的数量来决定。此外,还应该设置一个集群中至少要有多少个node,等待那些node的时间:gateway.expected_nodes: 10,gateway.recover_after_time: 5m。经过上面的配置之后,es集群的行为会变成下面这样,等待至少8个节点在线,然后等待最多5分钟,或者10个节点都在线,开始shard recovery的过程。这样就可以避免少数node启动时,就立即开始shard recovery,消耗大量的网络和磁盘资源,甚至可以将shard recovery过程从数小时缩短为数分钟。
 

### 重启过程中主分片不可用的常见原因及解决方法 在 Elasticsearch 集群重启过程中,如果出现 `primary shard is not active` 错误,通常表示集群未能在预期间内恢复主分片的状态。这种情况可能导致索引不可用或数据写入失败。 #### 主要原因分析 1. **节点启动延迟** 在集群重启,部分节点可能由于系统资源不足、磁盘 I/O 慢或 JVM 初始化耗时较长而无法及加入集群。Elasticsearch 默认等待主分片激活的间为 30 秒,若在此期间节点仍未完成恢复,就会触发该错误[^1]。 2. **分片恢复配置不当** 默认情况下,Elasticsearch 启动会并行恢复多个分片(由 `cluster.recovery.initial_shards` 控制)。如果设置值过高,可能导致资源竞争加剧,影响恢复效率。例如,初始恢复策略设为 `quorum` 或 `full_cluster` ,需确保所有节点同步完成才能继续,这在大规模集群中尤为明显[^4]。 3. **磁盘路径或权限问题** 如果某个节点的 `path.data` 目录损坏、权限不正确或未正确挂载,将导致分片数据无法加载,进而使主分片处于非活动状态。可以通过检查日志中的 `java.io.FileNotFoundException` 或 `AccessDeniedException` 来确认此类问题[^1]。 4. **内存锁定配置问题** 若启用了 `bootstrap.memory_lock: true` 但未正确配置系统限制(如 `ulimit`),可能导致 Elasticsearch 启动失败,从而影响主分片的恢复过程。此应参考官方文档调整内存锁定设置,并确保系统允许足够的内存锁定能力[^1]。 --- ### 解决方案与优化建议 1. **延长分片恢复间** 可通过增加以下参数来延长等待主分片恢复间: ```yaml cluster.recovery.initial_shards: 2 cluster.routing.allocation.node_concurrent_recoveries: 2 ``` 这有助于避免因节点初始化较慢而导致主分片未激活的问题。 2. **优化分片恢复并发数** 调整 `cluster.routing.allocation.node_initial_primaries_recoveries` 参数以控制每个节点同恢复的主分片数量,防止资源争用。例如: ```yaml cluster.routing.allocation.node_initial_primaries_recoveries: 4 ``` 此设置可提升恢复效率,尤其适用于拥有大量索引的场景[^4]。 3. **检查并修复磁盘与权限问题** 确保所有节点的 `path.data` 目录具有正确的读写权限,并且磁盘空间充足。可通过以下命令检查磁盘使用情况: ```bash df -h /path/to/data ``` 若发现磁盘空间不足,应及清理旧索引或扩展存储容量。 4. **手动重新路由未分配分片** 对于长间未恢复的分片,可以使用 `_cluster/reroute` API 强制将其分配到指定节点: ```json POST _cluster/reroute { "commands": [ { "allocate_stale_primary": { "index": "your_index_name", "shard": 0, "node": "node_name", "accept_data_loss": false } } ] } ``` 该操作适用于已知副本数据“过期”但仍希望保留的情况,但需谨慎使用以避免数据丢失风险。 5. **监控集群健康状态** 使用 `_cluster/health` API 实监控集群状态,关注 `active_primary_shards` 和 `initializing_shards` 字段的变化: ```bash GET _cluster/health?pretty ``` 若发现主分片长间处于初始化状态,可能需要进一步排查节点性能瓶颈或网络通信问题。 6. **优化索引配置** 合理设置索引的主分片和副本分片数量,避免过多分片增加恢复负担。例如: ```json PUT /my-index { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } } ``` 分片数量应在创建索引前根据数据规模和查询需求进行合理规划。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值