Elasticsearch 使用误区之三——分片设置不合理

news2024/11/14 15:13:41

Elasticsearch 是一个强大的搜索和分析引擎,它通过将数据分散到多个节点的分片中来进行分布式处理。

本文将探讨分片大小和策略的概念,以优化 Elasticsearch 的性能并防止过度分片或分片过大等问题。

先看个分片设置不合理的真实企业案例:

d5ec4c631a705414a2eea4282e86b694.png

10TB 左右集群数据,只有两个节点集群。单个最大索引 600GB,7.17.4 版本,200分片(全部)。

集群重启无法启动,未咨询之前是:最长时间8小时启动集群,过年期间,直接无法启动(已启动了20个小时+)。

——https://t.zsxq.com/SzcaQ

1、什么是分片?

在 Elasticsearch 中,每个索引都被划分为多个分片,每个分片可以在多个节点上复制,以确保数据的可用性和冗余。

8f706c8fecfe491d3c09ef7aee2916fa.png

上图是我本地单节点8.X 集群的 Head 插件截图,绿色代表已分配分片,灰色代表未分配副本分片(单节点所以无法分配副本分片)。

然而,尽管分片允许通过分散数据来扩展,不当的分片可能导致性能瓶颈或稳定性问题。

2、为什么分片策略很重要?

有效的分片关键在于找到正确的平衡。

过多的分片会导致“过度分片”,在这种情况下,管理众多分片的开销超过了其带来的好处,导致查询处理效率降低,可能还会引发集群不稳定。

3、创建分片策略

为了防止这些问题,至关重要的是要根据我们的特定需求开发一个分片策略,这包括:

  • 了解集群的数据和查询:分析咱们所在集群的数据性质和将执行的查询。

  • 基准测试:在类似生产环境中测试不同的分片配置,看看更改如何影响性能。

举例,如下基准测试仅供参考。

分片配置查询响应时间 (ms)CPU 使用率 (%)内存使用率 (%)搜索吞吐量 (查询/秒)稳定性评价
5 分片1207065200
10 分片956070230
20 分片857580250
50 分片788590260非常低

在实际应用中,应根据具体需求和资源条件,选择最适合的分片配置。

  • 监控:使用 Kibana 等工具监控不同分片大小和配置对集群性能和稳定性的影响。

不幸的是,没有一种万能的分片策略。一种在某个环境中有效的策略可能不适用于其他环境。一个好的分片策略必须考虑到我们的硬件基础设施、业务场景和性能预期。

所以,大厂的意见、建议、经验贴不见得适用我们下厂。这很关键!

4、分片大小的关键考虑因素

4.1 搜索线程

每个分片在单独的线程中处理搜索查询。如果存在太多分片,可能会超负荷节点的搜索线程池,从而减慢查询处理速度。

GET /_cat/thread_pool?v&h=id,name,active,rejected,completed

f9002cdcaf03b4099d192e2fed70e2a8.png

上述命令会显示集群中所有节点的所有线程池的信息,帮助我们识别哪些线程池可能过载。

4.2 分片开销

每个分片无论大小都会增加 CPU 和内存使用的开销。少量大分片通常比许多小分片使用资源更高效。

注意:在 Elasticsearch 中,可以使用一些命令行操作来查看分片的资源使用情况,尤其是关于 CPU 和内存的开销。

虽然没有直接的命令行工具可以显示每个分片的 CPU 使用情况(因为 CPU 使用通常被监控在节点级别而非分片级别),但咱们可以获取关于每个分片内存和存储使用的信息。

1e7c998441b872d33c1b279395259934.png

API 名称描述示例请求
_cat/shards显示集群中所有分片的信息,包括健康状况、存储使用等。GET /_cat/shards?v
_cat/allocation显示集群中每个节点的磁盘分配情况,包括已用和可用空间。GET /_cat/allocation?v
_nodes/stats提供节点级的统计信息,包括内存使用情况、CPU使用情况等。GET /_nodes/stats/jvm?pretty
_cat/segments提供索引的段信息,帮助了解分片的内部结构,包括段在内存中的大小等。GET /_cat/segments/my_index?v

4.3 数据段

随着分片内数据的增长,数据会被划分为多个段。

Elasticsearch 在 JVM 堆内存中保留段元数据,以便可以快速检索用于搜索。随着分片的增长,其段被合并成更少的更大的段。这减少了段的数量,意味着在堆内存中保留的元数据更少。

