ES架构模型
1.整体架构
Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许您快速、近实时地存储、搜索和分析大量数据。它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术。Elasticsearch服务的主要组成部分如图3-1所示。
对Elasticsearch Nodes进行了种类划分:EsMaster、EsNode1~9和EsClient。在安全模式下Elasticsearch具备基于用户/角色划分的安全认证与鉴权功能。
集群服务职责规划:
1. Master:Elasticsearch的主节点,负责Master选举和集群管理。
2. Node:Elasticsearch的数据节点,负责数据索引和搜索。
2. ZooKeeper:服务维护安全模式下Elasticsearch集群的认证与鉴权等相关信息。
本文重点关注的是Elasticsearch写入索引和查询数据的性能问题,基于以上的组件框架图,下面来了解一下Elasticsearch写入索引和查询索引数据的具体流程。
2. 索引流程
写入索引流程如图3所示。
过程描述:
1. 客户端发送一个请求给任意节点,假设是Node 1。
2. Node 1通过请求判断出该文档应该被存储的分片,假设是shard 0这个分片,因此Node 1会把请求转发到shard 0的primary shard P0存在的Node 3节点上。
3. Node 3在shard 0的primary shard P0上执行请求。如果请求执行成功,Node 3并行地将请求发给shard 0的所有存在于Node 1和Node 2中的replica shard R0上。如果所有的replica shard都成功地执行了请求,那么将会向Node 3回复一个确认成功,当Node 3收到了所有replica shard的确认信息后,则向用户返回一个Success消息。
3. 查询流程
Elasticsearch查询流程分为两个阶段,即查询(query)阶段与提取(fetch)阶段。
查询阶段流程如图所示。
过程描述:
1. 客户端发送一个检索请求给任意节点,假设是Node 3。
2. Node 3将检索请求发送给该index中的每一个shard,此时会采取轮询策略,在primary shard及其所有replica shard中随机选择一个,让读请求负载均衡。每个shard在本地执行检索,并将结果排序添加到本地。
3. 每个shard返回本地所记录的结果,发送给Node 3。Node 3将这些值合并,做全局排序。
查询阶段主要定位了所要检索数据的具体位置,而提取阶段的任务就是将这些定位好的数据内容取回并返回给客户端。提取阶段如图3-4所示。
过程描述:
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取回文档。
Segments:Lucene index是由许多segments构成,每个segment都是一个write-once,read many times(类似于HDFS文件,写完后不可修改)。每个segment都是一个小的Lucene index。Segment merge就是利用多个小的segments来合并为一个大的、新的segment的过程,新的segment包含有旧的segments。每次merge消耗资源大,因为lucene要重写它。在删除docement的过程中,其实Lucene只是将该document标记为deleted,然后在segment merge的过程中,被标记为deleted的docment会从物理上移除。