ES 简介
ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 ElasticStack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。目前市面上很多知名平台都在使用ES!
今天我们一起来了解一下ES文档操作的具体过程吧!
前置知识
为了更好地了解接下来的内容,我们先来熟悉一下ES中分片相关的概念:
- 分片
假设一个索引不对其进行拆分,而是存储在单个节点上,那么,当数据量大到一定程度时,将没有任何机器可以单独存储如此庞大的数据量。因此,我们很容易可以想到采用分布式存储的方式,将数据都分散到不同的机器上,实际ES也是这样做的。
为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片,当我们创建索引时,可以指定想要的分片数量。注意,每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。 - 副本
分片解决的只是单台机器存储数据量能力有限的问题,并没有解决数据安全的问题,假设我们每个分片只有一个份,那当我们某台机器宕机或者磁盘损坏时,那存储于该台机器的分片岂不是凉凉了?因此Elasticsearch 允许我们创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本),副本分片将会存储在不同于主分片的节点上,以此来提高安全性。
ES 写过程
- 如图所示,假设客户端把新建/索引/删除请求发送给了Node1,称Node1为协调节点,Node1接收到请求后,先会通过文档的_id值确定其属于哪个分片,本示例确定其在0分片,因此Node1就把请求转发到Node3节点,因为0主分片正位于Node3节点。
- Node3节点接收到请求后,会对请求执行处理,处理成功再把请求并行转发到Node1和Node2的副本分片上
- 待所有的副本分片都报告成功后,Node3会向协调节点Node1报告成功,协调节点再向客户端报告成功。
ES 读过程
- 客户端先把读请求发送给协调节点Node1
- Node1接收到请求后,先通过_id确定目标文档所在的分片,确定在0分片上后,由于0分片在三个节点上都有分布,因此进行负载均衡,选择一个节点来处理本次请求,这次选择了Node2节点,因此本请求转发到Node2节点上
- Node2接受到请求后,查找到目标文档,将文档先返回给协调节点Node1,随即Node1把数据返回给客户端
注: 在处理读取请求时,协调结点在每次请求的时候,会通过轮询所有的副本分片来达到负载均衡。
ES 更新过程
- 客户端向协调节点Node1发送更新请求
- 同读写操作,Node1会把请求转发到目标文档所在的主分片上(本次在Node3上)
- Node3接收到请求后,会检索到目标文档,然后修改_source字段中JSON,并且尝试重新索引新的文档,如果这时候检测到文档已经被修改,会重试步骤3(CAS的思想),超过retry_on_conflict次后会放弃
- 如果Node3更新文档成功后,会把新版本的文档转发到Node2和Node1,Node2以及Node1再重新建立索引,所有副本操作成功后,Node3会向协调节点报告成功,协调节点向客户端报告成功。
注: 主分片在给副本分片转发更新时,不是直接转发更新请求,而是转发整个新版本的文档,这样做主要因为在复杂的网络环境下,我们不能保证请求报文到达的顺序,若我们直接转发更新请求,那么在请求到达顺序错乱的情况下,就会产生写丢失的问题。
多文档操作流程
mget(Multi Get)操作
- 示例
GET /{index}/_mget
{
"docs": [
{
"_index": "index1",
"_type": "type1",
"_id": "1"
},
{
"_index": "index2",
"_type": "type2",
"_id": "2"
},
...
]
}
- 执行流程
- 客户端会先向协调节点Node1发送mget请求
- Node1接收到请求后,根据目标文档所在分片为各分片构造多文件获取请求,然后向各分片发送请求
- 待Node1拿到各节点的响应后,会把各分片的查询结果进行封装,把最终的响应结果返回给客户端
Bulk API
- 示例
POST /_bulk
{
"index" : { "_index" : "myindex", "_id" : "1" }
}
{
"field1" : "value1"
}
{
"update" : { "_index" : "myindex", "_id" : "2" }
}
{
"doc" : { "field2" : "value2" }
}
{
"delete" : { "_index" : "myindex", "_id" : "3" }
}
- 执行流程
- 客户端先向协调节点Node1发送bulk请求
- Node1为每个节点构造批量请求,随即把这些请求发送到各主分片所在的节点上
- 各节点按顺序执行批量请求中的操作,执行完成每个操作,会把更改同步到副分片当中,然后继续执行下一个操作。当所有副本分片报告所有操作均已完成后,该节点向协调节点报告成功
- 所有操作均已完成后,协调节点将所有响应整理封装并返回给客户端
总结
今天主要阐述了ES中一些基本操作的执行流程,我们接下来会对ES其他内容进行展开,一起学习!
对于ES在项目中的应用,可以参考一下此项目:
Txing组团-微服务
好啦 天下没有不散的宴席 今天就到这里啦 我们改天再会 谢谢!