Elasticsearch写入原理(1)--数据底层

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch写入原理(1)--数据底层

名词解释

  • Document(文档): 文档是存储在elasticsearch中的一个JSON文件,相当于关系数据库中表的一行数据。
  • Shard(分片):索引数据可以拆分为较小的分片,每个分片放到不同的服务器上,提高并发能力。Lucene 中的 Lucene index 相当于 ES 的一个 shard。
  • Segments(段): 分片由多个segments组成,每个segments都是一个独立的倒排索引,且具有不变性,segment 提供了搜索功能。
  • Transaction Log(translog,事务日志):Elasticsearch使用translog来记录index,delete,update,bulk请求,保障数据不丢失,如果Elasticsearch需要恢复数据可以从translog中读取。每个分片对应一个translog文件。
  • Commit point(提交点):记录着所有已知的segment。
  • Lucene index :由一堆 Segment 的集合加上一个Commit point组成。

内存分配

image.png

  • OS Cache: Lucene 中的倒排索引 segments 存储在文件中,为提高访问速度,都会把它加载到OS Cache中,从而提高 Lucene 性能,所以建议至少留系统一半内存给Lucene。
  • Node Query Cache:负责缓存filter 查询结果,每个节点有一个,被所有 shard 共享,filter query查询结果不涉及 scores 的计算。
  • Indexing Buffe:索引缓冲区,用于存储新索引的文档,当其被填满时,缓冲区中的文档被写入磁盘中的 segments 中。
  • Shard Request Cache:用于缓存aggregations,suggestions,hits.total的请求结果。
  • Field Data Cache:Elasticsearch 加载内存 fielddata 的默认行为是延迟加载 。在首次对text类型字段做聚合、排序或者在脚本中使用时,需要设置字段为fielddata数据结构,它将会完整加载这个字段所有 Segment 中的倒排索引到堆内存中。不推荐使用,因为fielddata会占用大量堆内存空间 ,聚合或者排序使用doc_value。

写入流程--数据底层image.png

  • 1.数据写入Index Buffer缓冲和Translog日志文件。
  • 为了保证数据不会丢失,从高版本开始Transaction Log对每个index,delete,update,bulk请求都fsync持久化到磁盘。
  • 2.Refresh:将Index Buffer写入Segment的过程叫做Refresh。
  • 每隔1s,Index Buffer中的数据被写入新的Segment(OS Cache中),此时Segment被打开并提供Search。Refresh后,数据就可以被搜索到了,这也是为什么Elasticsearch被称为近实时搜索的原因。
  • 当Index Buffer被占满时,会触发Refresh,默认值是JVM堆内存的10%。
  • Refresh不执行fsync操作,不会清空Transaction Log。
  • 3.重复1~2步,新的Segment不断添加,Index Buffer不断被清空,而Transaction Log中的数据不断累加。
  • 4.每隔30分钟或者当Transaction Log用满时(默认512M),ES Flush (Lucene Commit) 操作发生:
  • 4.1 调用Refresh清空Index Buffer。
  • 4.2 调用fsync,将缓存中的Segments写入磁盘。
  • 4.3 清空(删除)Transaction Log。
  • 4.4 commit ponit被写入磁盘,标明了所有Segment。

参数说明

Refresh

PUT my-index/_settings
{
  "refresh_interval": "60s" #默认1s
}

Translog

PUT my-index/_settings
{
  "translog.flush_threshold_size": "1gb",  #默认512M,当 translog 超过该值,会触发 flush
  "translog.sync_interval": "60s", #默认5s
  "translog.durability": "async" #默认是 request,每个请求都落盘,忽视translog.sync_interval。设置成 async,异步写入,根据index.translog.sync_interval参数的间隔时间做fsync。
}
相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
5天前
|
API 网络架构 索引
Elasticsearch索引中数据的增删改查与并发控制
Elasticsearch索引中数据的增删改查与并发控制
10 0
|
24天前
|
存储 监控 数据挖掘
使用 Meltano 将数据从 Snowflake 导入到 Elasticsearch:开发者之旅
【6月更文挑战第9天】Meltano,一个开源数据集成框架,简化了从Snowflake到Elasticsearch的数据迁移。这个工具支持多种数据源,提供易于配置的界面。要开始,需安装Meltano并配置连接信息。一个简单的YAML示例展示了如何定义从Snowflake到Elasticsearch的迁移任务。Meltano自动执行迁移,同时提供监控和日志功能。借助Meltano,用户能高效集成数据,提升搜索和分析能力,适应不断增长的数据需求和挑战。
67 6
|
6天前
|
存储 缓存 负载均衡
elasticsearch写入流程和请求检索流程原理全方位解析
elasticsearch写入流程和请求检索流程原理全方位解析
|
1天前
|
存储 安全 文件存储
【elasticsearch】es6重启服务后数据消失,es6如何配置数据持久化储存
【elasticsearch】es6重启服务后数据消失,es6如何配置数据持久化储存
7 1
|
5天前
|
索引
利用滚动索引来管理海量Elasticsearch数据
利用滚动索引来管理海量Elasticsearch数据
10 3
|
5天前
|
数据库 索引
Elasticsearch索引别名:管理与优化数据访问
Elasticsearch索引别名:管理与优化数据访问
9 2
|
6天前
|
存储 监控 固态存储
elasticsearch索引生命周期管理(ILM):原理和实践
elasticsearch索引生命周期管理(ILM):原理和实践
|
22天前
|
JSON DataWorks 关系型数据库
DataWorks操作报错合集之同步Elasticsearch数据报错:Cat response did not contain a JSON Array,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5天前
|
数据安全/隐私保护 网络架构 索引
Elasticsearch索引数据的路由规则与自定义路由分发
Elasticsearch索引数据的路由规则与自定义路由分发
5 0
|
5天前
|
数据采集 API 定位技术
elasticsearch pipelineI详解:原理与使用
elasticsearch pipelineI详解:原理与使用