带你读《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
671 0
|
SQL 机器学习/深度学习 存储
七大经典技术场景!Apache Flink 在多维领域应用的 40+ 实践案例
随着 Apache Flink 自身的发展,越来越多的企业选择 Apache Flink 应用于自身的业务场景,如底层平台建设、实时数仓、实时推荐、实时分析、实时大屏、风控、数据湖等场景中,解决实时计算的需求。
七大经典技术场景!Apache Flink 在多维领域应用的 40+ 实践案例
|
IDE TensorFlow 算法框架/工具
成功解决 OSError: [WinError 193] %1 不是有效的 Win32 应用程序
成功解决 OSError: [WinError 193] %1 不是有效的 Win32 应用程序
|
12月前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
1133 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
关系型数据库 MySQL 测试技术
MySQL性能测试(完整版)
MySQL性能测试(完整版)
1656 1
|
存储 人工智能 搜索推荐
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
本文详细介绍了第十一届泰迪杯数据挖掘挑战赛C题的解决方案,包括爬取泰迪内推平台的招聘与求职信息、构建企业和求职者画像、开发岗位匹配度与求职者满意度模型以及设计招聘求职双向推荐模型的步骤和Python代码实现。
235 2
【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
|
监控 算法 数据挖掘
HyperLogLog算法有哪些应用场景呢
【10月更文挑战第19天】HyperLogLog算法有哪些应用场景呢
202 0
|
Linux 网络安全 虚拟化
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
|
NoSQL JavaScript 安全
精心操作MongoDB:删除数据库的关键步骤和重要事项
精心操作MongoDB:删除数据库的关键步骤和重要事项
866 0

热门文章

最新文章