1、Elasticsearch写原理 / 流程
(1)客户端发送请求写到任意一个节点,则他成为协调节点协调节点 ,对 document 进行路由,将请求转发给对应的 node(有 primary shard)
(2)实际的 node 上的 主分片 处理请求,然后将数据同步到副本分片
(3)协调节点 等到 主节点和所有 副本节点 都执行成功之后,最后返回响应结果给客户端。
2、Elasticsearch更新和 删除原理
删除和更新都是写操作,但是由于 Elasticsearch 中的文档是不可变的, ES 利用 .del 文件 标记文档是否被删除,磁盘上的每个段都有一个相应的.del 文件。
(1)如果是删除操作,文档其实并没有真的被删除,而是在 .del 文件中被标记为 deleted 状态。该文档依然能匹配查询,但是会在结果中被过滤掉。
(2)如果是更新操作,就是将旧的 doc 标识为 deleted 状态,然后创建一个新的 doc。
3、Elasticsearch搜索原理(Query Then Fetch)
(1)Query阶段
客户端发送请求读到任意一个节点则他成为协调节点,协调节点将搜索请求广播到所有的主分片或副本分片,每个分片在本地执行搜索并构建一个优先队列。
接着每个分片返回各自优先队列中 所有文档 id 和 打分值 给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
(2)Fetch阶段
协调节点根据 Query阶段产生的结果,去各个节点查询 文档Id 实际的 document 内容,通过对 文档id 进行哈希路由,将请求转发到对应的 node。最后由协调节点返回结果给客户端。
4、Elasticsearch高并发下读写一致性保障
(1)对于更新操作:可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