ES 的存储原理

本文详细介绍了Elasticsearch的核心概念、基本结构、数据读写流程、文件存储结构及容灾能力。重点阐述了文档如何通过主分片和副本分片进行存储和检索,以及数据在内存、页缓存、事务日志和磁盘间的流动。此外,讨论了删除和更新操作以及段合并的过程,揭示了Elasticsearch如何实现近实时搜索和高可用性。
摘要由CSDN通过智能技术生成

目录

一、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、结构图

简单讲解:

  1. Node相当于服务器,上图就是4个服务器,也叫4个数据节点
  2. 比如我的商品数据表的index是 es_product ,我可以把数据切割成3份,那么每一份就是一个 Shared(类似于Mysql的table分表),比如上图的index1,有3个主Shared
  3. 假如我想把不同业务的数据分开存,比如我有外卖的数据,有商超的数据,那么加前缀,waimai_es_product,shangcha_es_product(类似于Mysql的分库)
  4. 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写入数据,此时根据路由字段(一

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值