Elasticsearch(简称ES)是一个基于Lucene的分布式搜索和分析引擎,它提供了强大的全文搜索、结构化搜索、分析以及各种数据操作功能。以下是关于ES读写数据的详细说明:

写数据过程

客户端请求

客户端选择一个节点(coordinating node)发送写请求。

路由机制

coordinating node 使用文档ID(doc ID)进行路由,确定文档属于哪个分片(shard)。

通过集群状态中的内容路由表信息获知该分片的主分片(primary shard)位置,并将请求转发到主分片所在节点。

主分片处理

主分片节点接收请求并执行写操作。

如果写入成功,主分片节点将请求并行转发到所有副本(replica)节点,等待副本写入成功。

响应

所有副分片写入成功后,主分片节点向协调节点报告成功。

协调节点向客户端返回成功响应。

读数据过程

客户端请求

客户端发送读取请求到任意一个节点,该节点成为协调节点。

路由机制

协调节点使用文档ID进行哈希路由,确定文档属于哪个分片。

通过集群状态中的内容路由表信息获知该分片的副本信息,并随机选择一个副本节点进行读取。

副本节点处理

接收请求的副本节点返回文档给协调节点。

响应

协调节点将文档返回给客户端。

其他注意事项

负载均衡:在读取数据时,协调节点会使用轮询(round-robin)算法在主分片及其所有副本中随机选择一个,以实现负载均衡。

缓存机制:ES使用OSCache(操作系统的缓存)来缓存数据,提高读取性能。数据写入后,首先写入OSCache,然后每隔一段时间(默认1秒)将数据刷新到磁盘。

示例流程

写入单个文档

1. 客户端发送写请求到协调节点。

2. 协调节点确定文档ID对应的分片,并将请求转发到主分片节点。

3. 主分片节点执行写操作,并将请求转发到所有副本节点。

4. 所有副本节点写入成功后,主分片节点向协调节点报告成功。

5. 协调节点向客户端返回成功响应。

读取单个文档

1. 客户端发送读取请求到协调节点。

2. 协调节点确定文档ID对应的分片,并随机选择一个副本节点。

3. 副本节点返回文档给协调节点。

4. 协调节点将文档返回给客户端。

通过上述流程,ES能够高效地进行数据的读写操作,并确保数据的高可用性和一致性。