ElasticSearch分片
本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》
ElasticSearch作为一个搜索引擎,会存储海量的数据。而存储海量的数据,就要解决如何存储的问题,并且保证数据不会丢失,同时还需要保证数据检索的效率,尽可能不会因为数据的增加而影响检索速度。
分片和集群
目前,解决大数据存储的通用方案是分片(Shard)。它的核心思想是,通过把数据拆分为大小合适的片段,然后分别存储到集群内不同的节点上。这样一来,存储的容量可以随着节点的增加而增加,理论上来说就没有上限了。同时数据分片带来的收益不仅仅是数据的存储,对于数据处理来说也可以大幅提升性能和吞吐量。
在现有硬件技术条件下,硬盘读写速度与CPU处理能力不在一个数量级上,所以硬盘往往是数据处理的最大瓶颈。即使有多个CPU或者多个线程并发处理数据,只要处理的数据在同一个硬盘上,当达到了硬盘的读写上限后,数据处理的速度也不会得到显著提升。在使用数据分片技术后,数据会被散列到不同机器的硬盘上,数据的读写也就被分散到不同的硬盘上,这会显著提升数据处理的速度。
分片的基础是要存储到不同的机器上,所以需要有集群的能力。Elasticsearch创建集群非常简单,只要集群中的节点在相互连接的网络中,并且具有相同的集群名称即可。在配置文件config/elasticsearch.yml增加配置:
cluster.name=elasticsearch
当启动了多个实例时,可以在Kibana上查询节点信息:
GET _nodes
创建了Elasticsearch集群后,就需要确定索引分片的数量。分片一般会均匀地分散到集群的不同节点上,这就将存储和检索负载分散到集群的不同节点上。索引分片数量是在创建索引时通过number_of_shards参数设置的。在索引定义好分片数量后,当有新的节点加入集群时,Elasticsearch会将分片均衡地散列到新的节点。
例如,索引分片数量为2,当集群中只有一个节点a时,这些分片将全部位于节点a上;而当有节点b加入到集群中时,Elasticsearch会动态地将其中一个分片复制到节点b上。这也意味着如果索引的分片数量为1,那么这个索引未来将无法扩容。
路由
分片解决了海量文档存储的问题,但也引入了一个新的问题,那就是如何确定文档应该存储到哪个分片。在Elasticsearch中,确定文档存储在哪一个分片中的机制被称为路由(Routing)。
计算文档路由的具体运算公式如下:
shard_num为分片序号,hash为散列函数,_routing为路由参数,而num_primary_shards则是一个索引的主分片数量。这里之所以要使用主分片主要是为了区别副本分片,即在运算时并不包含副本分片数量。
在默认情况下,文档的_routing参数是文档ID。可以自定义路由规则,但是要注意,如果文档添加时的路由规则与文档检索时的路由规则不相同,在检索文档时就有可能被路由到错误的分片上,从而导致检索失败。为了避免这种情况的发生,可以在创建索引时将文档路由参数设置为强制要求:
PUT index_name
{"mappings": {"_routing": {"required": true}}
}
在路由参数设置为强制之后,对文档CRUD操作都必须要指定routing参数,否则在执行请求时将报错误。
由于路由选择对于索引性能的影响很大,往往选择的routing参数看似分散但却会路由到相同的分片。为了解决这个问题,Elasticsearch又引入了另一个分区参数来平衡路由运算,这就是routing_partition_size。引入这个参数后,路由运算公式变为:
在添加了分区参数以后,分片编号同时由路由参数_routing和索引_id字段共同决定,这也就加大分片均衡的可能性。routing_partition_size参数必须大于1并且小于主分片数量。
容量规划
文档所在分片除了由routing参数决定以外,索引分片数量也是其中一个重要的决定因素。在索引分片数量发生变化时,即使routing参数不变,最终的分片位置也会发生变化。
如果在运行时索引分片数量发生了变化,为了保证文档存储和检索都能路由到正确的分片,已经存储到分片中的文档就必须做分片的重新路由。这个过程在Elasticsearch中叫重新索引(Reindex),显然当分片中已经存储了大量文档时,这将是一个非常耗费资源的过程。
为了避免重新索引导致的性能开销,索引分片数量一旦在创建索引时确定后就不能再修改。虽然解决了重新索引问题,但索引的存储容量也被分片数量、节点存储容量限制死了。节点存储容量决定了分片容量的上限,而索引总容量则是单个分片容量与分片数量的乘积。从性能角度考虑,分片太大显然会降低检索速度,所以单个分片的容量也不能过大,需要根据用户对检索性能的要求估算单个分片的容量上限。尽管最好的办法是将分片平均分配到不同的节点上,但如果节点存储容量大于单分片容量上限时,也可以考虑在一个节点上存储多个分片。尽管如此,这还是意味着索引存储容量存在上限,所以在创建索引时有必要对索引容量预先做好规划。如果用户在容量规划时低估了文档容量,那么索引将无法通过扩容来支持更多的文档。
索引容量规划主要是根据一些已知条件规划分片数量,这些已知条件主要包括文档存储整体容量和检索性能要求两个方面。通过检索性能要求可以估算出每个分片的最大容量,再使用整体容量除以分片大小就可以估算出分片数量。文档整体容量有时可能无法估算,比如说日志文件每天都在产生,数量只可能越来越多,不可能估算出上限来。这种情况下可以取一个固定的时间段,比如一天或是一个月,每隔这样一段时间就创建一个新的索引出来。由于固定时间段内的文档数量可估算,所以分片数量也就可以预先估算。
事实上,无论容量规划得多科学依然不能完全避免文档实际存储量与索引容量不相符的情况。在这种情况下,惟一可行的办法就是创建新的索引,再将原索引中的文档存储到新的索引中。
副本
当集群中存储分片的节点发生故障,分片技术并不能保证文档存储、检索等服务依然可用,更不能保证分片中的数据不丢失。为了解决这个问题,Elasticsearch在存储上又引入了另一项称为副本(Replica)的技术。副本是主分片的复制品,它与主分片的数据完全一致,能够在主分片故障时迅速恢复数据。所以主分片与副本分片永远不会在同一节点上,因为这样对于数据恢复没有任何意义。在默认情况下,Elasticsearch为每个索引都设置了1个副本分片,这意味着集群中应该至少有两个节点。如果集群中只有一个节点,副本分片就永远不会被创建,这时Elasticsearch就会将集群健康状态设置为黄色。索引的副本分片数量可以通过number_of_replicas参数设置。
查看集群中的分片情况:
GET _cat/shards
与主分片不同的,副本分片的数量在索引创建之后可以随时动态更改。
相关文章:
ElasticSearch分片
本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 ElasticSearch作为一个搜索引擎,会存储海量的数据。而存储海量的数据,就要解决如何存储的问题,并且保证数据不会丢失,同时还需要保证数据检索的效率,尽可能…...
spring高手之路
以下是一些可以快速入门Spring的方法: 1. 学习基础知识 阅读官方文档:Spring官方文档是最权威的学习资料。它详细介绍了Spring的各个模块、概念和使用方法。从核心模块开始,了解如依赖注入(DI)和控制反转(…...
工字钢与H型钢有什么区别?90%的工程师都搞错了!
这里为大家做一个详尽的解答:很多人认为工字钢是国内的叫法,H型钢是国外的叫法,其实这个认知是错误的。H型钢和工字钢从形状上来说是不一样的,见下图: 工字钢 工字钢主要分为普通工字钢、轻型工字钢和宽翼缘工字钢。按…...
10个程序员可以接私活的平台(非常详细)零基础入门到精通,收藏这篇就够了
私活接的好收入不比上班少,一些同学靠接私活月收入也上万甚至几万了。今天老韩来分享一下有哪些接私活的网站和平台,转发收藏以后备用 我们先来聊聊什么样的私活不能接。。 1、没有第三方担保的个人对个人的尽量不要接,双方都没保障&#x…...
小程序云开发CMS新版数据模型讲解,可视化网页管理后台,内容管理对数据库进行增删改查操作,新闻小程序实战学习
一直跟着石头哥学习小程序开发的同学比较清楚cms是什么,cms就是可以进行可视化的管理云开发数据库的网页后台。有了cms我们可以很方便的管理云开发数据库。 但是云开发官方一直改版,所以现在cms功能被整合到了云开发的数据模型里,也就是现在想…...
undertow服务器初始化
springboot整合undertow服务器的源码从老生常谈的createWebServer方法谈起。spring会在生成所有bean后到创建web容器,此时会到容器找到ServletWebServerFactory接口bean,spring会根据引入的框架确定生成的ServletWebServerFactory,我们在mave…...
LeetCode9:回文数
原题地址:. - 力扣(LeetCode) 题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序ÿ…...
模板语法(2)
一、循环 在模板中可以用v-for指令来循环数组,对象等。 1. 循环数组 <script setup name"App">import { reactive } from "vue"const books reactive([{title: 三国演义,author: 罗贯中}, {title: 水浒传,author: 施耐庵}, {title: 西…...
从头学PHP之数组输出基本函数
上期我们讲到了数组,数组是个特殊的变量,在程序中的重要程度很高,大部分数据处理的时候会用到这种特殊的变量,那么现在让我们继续深入一下吧。 上期我们打印出了数组的值,用print_r()或者var_dump()这俩函数࿰…...
基于SSM+小程序的4S店客户管理系统(汽车2)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 4S店客户管理系统主要包括管理员、用户、门店三个权限角色 1、管理员实现了首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、…...
ZYNQ AXI_Timer 中断
REVIEW 关于ZYNQ中断: ZYNQ PS_GPIO中断-CSDN博客 ZYNQ AXI_GPIO_INT-CSDN博客 ZYNQ 定时器中断-CSDN博客 在一些应用场景中,可能需要使用到多个定时器,除了选择使用 PS 侧其他定时器外,也可以使用 PL 侧逻辑定时器。 1. 今日摸鱼…...
UE5之5.4 第一人称示例代码阅读2 子弹发射逻辑
TP_WeaponComponent.h 看看头文件 暴露了attach weapon和fire给蓝图 这两个函数意义一看名字吧,就是捡起来枪的时候执行,一个就是发射子弹的时候执行 #pragma once#include "CoreMinimal.h" #include "Components/SkeletalMeshComponen…...
Python 实现日期计算与日历格式化输出(万年历)
目录 一、引言 二、需求分析 三、实现思路 四、代码实现 五、代码分析 六、测试与验证 七、总结与展望 在日常的编程中,我们经常会遇到与日期相关的问题,比如计算两个日期之间的天数差、确定某个特定日期是星期几以及格式化输出日历等。本文将详细…...
10.28.2024刷华为OD C题型
文章目录 HJ9HJ10HJ11HJ13HJ17 HJ9 HJ10 HJ11 HJ13 HJ17...
映射问题的解决办法(mybaitis)
最初我用的是注解来操控数据库(注释掉的部分) Mapper public interface ThreadMapper {// Select("SELECT * FROM thread LIMIT #{page}, #{size}")List<Thread> getListByPage(Param("page") int page, Param("size&qu…...
关于机器学习方向学习的一些建议(过来人)
以下是关于机器学习方向学习的一些建议: 一、扎实的数学基础 线性代数 线性代数是机器学习的基石。矩阵运算在数据表示、模型参数计算等方面无处不在。例如,在多元线性回归中,我们用矩阵来表示自变量和因变量之间的关系。像最小二乘法求解回…...
【云原生】云原生后端:网络架构详解
目录 引言一、微服务间的通信1.1 通信方式概览1.2 HTTP/REST1.3 gRPC1.4 消息队列1.5 GraphQL 二、API网关2.1 API网关架构示例2.2 API网关实现示例 三、服务发现3.1 服务发现实现示例3.2 服务发现的优势 四、网络安全4.1 网络安全最佳实践4.2 网络安全架构示例 总结参考资料 引…...
期货资管子系统框架设计JS路径及源代码分享
期货资管子系统框架设计JS路径及源代码分享 随着期货资管子系统前端技术的飞速发展,JavaScript(JS)及其相关框架已成为构建这类系统的重要工具。本文将详细介绍一个期货资管子系统框架的设计思路,并分享部分JS路径及源代码&#…...
【YOLO 系列】基于YOLO的工业自动化轴承缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】
前言 轴承作为机械设备中的关键部件,其性能直接影响到设备的稳定性和寿命。轴承缺陷的早期检测对于预防设备故障、减少维护成本和提高生产效率至关重要。然而,传统的轴承缺陷检测方法往往依赖于人工检查,这不仅效率低下,而且容易…...
Word中Normal.dotm样式模板文件
Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份,在下载本文中的Normal.dotm文件,进行替换,重新打开word即可使用。 字体样式如下(可自行修改&#…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
