Elasticsearch分片原理
ES集群的基本概念
Cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的
Shards主分片
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改,这里和索引分片的算法有关,因为是通过取模算法去判断分到哪,如果改变了 就无法正常查询之前的索引。
replicas分片副本
代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
Recovery
代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
ES为什么要实现集群
ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。同时提高容错性和高可用性
ES集群核心原理分析
分片存储规则
1、每个索引会被分成多个分片shards进行存储,默认创建索引是分配5个分片进行存储(需要注意的是es7.0默认索引分片数调整为1了
)。每个分片都会分布式部署在多个不同的节点上进行部署,该分片成为primary shards.
注意:索引的主分片primary shards定义好后,后面不能做修改。
2、为了实现高可用数据的高可用,主分片可以有对应的备分片replics shards,replic shards分片承载了负责容错、以及请求的负载均衡.
注意: 每一个主分片为了实现高可用,都会有自己对应的备分片,他们之间的关系可以是一对多,主分片对应的备分片不能存放同一台服务器上(单台ES没有备用分片的)。主分片primary shards可以和其他replics shards存放在同一个node节点上。
在往主分片服务器存放数据时候,会对应实时同步到备用分片服务器,但是查询时候,所有(主、备)都进行查询:
Node1 :P1+P2+R3组成了完整的数据
实例演示:
下面是一个已经搭建好的集群.版本为ES7.6.0
创建一个索引
PUT /testindex
查询该索引
GET /testindex
7以下的版本这里会是5和1 这里是7.6.0版本所以是1 1
number_of_shards 相当于主分片数量 代表将索引分成几个分片 5就代表索引会分成5个分片
number_of_replicas 这里相当于是副分片的总数,和上面不同的是这里的1代表所有的副分片组成一份副本的意思.比如有5个主分片,
这里就是5个副分片组成1分总副分片,如果这里是2 代表会有10个副分片组成2份总的副分片.
修改分片数
分片数一般通过修改elasticsearch.yml文件中配置默认值
这里我们修改副分片数量为2
PUT testindex/_settings
{"index" : {"number_of_replicas" : 2}
}
然后查询索引分片信息
GET /testindex/_search_shards
可以看到上图 testindex索引主分片有1个 副分片变为2个 (这里只是针对testindex来说,如果建立其他的索引分片初始还是会变成默认值)
我们接下来尝试修改主分片数量
PUT testindex/_settings
{"index" : {"number_of_shards" : 3}
}
报错,证明索引创建后无法修改分片数
创建索引时指定分片数量
要修改分片数只能在索引创建的时候进行修改
PUT test
{"settings" : {"index" : {"number_of_shards" : 3,"number_of_replicas" : 2}}
}
GET /test/_settings 创建并修改成功
执行 GET /test/_search_shards
可以发现 shards信息中一共有3个主索引 6个副索引
这里我简化了shards节点数据 画图表示
抽象成下图
每个节点上都有一份完整的数据 即使其他两个节点宕机也不会影响查询
数据路由
当客户端发起创建document的时候,es需要确定这个document放在该index哪个shard上。这个过程就是数据路由。
路由算法:shard = hash(routing) % number_of_primary_shards
这里的routing指的就是document的id
如果number_of_primary_shards在查询的时候取余发生的变化,无法获取到该数据
已知主分片数量为3,
路由算法: shard = hash(routing) % 主分片数量3
分片位置 p1 = 1% 3 , p2 =2%3 , p0=3%3
使用
GET test/_search_shards?routing=1
可以查看具体数据路由到哪个分片上面
如上 id为1的文档会路由到2号分片上
Elasticsearch分片原理相关推荐
- 2021年大数据ELK(十一):Elasticsearch架构原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch架构原理 一.Elasticsearch的节点类型 ...
- Elasticsearch工作原理
一.关于搜索引擎 各位知道,搜索程序一般由索引链及搜索组件组成. 索引链功能的实现需要按照几个独立的步骤依次完成:检索原始内容.根据原始内容来创建对应的文档.对创建的文档进行索引. 搜索组件用于接收用 ...
- ELK系列(十五)、Elasticsearch核心原理一篇全搞定
目录 Lucene 介绍 核心术语 如何理解倒排索引? 检索方式 分段存储 段合并策略 Elasticsearch 核心概念 节点类型 集群状态 3C和脑裂 1.共识性(Consensus) 2.并发 ...
- elasticsearch 运行原理
elasticsearch 运行原理: Lucene 把每次生成的倒排索引,叫做一个段(segment).然后另外使用一个 commit 文件,记录索引内所有的 segment.而生成 segment ...
- 【Elasticsearch】检查您的 Elasticsearch 分片
1.概述 翻译:https://www.dennyzhang.com/es_shard 人们可能会用很少的分片来启动他们的弹性搜索集群.甚至以某种方式从 1 开始. 小心!当您的数据变得更大时,您可能 ...
- Elasticsearch 分片管理解析
一个 shard 本质上就是一个 Lucene 索引,也是 Elasticsearch 分布式化 Lucene 的关键抽象,是 Elasticsearch 管理 Lucene 文件的最小单位. 所以, ...
- ElasticSearch高可用集群环境搭建和分片原理
1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...
- 图解ElasticSearch 搜索原理
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.cnblogs.com/ri ...
- elasticsearch 分片_Elasticsearch教程:动手实践
本教程可帮助您开始使用Elasticsearch. 您将学习如何创建和删除索引,如何将数据加载到索引以及如何执行基本查询. > Visualizing data in Kibana, image ...
最新文章
- Spring Data JPA
- 一根火柴可以将一瓶大可乐吊起来吗?
- 更小的模型,迈向更快更环保的NLP
- 中国水银矿石行业市场供需与战略研究报告
- failed to accept an incoming connection: connection from 192.168.1.114 rejected, allowed hosts: 1
- html中使用过渡不显示,CSS3过渡不适用于显示属性
- LaTeX的安装教程(Texlive 2020 + TeX studio)
- pcb板生产的工艺流程有哪些?
- Bettertouchtool Mac破解版(触摸板增强神器)
- 般若波罗蜜多心经(观音心经)注解
- 什么是属性,字段,变量,方法
- 第十六周项目3函数指针调用函数 吃饭睡觉打豆豆
- RAM 与 ROM, CPU 与 GPU ,显卡与显存 区别以及关系等
- 塞规公差带图_塞规和卡规公差表
- 共模电感磁芯材质你知道哪几种
- 一文让你吃透!图解 pandas 透视表、交叉表!
- 火车硬座车厢座位分布表
- Unity AssetBundle介绍
- 算法_数学问题_Question8_猜牌术(java实现)
- R语言学习笔记——向量