ES 的存储原理
目录
二、ES基本结构
2.1、结构图
2.2、基本概念
2.3、与关系数据库概念的类比
2.4、数据如何读写
2.5 容灾能力
三、ES的文件存储结构
每个分片的事务日志(Transaction Log)
Index文件夹内文件含义(lucene文件夹)
四、存储步骤
页缓存 (文件系统缓存)
编辑
整体存储步骤流程图
4.1、写入缓存(内存)
4.2、refresh 刷入页缓存(文件系统缓存)
4.3、刷入 refresh 页缓存的同时,写入 translog
4.4、数据 flush 落盘 disk
4.5、Translog的页缓存(内存缓存)
4.6 flush
4.7 整体存储步骤讲解
五、Es的其他操作
5.1、Doc删除
5.2、Doc更新 = 删除 + 新增
5.3、段合并
参考文章
一、ES是什么
-
一个分布式的实时文档存储,每个字段可以被索引与搜索
-
一个分布式实时分析搜索引擎
-
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
-
基于Lucene,隐藏复杂性,提供简单易用的Restful API接口、Java API接口(还有其他语言的API接口)。ES是一个可高度扩展的全文搜索和分析引擎。它能够快速地、近乎实时地存储、查询和分析大量数据。
二、ES基本结构
2.1、结构图
简单讲解:
- Node相当于服务器,上图就是4个服务器,也叫4个数据节点
- 比如我的商品数据表的index是 es_product ,我可以把数据切割成3份,那么每一份就是一个 Shared(类似于Mysql的table分表),比如上图的index1,有3个主Shared
- 假如我想把不同业务的数据分开存,比如我有外卖的数据,有商超的数据,那么加前缀,waimai_es_product,shangcha_es_product(类似于Mysql的分库)
- R-shared就是副本shared,只负责复制Primary给下来的数据,只有当primary挂了,他才上位。(保证系统稳定性,为什么P-s1和 R-s1不能放在一起,那放一起一起挂了不就完犊子了)
2.2、基本概念
-
集群(cluster)
ES集群由若干节点组成,这些节点在同一个网络内,cluster-name相同
-
节点(node)
一个ES的实例,本质上是一个java进程,生产环境一般建议一台机器上运行一个ES实例。节点可以分布在不同的机房。
-
节点有如下分类:
1、master节点:集群中的一个节点会被选为master节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群删除节点。master节点无需参与文档层面的变更和搜索,这意味着仅有一个master节点并不会因流量增长而成为瓶颈。任意一个节点都可以成为 master 节点。
2、data节点:持有数据和倒排索引。默认情况下,每个节点都可以通过设定配置文件中的node.data属性为true(默认)成为数据节点。如果需要一个专门的主节点,应将其node.data属性设置为false。
3、client节点:如果将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点。也叫协调节点,这个节点不需要配置的,只要任何一个节点接收到请求,并且请求不需要这个节点处理,只需要他进行转发的场景下,这个节点就被叫做协调节点。 - 上面俩节点通过配置指定:
-
node.master: true/false node.data: true/false
一个节点可以既为Master节点,又为Data节点,但是为什么不推荐?
因为Data节点请求过多,负载过高的时候,可能会导致es假死,也就是可能导致其他节点认为该 Master挂了,另外 Data节点会进行gc 回收,这个过程也可能影响 Master节点的正常响应。所以强烈建议 Master 只做集群管理工作,不参与data的index与query -
索引(index)
文档的容器,一类文档的集合
-
分片(shard)
单个节点由于物理机硬件限制,存储的文档是有限的,如果一个索引包含海量文档,则不能在单个节点存储。ES提供分片机制,同一个索引可以存储在不同分片(数据容器)中,这些分片又可以存储在集群中不同节点上。
分片分为主分片(primary shard) 以及从分片(replica shard)
1、主分片与从分片关系:从分片只是主分片的一个副本,它用于提供数据的冗余副本
2、从分片应用:在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求
3、是否可变:索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变
-
文档(document)
可搜索的最小单元 ,json格式保存
2.3、与关系数据库概念的类比
RDBMS |
ES |
---|---|
Table |
Index |
Row |
Document |
Column |
Field |
Schema |
Mapping |
SQL |
DSL |
分片(Shard)在数据库概念映射里面类似于分表(水平拆分)
index、type的初衷
之前es将index、type类比于关系型数据库(例如mysql)中database、table,这么考虑的目的是“方便管理数据之间的关系”。
【本来为了方便管理数据之间的关系,类比database-table 设计了index-type模型】
为什么现在要移除type?
a. 在关系型数据库中table是独立的(独立存储),但es中同一个index中不同type是存储在同一个索引中的(lucene的索引文件),因此不同type中相同名字的字段的定义(mapping)必须一致。如果是mysql,两个table中的age字段,2个table可以分别定义成int和string,但是es不行,必须一样
b. 不同类型的“记录”存储在同一个index中,会影响lucene的压缩性能。
2.4、数据如何读写
1、所有数据的处理都由 Primary Shared去处理
shard = hash(routing) % number_of_primary_shards
2、假如客户端请求 Node2 写入数据,比如是往spu-record这个index写入数据,此时根据路由字段(一
TuJun233: 想问下文章中的图是哪里的呀?感觉挺清晰的
Java编程乐园: 优质好文,博主的文章非常精炼,兼顾实用性和可操作性。研读后深受教益。我也写了一篇博客,做了更深入的剖析,可以说是站在你的臂膀上,写出来的好文。欢迎前往评论指正。我的博客:【位操作】比特位计数(bit counting)之二【分治法】【2bit分组】右移位法【彻底打通任督二脉】【位运算】 链接:https://blog.csdn.net/weixin_42369079/article/details/138904729?spm=1001.2014.3001.5502【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
starlighttt: 快排中getmid函数里有bug,漏了right--和left++
JebLin02: 谢谢提醒,重新理解了一下,改了~
JebLin02: 谢谢提醒,重新理解了一下,改了~