ElasticSearch是分布式搜索引擎,可以存储、检索、搜索、统计数据。
那使用ES主要原因是:1、全文检索 2、快
这篇文章主要讲解为什么快?
首先明确ElasticSearch快在搜索是近实时的,文档的CRUD也是实时的。
一、ES的基本架构图及基础概念:
-
Index 索引
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。
它是个逻辑命名空间,类似于数据库概念中的数据库。 -
Type 类型
类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。
类似于数据库概念中的一张表。 -
**Document 文档 **
文档是索引和搜索的原子单位,它是包含了一个或多个域(Field)的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。
每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。
它是具体事实数据的体现,类似于数据库概念中的 一条记录。 -
SHARD 分片
• index包含多个shard,每个shard都是一个最小工作单元,承载部分数据
• 每个shard都是一个lucene实例,有完整的建立索引和处理请求的能力。
• 增减节点时,shard会自动在nodes之间负载均衡
• shard分为primary shard和replica shard,每个document只存在于某一个primary shard以及其对应的replica shard中
• replica shard是primary shard的副本,负责容错,以及承担读请求负载提高搜索性能。
• primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改,primary shard的默认数量是5,replica默认是1,默认有10个shard,5个primary shard,5个replica shard -
translog
事务日志,在每一次对 Elasticsearch 进行操作时均进行了日志记录。作为临时文件存储在硬盘上。理想中应该是任何一次写入都刷入磁盘,但是性能考虑不可能。实际上是每几秒中调用一次fsync刷到磁盘来提高吞吐量。这当然带来了丢失数据的可能。
二、文档写入速度快
1、当Client有一个writing request时,ES cluster接受到request之后是如何运作的
首先明确新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的 复制分片上。复制分片只能负载读请求。
其中ES如何决定文档去存在哪个主分片上呢?
进程不能是随机的,因为我们将来要检索文档。其实是由一个简单的算法决定:
shard = hash(routing) % number_of_primary_shards
routing 值是一个任意字符串,它默认是 _id 但也可以自定义
下面我们罗列在主分片和复制分片上成功新建、索引或删除一个文档必要的顺序步骤:
- 客户端给 Node 1 发送新建、索引或删除请求。
- 节点使用文档的 _id 确定文档属于分片 0 。