这些段会定期合并,以优化查询性能和资源使用。

源码剖析:Elasticsearch 段合并调度及优化手段

从源码角度剖析 Elasticserach 段合并调优策略

5、分片大小的最佳实践

5.1 理想的分片大小

官方建议:分片大小在 10GB 到 50GB 之间通常是有效的,这有助于平衡资源使用和恢复时间。

Elasticsearch究竟要设置多少分片数?

5.2 节点上的分片数

参考依据之一:根据节点的内存容量保持分片数。例如,具有 30GB 堆内存的节点最多应承载 600 个分片。

参考依据之二:数据节点个数,设置索引分片数据建议数据节点的1(或者1.5)-3倍。

5.3 最佳实践和工具的使用

节点的堆内存:通过以下命令检查每个节点的当前堆内存大小。

GET _cat/nodes?v=true&h=heap.current

92e25ba1970b2ae5e683cb7997db95f7.png

检查节点上的分片数:使用以下命令来查看每个节点上的分片数量。

GET _cat/shards?v=true

f6170a6cf494705a7f700666f5dab5d5.png

显式映射:与其让 Elasticsearch 自动创建映射,不如明确地定义它们,以避免不必要的资源使用。

更多参见《一本书讲透 Elasticsearch》P409-P411Elasticsearch 数据建模章节。

6、使用数据流和 ILM

对于时间序列数据,使用数据流(data stream)和索引生命周期管理 (ILM) 可以简化时间基础索引的管理。

ILM 帮助根据特定标准自动管理滚动和删除,确保有效的数据存储和分片管理。

7、实践中调整分片

  • 滚动标准

设置基于分片大小或文档数量的滚动条件,防止任何单个分片变得过大。

5df56b24dced659e038fca9abcde858e.png

PUT my-index-000001/_settings
{
  "index" : {
    "routing.allocation.total_shards_per_node" : 5
  }
}

避免热点:均匀地在节点之间分配分片,以防止任何单个节点成为性能瓶颈。显式映射:与其让 Elasticsearch 自动创建映射,不如明确地定义它们,以避免不必要的资源使用。

8、减少分片数量

如果我们的集群已经存在过度分片问题,可以考虑:

(1)合并索引:将小型、相似的索引合并成更大的索引。

cb1f70267bdc86e8c60773fa5e256379.png

POST _reindex
{
  "source": {
    "index": "my-index-2099.10.*"
  },
  "dest": {
    "index": "my-index-2099.10"
  }
}

删除不使用的索引:删除不再需要的索引以释放资源。

DELETE my-index-000001

没到这个地方,咱们都多强调一句——删除索引,而不是文档!

删除的文档不会立即从 Elasticsearch 的文件系统中移除。相反,Elasticsearch 会在每个相关分片上标记该文档为已删除。标记的文档将继续使用资源,直到在定期的段合并期间被移除。

(2)压缩索引:减少不再写入数据的旧索引中的分片数量。

9、处理分片相关错误

注意节点最大分片数设置。如果某个操作超过了这个限制,可能需要临时调整该设置或考虑更永久的解决方案,

如增加节点或合并分片。

必知必会两个核心参数:

- cluster.max_shards_per_node

- index.routing.allocation.total_shards_per_node

9.1 cluster.max_shards_per_node

这是一个集群级别的设置,用来限制每个节点可以持有的最大分片数。默认值:1000。

其目的是防止单个节点由于持有过多分片而过载,这可能会导致性能下降和稳定性问题。

https://www.elastic.co/guide/en/elasticsearch/reference/8.14/misc-cluster-settings.html

  • 使用场景

防止节点过载——在大规模部署中,防止任何单个节点因分片数量过多而成为性能瓶颈。

集群扩展——在节点添加到集群或从集群中移除时,该设置帮助平衡分片分布,保持集群的健康和性能。

  • 注意事项

(1)如果 cluster.max_shards_per_node 设置得太低,可能会妨碍Elasticsearch正常的分片分配,特别是在集群扩展或收缩时。

(2)可以动态更新这个设置,以适应集群的变化,如节点增加或减少。

ac2174f14abebb466c0ec189ad84f19f.png

PUT _cluster/settings
{
  "persistent" : {
    "cluster.max_shards_per_node": 1200
  }
}

9.2. index.routing.allocation.total_shards_per_node

