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能够高效地进行数据的读写操作,并确保数据的高可用性和一致性。