ES架构模型

南墨2年前技术文章739

1.整体架构

Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速、近实时地存储、搜索和分析大量数据。它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术。Elasticsearch服务的主要组成部分如3-1所示。

Elasticsearch Nodes进行了种类划分:EsMasterEsNode1~9EsClient。在安全模式下Elasticsearch具备基于用户/角色划分的安全认证与鉴权功能。

集群服务职责规划:

1.       MasterElasticsearch的主节点,负责Master选举和集群管理。

2.       NodeElasticsearch的数据节点,负责数据索引和搜索。

2.       ZooKeeper:服务维护安全模式下Elasticsearch集群的认证与鉴权等相关信息。

image.png

 

本文重点关注的是Elasticsearch写入索引和查询数据的性能问题,基于以上的组件框架图,下面来了解一下Elasticsearch写入索引和查询索引数据的具体流程。

2. 索引流程

写入索引流程如3所示。

image.png

 

过程描述:

1.       客户端发送一个请求给任意节点,假设是Node 1

2.       Node 1通过请求判断出该文档应该被存储的分片,假设是shard 0这个分片,因此Node 1会把请求转发到shard 0primary shard P0存在的Node 3节点上。

3.       Node 3shard 0primary shard P0上执行请求。如果请求执行成功,Node 3并行地将请求发给shard 0的所有存在于Node 1Node 2中的replica shard R0上。如果所有的replica shard都成功地执行了请求,那么将会向Node 3回复一个确认成功,当Node 3收到了所有replica shard的确认信息后,则向用户返回一个Success消息。

3. 查询流程

Elasticsearch查询流程分为两个阶段,即查询(query)阶段与提取(fetch)阶段。

查询阶段流程如所示。

image.png

 

过程描述:

1.       客户端发送一个检索请求给任意节点,假设是Node 3

2.       Node 3将检索请求发送给该index中的每一个shard,此时会采取轮询策略,在primary shard及其所有replica shard中随机选择一个,让读请求负载均衡。每个shard在本地执行检索,并将结果排序添加到本地。

3.       每个shard返回本地所记录的结果,发送给Node 3Node 3将这些值合并,做全局排序。

查询阶段主要定位了所要检索数据的具体位置,而提取阶段的任务就是将这些定位好的数据内容取回并返回给客户端。提取阶段如3-4所示。

图1-4 提取阶段流程

image.png

 

过程描述:

1.       Node 3获取了所有待检索数据的定位之后,发送请求给与数据相关的shard

2.       每个收到Node 3请求的shard,将读取相关文档中的内容,并将它们返回给Node 3

3.       Node 3获取到了所有shard返回的文档后,Node 3将它们合并成一条汇总结果,返回客户端。

4. 基本概念

l   Index:即索引,是Elasticsearch中一个逻辑命名空间,指向一个或多个分片,内部Apache Lucene实现索引中数据的读写。索引与关系数据库实例Database相当。一个Elasticsearch实例可以包含多个索引。

l   Type:文档类型,文档类型使得同一个索引中在存储结构不同的文档时,只需要依据文档类型就可以找到对应的参数映射信息,方便文档的存储。相当于数据库中的Table。一个索引对应一个文档类型。

l   Document:文档,是可以被索引的基本单位,特指最顶层结构或根对象序列化成的JSON数据。相当于数据库中的Row。一个类型包含多个文档。

l   Mapping:映射,用来约束字段的类型,可以根据数据自动创建。相当于数据库中的Schema

l   Primary Shard:主分片,索引中的每个文档属于一个单独的主分片,主分片的数量决定了索引最多能存储多少数据。

l   Rreplica Shard:即复制分片,它是主分片的一个副本,可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。

SegmentsLucene index是由许多segments构成,每个segment都是一个write-once,read many times(类似于HDFS文件,写完后不可修改)。每个segment都是一个小的Lucene indexSegment merge就是利用多个小的segments来合并为一个大的、新的segment的过程,新的segment包含有旧的segments。每次merge消耗资源大,因为lucene要重写它。在删除docement的过程中,其实Lucene只是将该document标记为deleted,然后在segment merge的过程中,被标记为deleteddocment会从物理上移除。


相关文章

K8S中 CNI 插件的解读

K8S中 CNI 插件的解读

一.CNI是什么首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。它是 K8s 中标准的一个调用网络实现的接口。Kubel...

apache Hbase2.x  使用hbck2修复工具

apache Hbase2.x 使用hbck2修复工具

1、背景默认情况下apache hbase 使用hbck2时,无法使用-j 来加载hbck2的jar包,无法进行修复2、解决办法是由于默认情况下只使用自带的hbase hbck修复命令,大部分功能在2...

kubebuilder 开发operator初探

1、使用kubebuilder初始化$ mkdir project$ cd project$ kubebuilder init --domain tutorial.kubebuilder.io --r...

flume性能调优

1.Source性能调优1.1 Spooldir Source使用Spooldir Source采集日志数据时,若每行日志数据<100bp,可以通过将多行合并传输来提升传输性能建议合并时根据数据...

ES运维(二)字段类型与内存管理

ES运维(二)字段类型与内存管理

一、ES常见字段类型1、 概述字段是数据存储的最小微粒,根据数据的性质不同将数据分成不同的字段类型,熟悉不同字段类型的特性,对索引的Mapping设计、查询调优都极其重要。2、 关键参数In...

ranger对接hbase 处理class not found

ranger对接hbase 处理class not found

hbase 2.1版本在配置ranger插件,重启hbase时,hmaster无法正常启动,日志显示meta region is in state OPENING此时查看regionserver 中日...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。