这是一个索引级别的设置,用于限制特定索引的分片可以分配到每个节点的最大数目。这个设置允许对单个索引的分片分布进行更细致的控制。

  • 使用场景

分片均衡——确保一个高流量的索引不会在少数节点上聚集过多分片,从而避免这些节点成为热点。特定索引的性能优化:针对访问模式和查询负载对特定索引进行优化。

290a28b8973e9decbaf5dfda70a81944.png

  • 注意事项

    • 在索引的生命周期中,我们可能需要根据使用模式和节点的变化调整这个设置。

    • 使用这个设置可以增加配置的复杂性,需要详细监控和调整以确保最佳性能。

    • 虽然这两个设置都涉及分片分配,但 cluster.max_shards_per_node 提供了一个全局的安全网,防止任何节点因分片过多而过载。

    • 而 index.routing.allocation.total_shards_per_node 允许对单个索引进行更细粒度的控制。在实践中,这两个设置可以同时使用,以确保节点不会因全局或局部的分片分布不均而影响整体的Elasticsearch集群性能。

总的来说,适当配置这两个参数能够有效地管理和优化 Elasticsearch 集群的分片分布,从而提高查询性能和系统稳定性。在实际操作中,应根据集群的具体业务场景需求和表现来调整这些设置,以达到最佳的运行效果。

10、结论

在 Elasticsearch 中,有效地管理分片对于维护最佳性能至关重要。通过仔细规划我们的分片策略并定期监控分片性能和资源使用情况,可以确保 Elasticsearch 集群保持稳定、可扩展和快速。

记住,最好的分片方法是能够适应我们的数据和查询需求的不断变化的方法。

开篇问题也得以解决,截图如下。

86c123956d1d5b7efd243d53a145c972.png

https://www.elastic.co/guide/en/elasticsearch/reference/8.14/size-your-shards.html

Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库!

Elasticsearch 使用误区之二——频繁更新文档

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路

8c670fb3f7ede55a9e084d90896be16f.png

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

2537356ba3f06fd3ab9bbb1efbffd9d7.gif

抢先一步学习进阶干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

陶晶驰串口屏使用记录与教程

