【一文看懂 ES 核心】存储查询集群

news2024/12/23 0:07:56

一文看懂 ES 核心

Elasticsearch 作为一个搜索引擎,其可以提供高效的搜索匹配数据的能力,对于这类工具了解其运行原理其实是有一套功法的。

  1. 聊存储,ES 是如何存储数据的?
  2. 聊方法,ES 是如何进行搜索匹配的?
  3. 聊集群,ES 的最佳部署方案?集群如何协作?
  4. 聊使用,在代码中如何使用?

ES 的一些概念性名称

先解释一些概念性名词便于后续的快速理解

index 索引

index 相当于 ES 的数据表,我们主要建立的就是 index 索引文件,搜索也是基于索引来进行,建立的索引文件会存于磁盘

倒排索引

为什么叫 “倒排” 是因为一般的索引是通过下标找数据,而 ES 为了做分词搜索匹配是通过词来匹配找对应数据的下标,其实我觉得不如叫他 “分词索引” 更容易理解。
在这里插入图片描述

mapping 映射

定义你的 index 索引的数据结构映射,对应概念可以参考 Mysql 的表结构,这个是索引结构,定义了 index 存在那些字段,以及字段类型等相关配置参数。

field 字段

索引的数据字段,同比表字段

document 文档

是可以被索引的基元,人话就是:一条数据,一条记录。在 ES 中记录的格式是 JSON 格式。

cluster 集群

集群由多个节点组成,即多个 ES 服务,他们共同持有索引数据,并对外提供查询写入搜索服务

node 节点

每个 ES 服务称为一个节点,多个节点组成集群,对每个节点可以通过配置集群名称的方式来加入对应的集群。

shards 分片

为了平衡索引存储的大小问题,ES 提供对索引进行了分片的能力,简单理解就是将一个大容量的索引分为多份存储,有几个分片就有几份,而分片可以分布在不同的节点上。默认的确定一个 document 要存储在那个索引分片上是通过 id % 分片数 来确定的,类似 HashMap 的底层逻辑。分片的分布以及如何聚合搜索由 ES 负责管理。分片在 index 创建时指定,后续不可动态更改

replicas 副本

副本是分片的副本,设定几个副本 index 的分片就有几个副本分片,副本可以提供查询服务可以提高查询的并发能力,写入是在主分片然后同步到副本。副本可以在主分片节点宕机时重新选举成为主分片,从而实现高可用。

ES 的存储

ES 作为搜索引擎,其索引数据最终是会落到磁盘的,这样的数据是较为持久的。同时在落盘的过程中也使用了内存缓存进行优化。

其实很多的存储工具都在这么玩,持久话是一定要落盘的,但可以使用内存来优化落盘的时间,而内存不可靠可以通过顺序写磁盘记录日志来进行恢复。

在这里插入图片描述

ES 在写入一条数据时首先会写入 memory buffer ,这部分是系统内存,同时会记录 translog 操作记录日志到磁盘(顺序读写命中系统 pageCache 性能较快),ES 每秒会将 memory buffer 数据刷新至 file system cache (或者 memory buffer 满时同步,ES 是基于 Luence 即 Java 实现,适用 JVM 垃圾收集,这里应该是进入了 JVM 内存中),读取到 JVM 内存后可搜索,即进入 file system cache 时可搜索。这个过程通常称之为 refresh 刷新 即 refresh 后数据可搜索

最终将 file system cache 写入 disk 的操作称为 flush 刷盘 flush 后数据持久化 这个过程有同样有两个触发点,一个是 translog 满时会进行 flush 如默认的 512M ,或者到达周期默认 30 min 进行 flush。flush 后会清空 translog

更详细的解释可以参考我之前的一篇博文 ES 的近实时搜索 filesystem cache 与 事务日志 Translog 数据恢复

ES 搜索匹配

通常来说企业级的 ES 一定是要组件集群的否则无法达到高可用,对于 ES 服务节点查询请求会发送到某一个 DataNode 数据节点上,此时这个节点会成为协调节点,该节点会广播这个查询请求到其他节点,其他节点在对应分片上进行数据查询最后将数据信息返回给协调节点,协调节点汇总数据进行返回。

在这里插入图片描述

ES 集群

在企业应用中集群部署几乎是必不可少的,我们需要保证服务的高可用,ES 同样如此。一般的 ES 集群要保证至少 3 台或以上,用于保证某台服务宕机后的 Master 节点的选举。

