带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (3)

简介: 带你读《Elastic Stack 实战手册》之46:——3.5.5.Shard allocation (3)

《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.5.Shard allocation (2) https://developer.aliyun.com/article/1228684

管理节点

 

系统资源吃紧,需要通过横向扩容增加集群容量。

 

节点扩/缩容

 

当向集群扩容节点时,其他节点会迁移部分分片到新节点,如果并发迁移的分片过多,可能造成瞬时的高 IO 负载,引起服务抖动。

 

我们可以通过 cluster.routing.allocation.node_concurrent_incoming_recoveries 参数控制分片迁移的速度,如果是在集群负载较高的情况下横向扩容新节点,建议分开两步操作:

 

l 关闭 cluster.routing.rebalance.enable (主要是考虑到分片移出后可能会引起集群重平衡操作)

l 通过手动对目标索引进行 index.routing.allocation.include 配置,将新节点纳入到分片的分布范围,逐个迁移索引分片。目的是减少大规模持续的分片迁移,导致集群负载继续升高,甚至发生雪球效应。

 

同样的,在缩容集群时,如果直接关闭节点,可能存在两个风险点:


 

l 在集群规模较大情况下,会有大量索引同时进行分片主从切换和分片重新分配操作,瞬时对 master 节点带来很大的负载,尤其是日志类数据的大集群。因为分片数较多,可能导致

l master 节点 CPU 飙高,使得新创建索引等操作被阻塞

l 小概率情况下。如果其他节点发生意外宕机,索引将存在数据丢失风险。

 

对于类似缩容,存在一定风险性的主动操作,建议与扩容类似,首先设置全部索引的 index.routing.allocation.exclude 或者直接在集群范围内设置 cluster.routing.allocation.exclude 属性将待下线的节点排除,待分片全部移出之后再关闭节点进程。

 

节点重启

 

除了横向扩容外,对节点纵向扩容,或者升级 Elasticsearch 版本,都需要对节点进行重启操作。

 

在重启节点时,自然会有节点的上下线操作,节点下线同时会让该节点所属的分片处于

unassigned 状态。正常情况下,集群会将这些未分配分片,重新分配到集群内其他节点上,在日常运维的节点重启操作中,这显然不是我们期望的,无端的带来了大量的 IO 操作。

 

正常的滚动重启操作中,建议是:

 

l 通过 cluster.routing.allocation.enable: none 关闭分片分配;

l 重启节点;

l cluster.routing.allocation.enable 重置为 all 打开分片分配。

 

调控分片的物理分配

 

因为日志检索方面表现良好,公司决定将商品、订单等系统的检索功能也迁移到 Elasticsearch集群,并提供了高配机器用于集群搭建。

 

分片在单台物理机的分配

 

 

在实际的部署过程中,有时会遇到大容量高配机器,比如 32 核 128GB 内存,我们可以考虑单节点部署,将对内存数据量扩大到 32GB 以上 (一个是对象指针压缩技术不再可用,造成内存空间膨胀,另一个是堆内存回收压力也增大,可能造成 gc 停顿时间变长);

 

也可以考虑单机多节点的部署方式,在这种情况下,为了数据可用性的考虑,索引内同一分片的主副本数据,需要分配到不同的物理节点上,这时可以使用如下参数:

 

l cluster.routing.allocation.same_shard.host

l 阻止同一分片的多个实例 (主副本) 落到同一个主机,同一主机的判定条件为相同的主机名 (host name) 和主机地址 (host address),默认情况下该参数为关闭状态,强烈建议在单机多节点部署的情况打开该配置,避免可能的数据丢失风险。

 

对商品、订单的搜索场景,一般单节点的负载会控制在最大值的 50% 左右,以提供足够的余量来承载瞬时的流量高峰,为了达到这个目的,在分片分配层面,可以设置单节点的分片数上限:

 

l cluster.routing.allocation.total_shards_per_node

l 单节点最多能支撑的分片数,当节点包含的分片数高于该数值时,新分片不会在该节点创建。

 

分片在机房内的分配

 

为了数据高可用的考虑,我们在管理集群的时候,可能会考虑索引的主从分片,不要都落到某一台宿主机,或者同一个机架上,这个时候可以通过一些提示性参数,让集群在选择节点时有一定的倾向性:

 

l cluster.routing.allocation.awareness.attributes

l 设置分片分布时,会考虑将分布交叉分布到属性不同的节点上,比如集群包含两个节点 N1 node.attr.zone=zone1、N2 node.attr.zone=zone2,如果我们在 elasticsearch.yml 中设置cluster.routing.allocation.awareness.attributes: zone,则我们新建带一个副本的索引时,集群会将同一分片的主副本交叉分布在不同的节点上。节点属性可通过上述自定义属性方式设置。

    

l cluster.routing.allocation.awareness.force.zone.values

l 假设集群节点仍然是 N1、N2,如果 N2 因为故障宕机,默认情况下,N2 所属的分片会在 N1 节点重新恢复出来,但是在同一个节点运行相同分片的主副本并没有实际意义,这时我们在 elasticsearch.yml 中设置 cluster.routing.allocation.awareness.force.zone.values: zone1,zone2 来避免这种操作,集群会在 zone2 属性节点恢复后再将相应的副本分片恢复到该节点。

 

集群分片上限

 

系统跑起来了,那么集群最多能负载的分片数是多少呢?

 

对日志类的数据,通常会以应用、时间、日志级别等多个维度建立索引,这样一来集群内的总分片数变得相当可观,那么集群最多能负载的分片数是多少呢?

 