首先把串口屏想象成和正点原子usmart调试程序一样的程序,串口屏主芯片有些是GD32 STM32都是主流单片机,里面下载了一些固件形成了现在的操作系统 其实我更喜欢把他们(usmart,串口屏主程序,micropython,at指…

uniapp vue3 使用画布分享或者收藏功能

使用HBuilder X 开发小程序,大多数的画布插件很多都是vue2的写法,vue3的很少 我自己也试了很多个插件,但是有一些还是有问题,不好用 海报画板 - DCloud 插件市场 先将插件导入项目中 自己项目亲自用过,功能基本是完善…

GraphRAG:基于实体的本地搜索方法:知识图谱与非结构化数据的融合

GraphRAG:基于实体的本地搜索方法:知识图谱与非结构化数据的融合 在自然语言处理和信息检索领域,如何有效地结合结构化知识和非结构化文本数据一直是一个重要的研究方向。本文介绍一种基于实体的本地搜索方法,该方法巧妙地融合了知识图谱中的结构化数据和输入文档中…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中,我们常常会遇到代码冗余的问题,这不仅增加了代码量,还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求,要求立马完…

打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南

目录 一、赛前准备 1.1 报名与纪律要求 1.2 MD5码上传 1.3 竞赛准备 1.4 时间分配 二、论文格式规范 2.1 摘要 2.2 参考文献 2.3 排版要求 三、建模过程与方法 3.1 问题分析与模型假设 3.2 模型构建与求解 3.3 结果分析与检验 四、论文撰写技巧 4.1 论文结构 4…

Redisson中分布式锁继承体系

直接上图 画了好久 关于非公平锁和公平锁中差异化函数如tryLockInnerAsyc 和unsubscribe还没有时间进行探索,这应该是公平锁和非公平锁之间的差异所在。 说一说Redisson中的类之间关系设计 参考抽象类实现接口_一个抽象之类 如果要实现某个接口怎么办-CSDN博客 众…

电脑文件误删除如何恢复?数据恢复第一步是什么?这五点要第一时间处理!

电脑文件误删除如何恢复?数据删除恢复的第一时间要做什么,你知道吗? 在使用电脑的过程中,误删除重要文件的情况时有发生。面对这种情况,不必过于慌张,因为有多种方法可以帮助你恢复误删除的文件。以下是恢复…

金字塔监督在人脸反欺骗中的应用

介绍 论文地址:https://arxiv.org/pdf/2011.12032.pdf 近年来,人脸识别技术越来越普及。在智能手机解锁和进出机场时,理所当然地会用到它。人脸识别也有望被用于管理今年奥运会的相关人员。但与此同时,人们对人脸欺骗的关注度也…

醒醒,别睡了...讲《数据分析pandas库》了—/—<3>

直接上知识点 一、 1、新建数据框时建立索引 所有的数据框默认都已经使用从 0 开始的自然数索引,因此这里的"建立”索引指的是自定 df pd.DataFrame( {varl : 1.0, var2 :[1,2,3,4], var3 :[test,python,test,hello] , var4 : cons} , index [0,1,2,3]) …

【ESP32 IDF SPI硬件驱动W25Q64】

目录 SPISPI介绍idf配置初始化配置通信 驱动代码 SPI SPI介绍 详细SPI介绍内容参考我之前写的内容【ESP32 IDF 软件模拟SPI驱动 W25Q64存储与读取数组】 idf配置 初始化配置 spi_bus_initialize() 参数1 :spi几,例如spi2,spi3 参数2:…

MySQL体系结构与查询执行流程详解

MySQL 体系结构与查询执行过程详解 MySQL 是一个采用单进程多线程架构模式的关系型数据库管理系统。本文将详细介绍 MySQL 的体系结构及其查询语句的执行过程,并探讨性能优化的关键点。 MySQL 体系结构 MySQL 的架构为 Client-Server 架构。总体上,我们可以将 MySQL 的体系…

python—pandas基础(2)

文章目录 列操作修改变量列筛选变量列使用.loc[](基于标签)使用.iloc[](基于整数位置)使用.filter()方法 删除变量列添加变量列 变量类型的转换Pandas 支持的数据类型在不同数据类型间转换 建立索引新建数据框时建立索引读入数据时建立索引指…

如何在宝塔面板给域名配置 SSL 证书

首先需要有证书 这里以阿里云为例 1. 首先进入到 SSL 证书管理控制台 选择个人测试证书,并点击购买 免费的可以使用三个月。 购买完成之后回到控制台。 点击创建证书,将标红的地方填写,其他默认就好。 然后提交审核就行。 这里需要对域名…

JS逆向高级爬虫

JS逆向高级爬虫 JS逆向的目的是通过运行本地JS的文件或者代码,以实现脱离他的网站和浏览器,并且还能拿到和浏览器加密一样的效果。 10.1、编码算法 【1】摘要算法:一切从MD5开始 MD5是一个非常常见的摘要(hash)逻辑. 其特点就是小巧. 速度快. 极难被破解. 所以,…

图像生成中图像质量评估指标—FID介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 Frchet Inception Distance(\textbf{FID})是一种衡量生成模型性能的指标,它基于Inception网络提取的特征来计算模型生成的图像与真实图像集合之间的距离。 FID利用了Inception模…

repo中的default.xml文件project name为什么一样?

文章目录 default.xml文件介绍为什么 name 是一样的,path 不一样?总结 default.xml文件介绍 在 repo 工具的 default.xml 文件中,定义了多个 project 元素,每个元素都代表一个 Git 仓库。 XML 定义了多个不同的 project 元素&…

64.隐藏指定模块

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:63.利用PEB获取模块列表 效果图: 隐藏模块简单实现: #include …

苍穹外卖浏览器前端界面修改

背景: 客户原始方案是期望做一个Spring Boot Vue的饿了么系统,但时间上太仓促,所以建议选择开源的苍穹外码目作为作业提交。 客户接受了建议的方案后,期望对前端页面做一些个性化的定制修改。 过程: 苍穹外卖简单介…

【C++进阶】C++11特性(上)

1、统一列表初始化 1.1 {}初始化 C98的特性用{}统一初始化数组或结构体。 //{}初始化 struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0; } C11则扩大其特性,可以不带进行初始化&…

【SQL 新手教程 2/20】关系模型 -- 主键

💗 关系数据库建立在关系模型上⭐ 关系模型本质上就是若干个存储数据的二维表 记录 (Record): 表的每一行称为记录(Record),记录是一个逻辑意义上的数据 字段 (Column):表的每一列称为字段(Colu…