比较常用的 ES 节点可以配置为 DataNode 数据节点,或者 MasterNode 主节点。

主节点负责管理索引(创建删除)以及维护元数据 mapping 以及节点状态,不负责查询和写入。

数据节点则会负责数据的查询写入等功能,估配置了数据节点的服务的内存需求更大。

这个配置可以同时配置,即一个节点即可以为 DataNode 也可以是 MasterNode ,但 MasterNode 在一个集群中只存在一个,配置了可以成为主节点的服务在选举过程中有机会成为主节点

ES 在 Java 中的使用

官方提供了 Java High Level REST Client

一般来说在项目中引入 ES 是为了搜索服务即分词文本匹配等检索场景

  1. 首先确定你要创建的索引 mapping
  2. 构建 Java 脚本创建 mapping
  3. 构建脚本同步 DB 数据到 ES (ES 虽然能持久但我们的数据一般要在 Mysql 存在的这是最可靠的)
  4. 相关更新同步 ES
  5. 提供 ES 查询方法查询到对应 id 后可通过 id 直接查 DB 数据

抛一个 Kibana( ES 可视化管理界面) 设置样例,对应 Java 代码转换可以参考官方案例

PUT /esIndex 
{
    "mappings": {
        "properties": {
            "name": {
                "type": "keyword",
                "index": true,
                "store": true
            },
            "sex": {
                "type": "integer",
                "index": true,
                "store": true
            },
            "age": {
                "type": "integer",
                "index": true,
                "store": true
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】文件描述符、文件操作、重定向的模拟实习

目录 一、重温C语言文件操作 1.1 文件打开方式 1.2 文件写操作 1.3 文件读操作 1.3 标准输入输出 二、系统接口的使用 2.1 open 函数 2.2 close 函数 2.3 write 函数 2.4 read 函数 三、文件描述符 3.1 如何管理文件 3.2 0 & 1 & 2 3.3 文件描述符的分配…

种草!超好用的PDF转换器上线啦~

宝子们 重磅福利来啦 你还在为每次转换文件头疼吗 老铁,大拿版万能转换器正式上线啦 以前的文件转换器,不是充会员就是收费高 最坑的是花钱还解决不了问题 每次转换文件内容有误.... 特殊符号或者公式更是无法有效转换 为了整顿这种局面&#xff0c…

KKT条件理解

我们知道拉格朗日函数是用于等式约束的优化问题求解的,然KKT条件是针对含有不等式约束的优化问题的。 首先,我们先给出优化目标: 因此,根据优化目标,我们同样可以构造处拉格朗日函数,并对其进行优化&#…

ssh免密登录

准备两台linux主机 主机A:192.168.92.131 主机B:192.168.92.132 使用主机B去免密访问主机A 在主机B上执行 ssh-keygen -t rsa ssh-keygen 生成密码对 -t rsa 指定生成 rsa 密钥对 密钥对文件默认放在 家目录下面的 .ssh 目录下 root 用户默认放在 /ro…

一、数据库开发与实战专栏导学及数据库基础概念入门

文章目录一、专栏导学1.1 课程内容1.2 学习安排1.3 适合人群1.4 学习方法二、认识数据库2.1 生活中的数据库2.2 数据管理技术的3个发展阶段2.3 数据库、关系型数据库、非关系型数据库概念2.4 为什么要使用数据库2.5 数据库系统及其组成部分2.6 常用数据库访问接口简介2.7 数据库…

【2】Go语言的语法

一、Go语言基础组成 Go语言基础组成: 包申明引入包函数变量语句&表达式注释实例: package main //申明包 import "fmt" /* 这是一个朴实无华的注释 */ func main() { fmt.Printf("mogu") } 实现流程: 第一行&#…

kafka简介

目录 partition和consumer group offset的管理 kafka的事务 幂等producer 事务producer 怎么理解trasactional.id 两阶段2pc简介 kafka的消息传输保证 producer端 broker端 consumer端 消息挤压 kafak的存储 kafka的高性能 附录-kafka demo kafaka的发布-订阅模…

Rust之常用集合(三):哈希映射(Hash Map)

开发环境 Windows 10Rust 1.66.0VS Code 1.74.2项目工程 这里继续沿用上次工程rust-demo 在哈希图中存储带有关联值的键 我们常见的集合中的最后一个是哈希映射。HashMap<K, V>类型使用散列函数存储K类型的键到V类型的值的映射&#xff0c;这决定了它如何将这些键和值…

Vue2.0

JavaScript&#xff08;JS 教程&#xff09; - JavaScript | MDN Vue是构建用户界面的 JavaScript 框架 安装 — 2.0 Vue.jsGitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications.Installation | Vue DevtoolsVSCode插件&#xff1a…

【SpringMVC】SpringMVC整合Mybatis

1.整合思路 第一步&#xff1a;整合dao层 mybatis和spring整合&#xff0c;通过spring管理mapper接口使用mapper的扫描自动扫描mapper接口在spring中进行注册 第二步&#xff1a;整合service层 通过spring管理service接口使用配置方式将service接口配置在spring配置文件中实现…

如何能有兴趣的编代码,而不是畏难?

如果我告诉你&#xff0c;成功做出一道代码题拿下5万美元&#xff0c;做出四道代码题20万美金的年薪到手&#xff0c;你是不是会立刻发愤图强呢&#xff1f;这不是个段子&#xff0c;是北美程序员的面试情况&#xff1a;有小伙伴刷题的过程中觉得刷不下去了&#xff0c;就以此来…

【Javassist】快速入门系列10 当检测到instanceof表达式时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

Android核心技术——Jetpack Hilt依赖注入

依赖注入是什么 个人理解&#xff1a;把有依赖关系的类放在容器中&#xff0c;解析这些类的实例&#xff0c;并在运行时注入到对应的字段中&#xff0c;就是依赖注入&#xff0c;目的是为了类的解耦 例子&#xff1a;A 类 中用到了 B 类&#xff0c;一般情况下需要在 A 类中 …

Promise:工作流程、常见API、使用方法、手撕Promise、async/await

Promise和axios一、Promise的常见骚操作0.初体验1.使用Promise封装原生AJAX2.Promise实例对象的两个属性&#xff08;1&#xff09;状态属性PromiseState&#xff08;2&#xff09;结果值属性PromiseResult3.Promise的工作流程4.Promise的API&#xff08;1&#xff09;.then和.…

ceph--理论

分布式存储--------Ceph 前言&#xff1a;随着OpenStack的快速发展&#xff0c;给Ceph的发展注入了强心剂&#xff0c;越来越多的人使用Ceph作为OpenStack的底层共享存储&#xff0c;Ceph在中国的社区也蓬勃发展起来。近两年OpenStack火爆度不及当年&#xff0c;借助于云原生尤…

SoringBoot+VUE前后端分离项目学习笔记 - 【01 环境配置以及VUE2集成ElementUI】

技术栈一览 SpringBoot2 Vue2 ElementUI Axios Hutool Mysql Echarts 所需软件环境 版本一览 JDK 1.8Mysql5.7Node 14.16.0navicatIdea 2021 Vue-cli 安装 npm install -g vue/cli 查看版本 创建VUE工程 初始化工程 vue create vue 选择Manually select feature…

【MySQL】数据库索引 - 浅谈索引类型

索引类型可以分为哈希表、有序数组和 N 叉树 不管是哈希还是有序数组&#xff0c;或者 N 叉树&#xff0c;它们都是基于其自身数据结构的特性来提高读写速度。在 NoSQL 里面还运用到了 LSM 树&#xff0c;来提高写的速度&#xff0c;还有跳表等数据结构来进行优化。 不过需要…

数据结构与算法-java

什么是数组&#xff1f; &#xff08;1&#xff09;数组是计算机中最基本的数据结构之一&#xff0c;我们会用一些名为索引的数字来标识每项数据在数组中的位置。 &#xff08;2&#xff09;大多数编程语言中索引是从0开始的。 &#xff08;3&#xff09;数组在内存中是存在连续…

如何打造一个流式数据湖

Flink将数据写入到 hudi 准备阶段 启动hadoop集群&#xff08;单机模式&#xff09; ./sbin/start-all.shhdfs离开安全模式 hdfs dfsadmin -safemode leave启动hive 后台启动元数据 ./hive --service metastore &启动hiveserver2 ./hiveserver2 &执行sql语句之前…

fpga实操训练(ip rom)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 altera的fpga本身自带了rom的ip&#xff0c;使用起来也十分方便。实际开发中&#xff0c;使用rom的场景也很多&#xff0c;比如一些默认的配置文件…