ES架构模型

南墨12个月前技术文章428

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会从物理上移除。


相关文章

MySQL 在线开启 GTID

MySQL 在线开启 GTID

描述生产环境上也会遇到需要开启 GTID ,有什么风险?如何在线开启?本篇 SOP 将介绍。GTID 限制由于基于 GTID 复制依赖于事务,所有开启 GTID 时,有些 MySQL 特性不支持:事务...

stress压测工具

1、stress 概述stress是一个linux的压力测试工具,主要用来模拟系统负载较高时的场景,用于对系统的CPU、IO、内存、负载、磁盘等进行压力测试2、安装yum install -y epe...

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

proxysql作为一个程序,本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。可以在多个节点上部署proxysql,在proxysql之前再加一层负...

Hbase预分区

Hbase预分区

HBase 的数据物理存储格式为多维稀疏排序 Map, 由 key 及 value 组成:key 的构成: rowkey+column family+column qualifier+timestam...

TEZ常见调优参数

一、设置引擎为Tez参数:参数默认值推荐值参数说明解释hive.execution.enginemr请根据具体的业务场景进行选择执行引擎选择使用tez引擎时,此值设置为tezhive.tez.log....

K8s数据持久化

K8s数据持久化

一、为什么需要持久化为了解决pod里面的容器被删除后数据不丢失,则引入了存储类型,类似于docker中的数据卷。在kubernetes集群中,其是支持多种存储类型,包括但不限于emptyDir,Hos...

发表评论    

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