大数据-ES读写数据原理

ES写数据简单流程

1.客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)。
2.coordinating node 对 document 进行路由(hash取模),将请求转发给对应的 node(primary shard)。
3.node上的primary shard 处理请求,然后将数据同步到 replica node,如果有多个副本,则并行执行。
4.primary node 和所有 replica node 都执行完操作之后,coordinating node确认成功完成对客户端的请求。

写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

ES写数据底层原理

  1. 数据先写入内存 buffer,在 buffer 里的时候数据是搜索不到的;同时将数据写入 translog 日志文件。
    1.1 数据写入内存 buffer,如果 buffer 快满了,或者到一定时间,refresh将内存 buffer中的数据生成segment file并写入os cache,此时segment file可被打开以供search查询读取,这样文档就可以被搜索到了(注意,此时文档还没有写到磁盘上);
    然后,内存buffer的内容就会被清空。refresh实现的是文档从内存移到文件系统缓存的过程。设置参数(“refresh_interval” : “1s” 默认值为1秒)。
    1.2 数据写入 translog 日志文件,translog记录的是已经在内存生成(segments)并存储到os cache但是还没写到磁盘的那些索引操作;
    translog本身也是磁盘文件,需要定时落盘(fsync),默认是每5秒钟主动进行一次translog fsync (参数:index.gateway.local.sync 默认是5s)。

  2. 重复以上操作,每次一条数据写入buffer,同时会写入一条日志到translog中去。buffer每次refresh一次,就会产生一个segment file,segment file会越来越多,此时会定期执行merge;
    translog文件会不断的变大,当达到一定的程度之后,就会触发commit操作。
    2.1 每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,这里会写一个commit point,标识所有新的segment file,同时删除旧的segment file。如果是删除操作,会生成一个.del文件,里面将某个doc标识为deleted状态,那么搜索的时候根据.del文件就知道这个doc被删除了;如果是更新操作,就是将原来的doc标识为deleted状态,然后新写入一条数据。
    2.2 translog触发commit操作
    2.2.1. 执行refresh操作,将内存buffer中的数据生成segment file并写入os cache,然后打开本segment以供search使用,最后再次清空mem buffer。
    2.2.2. 一个commit point被写入磁盘,这个commit point中标明所有的index segment。
    2.2.3. filesystem cache(os cache)中缓存的所有的index segment文件被fsync强制刷到磁盘os disk,当index segment被fsync强制刷到磁盘上以后,就会被打开,供查询使用。
    2.2.4. translog被清空和删除,创建一个新的translog。

ES读数据过程

通过 doc id 查询,根据 doc id 进行 hash,得出数据所在shard,再使用随机轮询算法得出具体从哪一个主副分片读取数据。

客户端发送请求到任意一个 node,成为 coordinate node。coordinate node 对 doc id 进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡。接收请求的 node 返回 document 给 coordinate node。coordinate node 返回 document 给客户端。

ES搜索数据过程

1.客户端发送请求到一个 coordinate node。
2.协调节点将搜索请求转发到所有的 shard 对应的 primary shard 或 replica shard。
3.query phase:每个 shard 将自己的搜索结果(其实就是一些 doc id)返回给协调节点, 由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
4.fetch phase:接着由协调节点根据 doc id 去各个节点上拉取实际的 document 数据,最终返回给客户端。

translog相关参数

index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush。默认是 unlimited。
index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作。默认是512mb。
index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m。
index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作(数据写入translog,上面的参数是对segment file操作)。es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值