前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

垂直化搜索引擎四之ES 写数据流程

qiguaw 2024-11-06 11:35:44 资源文章 14 ℃ 0 评论

前言

前面我们介绍了垂直化搜索引擎三之阅读平台搜索实战,给大家演示了,在小说平台中如何使用ES,来提升用户的搜索体验。这节课让我们快速理解下ES是如何写入数据的?

基础知识

我们知道,ES的数据是分布式存储的。那么当一个客户端请求过来的时候,我们要把数据写到哪台服务器呢?如何才能把数据写到正确的服务器当中。

在解决问题之前,让我们先了解下ES的节点类型,节点根据主要职能,大致有三种类型节点: master主节点、data数据节点、协调节点coordinating node。每个节点都能设置三个类中的一个

master节点

默认情况下任何节点都可以成为master节点。实际上master节点仅有一个, 但是可以设置多个候选的master节点。在节点的配置中设置node.master=true即可将节点设为master主节点。在当前master节点意外退出后, 集群会在候选节点中重新选举一个master主节点。

master节点主要负责创建索引、节点健康状态监控、节点上下线等工作

data数据节点

数据节点负责保存数据、执行数据相关操作。对节点的CPU、内存和IO要求较高。在节点的配置中设置node.data=true, node.master=false即可将节点设为数据节点。数据读写流程只和数据节点交互。

协调节点coordinating node

协调节点用于客户端请求集群时使用,默认情况下任意节点都能成为协调节点, 协调节点会在接受请求的时候根据情况转发给其他节点,并汇总结果返回给客户端,在节点的配置中设置node.data=false, node.master=false即可将节点设为协调节点。 协调节点在汇总数据时也可能需要很高CPU和内存,最好有单独协调节点。

写入流程

大体了解了ES的节点类型后,我们看看ES是如何写数据的。在写入数据之前,我们需要找到协调节点,因为我们需要通过协调节点去找到数据分片的主分片的节点。

  1. 客户端选择任意一个 node 发送请求过去,这个 node 就是 coordinating node (协调节点)
  2. coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard)
  3. 实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node
  4. coordinating node 等到 primary node 和所有 replica node 都执行成功之后,就返回响应结果给客户端。

底层原理

第一阶段写入内存

最开始一个写入请求进来,直接写入内存中的buffer,这样做是为了速度。这时候这份写入数据还不能被查询到。与数据写入buffer并行的是数据写入translog,这是为了提高数据的可靠性。如果这时候buffer里面的数据丢了,translog的数据可以恢复。

  • translog的数据写入的是流水账结构简单速度快。它可以每次记录流水都刷盘,保证数据不丢,但是默认配置是5秒刷盘一次,这样可以提高效率。
  • translog和主流程的区别类似一个银行有两个记账员,主记账员记的总账,比如记录每个用户账号里面还有多少钱,每次要和之前数据比对汇总,次记账员只记录用户干了什么。所以次记账员比较轻松,可以记更加快。如果主记账员的当月账本丢了,次记账员哪里每天做的流水还能恢复主账本。

第二阶段写入OSCache(refresh)

buffer里面的内容每隔1秒钟就生成一个segment,然后es把segment写入OSCache。OSCache是操作系统管理的,也在内存中,如果计算机正常关闭,操作系统会在完成OSCache落盘才关机,如果异常关闭OSCache 数据就会丢失。写入OSCache的数据已经可给操作系统了,已经可以读取到了。es每秒生成一个segment,所以es写入到能够读取到数据之间的延时理论最多1秒。

第三阶段写入磁盘(flush)

OSCache里面的数据并是不可靠的,如果数据丢失,可以通过translog来恢复。前面说了,写入buffer的时候同时在translog里面做了记录,所以translog里面有全部的 位于OSCache中的segment的内容。重放translog就能得到这部分数据。

translog并不能让它无限增长,所以当translog达到一定尺寸,或者一定时间(30分钟),就可以清空一下translog。translog的内容=buffer+OSCache segment。

  • 第一步,把buffer里面的内容refresh成一个新的segment。
  • 第二步,把OSCache里面的segment合并,并且刷盘。
  • 第3步清空translog。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表