黑马程序员技术交流社区

标题: ElasticSearch读写原理 [打印本页]

作者: 小江哥    时间: 2019-7-24 19:17
标题: ElasticSearch读写原理
读写原理:
es 写数据过程

客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)
coordinating node,对 document 进行路由,将请求转发给对应的 node(有 primary shard)
实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node
coordinating node,如果发现 primary node 和所有 replica node 都搞定之后,就返回响应结果给客户端

es 读数据过程
查询,GET 某一条数据,写入了某个 document,这个 document 会自动给你分配一个全局唯一的 id,doc id,同时也是根据 doc id 进行 hash 路由到对应的 primary shard 上面去。也可以手动指定 doc id,比如用订单 id,用户 id。
你可以通过 doc id 来查询,会根据 doc id 进行 hash,判断出来当时把 doc id 分配到了哪个 shard 上面去,从那个 shard 去查询
1)客户端发送请求到任意一个 node,成为 coordinate node
2)coordinate node 对 document 进行路由,将请求转发到对应的 node,此时会使用 round-robin 随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡
3)接收请求的 node 返回 document 给 coordinate node
4)coordinate node 返回 document 给客户端

写数据底层原理

先写入 buffer,在 buffer 里的时候数据是搜索不到的;同时将数据写入 translog 日志文件
如果 buffer 快满了,或者每隔一秒钟,就会将 buffer 数据 refresh 到一个新的 segment file 中并清空 buffer,但是此时数据不是直接进入 segment file 的磁盘文件的,而是先进入 os cache 的。当数据进入 os cache 后,就代表该数据可以被检索到了。因此说 es 是准实时的,这个过程就是 refresh。
只要数据进入 os cache,此时就可以让这个 segment file 的数据对外提供搜索了

重复 1~3 步骤,新的数据不断进入 buffer 和 translog,不断将 buffer 数据写入一个又一个新的 segment file 中去,每次 refresh 完 buffer 清空,translog 保留。随着这个过程推进,translog 会变得越来越大。当 translog 达到一定长度的时候,就会触发 commit 操作。
commit 操作(也叫 flush 操作,默认每隔 30 分钟执行一次):执行 refresh 操作 -> 写 commit point -> 将 os cache 数据 fsync 强刷到磁盘上去 -> 清空 translog 日志文件
commit 操作保证了在机器宕机时,buffer 和 os cache 中未同步到 segment file 中的数据还可以在重启之后恢复到内存 buffer 和 os cache 中去,

translog 其实也是先写入 os cache 的,默认每隔 5 秒刷一次到磁盘中去,所以默认情况下,可能有 5 秒的数据会仅仅停留在 buffer 或者 translog 文件的 os cache 中,如果此时机器挂了,会丢失 5 秒钟的数据。但是这样性能比较好,最多丢 5 秒的数据。也可以将 translog 设置成每次写操作必须是直接 fsync 到磁盘,但是性能会差很多。
如果是删除操作,commit 的时候会生成一个.del 文件,里面将某个 doc 标识为 deleted 状态,那么搜索的时候根据.del 文件就知道这个 doc 被删除了
如果是更新操作,就是将原来的 doc 标识为 deleted 状态,然后新写入一条数据
buffer 每次 refresh 一次,就会产生一个 segment file,所以默认情况下是 1 秒钟一个 segment file,segment file 会越来越多,此时会定期执行 merge, 当 segment 多到一定的程度时,自动触发 merge 操作
每次 merge 的时候,会将多个 segment file 合并成一个,同时这里会将标识为 deleted 的 doc 给物理删除掉,然后将新的 segment file 写入磁盘,这里会写一个 commit point,标识所有新的 segment file,然后打开 segment file 供搜索使用,同时删除旧的 segment file。








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2