答案也很简单,就是节点数与单个节点能最多能支撑的分片的积,但是这里的单节点最多支撑的分片数:

 

l cluster.max_shards_per_node

l 用于限制整个集群最多能支撑的分片数,当集群内活跃分片数大于 cluster.max_shards_per_node * number_of_data_node 时,集群会阻止新索引的创建,直到有索引被删除或者关闭 (closed) ,使得活跃分片总数低于阈值。这里的活跃分片数是指非 closed 状态的分片,包括 unassigned / initializing / relocating / started。


不会像 cluster.routing.allocation.total_shards_per_node 真正的限制单节点的分片数。

这里列举了部分较为常用的配置,更多参数可以参阅官方文档。

 

小结

 

我们调整或干预集群的分片参数,从根本上说,是为了在集群稳定的情况下将性能最大化,从分片分配 (allocation) 的角度来说,稳定意味着分片尽量少的移动,性能意味着同一个索引的分片尽量均匀分布到各节点,而不要集中到少数几个节点。


《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.5.Shard allocation (4) https://developer.aliyun.com/article/1228681

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
SQL 关系型数据库 MySQL
TiDB亿级数据亚秒响应查询将MySql数据全量迁移到TiDB
TiDB亿级数据亚秒响应查询将MySql数据全量迁移到TiDB
885 0
|
2月前
|
人工智能 缓存 自然语言处理
阿里云Token Plan(团队版)详细介绍:支持模型、价格、使用细则及最新活动
阿里云百炼Token Plan团队版是面向企业和开发者的AI大模型订阅服务,以Credits为统一计量单位,支持通义千问、DeepSeek、Kimi、GLM等150+款模型的多模态调用。产品分三档坐席套餐:标准版198元/月(25,000 Credits)、高级版698元/月(100,000 Credits)、尊享版1,398元/月(250,000 Credits),并提供5,000元共享用量包作为弹性补充。当前限时活动包括Qwen3.7-Max调用消耗减半、新模型5-8折优惠、HappyHorse视频生成6折及全模型通用抵扣包最高5.3折等活动。
|
2月前
|
人工智能 缓存 监控
协议兼容新方案:CC Switch本地路由实现Codex CLI接入DeepSeek全流程
在命令行AI编程场景中,Codex CLI凭借高效的代码生成、脚本编写与工程辅助能力,成为开发者轻量化开发的核心工具。但Codex CLI原生仅兼容OpenAI Responses API协议,无法直接对接DeepSeek等采用Chat Completions API的第三方模型,直接修改配置会引发404报错、参数解析失败、流式输出中断等问题。CC Switch本地路由工具通过轻量化本地代理与双向协议转换,无需修改Codex CLI源码,即可实现无感接入DeepSeek等第三方模型,彻底解决协议不兼容痛点,大幅拓展Codex CLI的模型生态与使用场景。
714 4
|
2月前
|
人工智能 运维 监控
AI 驱动网络攻击自主化演进与传统防御体系适配性研究
本文基于Anthropic 2025–2026年832个恶意账号实测数据,揭示AI正驱动网络攻击从人工主导迈向全链路自主化:67%攻击者用AI筹备攻击,中高风险者占比由33%升至56%,AI已深度渗透后渗透阶段。研究指出MITRE ATT&CK等传统框架失效、防御体系滞后,并提出覆盖行为监测、框架迭代、权限管控、人员赋能的分层防御方案。(239字)
336 4
|
2月前
|
前端开发 机器人 API
用两行代码将 AgentRun 集成到你的应用
AgentRun支持OpenAI协议,改两行代码即可将Agent无缝接入现有应用,兼容Python/Node.js/Java等;同时提供SDK、UI嵌入、IM机器人、云事件触发五种集成方式,开箱即用全链路能力。
|
关系型数据库 MySQL 测试技术
MySQL性能测试(完整版)
MySQL性能测试(完整版)
1893 2
|
Dart 前端开发 JavaScript
探索移动应用开发中的跨平台解决方案:Flutter与React Native的比较
在移动应用开发领域,选择合适的跨平台解决方案是关键。本文将深入分析Flutter和React Native这两大主流框架,从性能、开发效率、社区支持等方面进行比较,帮助开发者做出明智的选择。
654 27
|
运维 Cloud Native 安全
Serverless是什么
小陈向大刘请教Serverless,了解到Serverless是种云原生开发模式,重点在于FaaS(函数即服务)和BaaS(后端服务),让开发者专注于业务逻辑,而无需管理服务器等基础设施。Serverless并非无服务器,而是将服务器运维工作交给云厂商。FaaS是代码托管服务,例如阿里云的函数计算,提供敏捷、弹性、可靠且成本效益高的计算服务。BaaS则是通过API调用第三方服务,如数据库访问。Serverless与传统架构相比,减少了开发者的负担,提高了效率,降低了成本,并增强了安全性。
3863 6
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用问题之如何提高Flink从MySQL读取数据的速度并减少延迟
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 NoSQL 安全
go 连接mongodb执行查询的代码
在Go语言中,你可以使用官方的MongoDB驱动程序 `"go.mongodb.org/mongo-driver/mongo"` 来连接MongoDB并执行查询。以下是一个简单的示例代码,演示如何连接MongoDB并执行查询: 首先,确保你已经安装了MongoDB驱动程序: ```bash go get go.mongodb.org/mongo-driver/mongo ``` 然后,可以使用以下示例代码: ```go package main import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driv
540 0

热门文章

最新文章