ES入门与核心原理(七)Elasticsearch路由、写入与查询原理

ES入门与核心原理(七)Elasticsearch路由、写入与查询原理

1. document路由

路由算法:shard = hash(routing) % number_of_primary_shards

举个例子,一个index有3个primary shard,P0,P1,P2

  • 每次增删改查一个document的时候,都会带过来一个routing number,默认就是这个document的_id(可能是手动指定,也可能是自动生成)routing = _id,假设_id=1
  • 会将这个routing值,传入一个hash函数中,产出一个routing值的hash值,hash(routing) = 21,然后将hash函数产出的值对这个index的primary shard的数量求余数,21 % 3 = 0,就决定了,这个document就放在P0上。
  • 决定一个document在哪个shard上,最重要的一个值就是routing值,默认是_id,也可以手动指定,相同的routing值,每次过来,从hash函数中,产出的hash值一定是相同的无论hash值是几,无论是什么数字,对number_of_primary_shards求余数,结果一定是在0~number_of_primary_shards-1之间这个范围内的。0,1,2。

_id or custom routing value

默认的routing就是_id;也可以在发送请求的时候,手动指定一个routing value,比如说put /index/type/id?routing=user_id

手动指定routing value是很有用的,可以保证说,某一类document一定被路由到一个shard上去,那么在后续进行应用级别的负载均衡,以及提升批量读取的性能的时候,是很有帮助的。

这也是为什么primary shard数量不可变的原因。

2. ES写入数据及其刷盘原理

ES写入数据流程如下:

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

写入流程---刷盘原理

(1)数据写入buffer缓冲和translog日志文件
(2)每隔一秒钟,buffer中的数据被写入新的segment file,并进入os cache,此时segment被打开并供search使用
(3)buffer被清空
(4)重复1~3,新的segment不断添加,buffer不断被清空,而translog中的数据不断累加
(5)当translog长度达到一定程度的时候,commit操作发生
  (5-1)buffer中的所有数据写入一个新的segment,并写入os cache,打开供使用
  (5-2)buffer被清空
  (5-3)一个commit ponit被写入磁盘,标明了所有的index segment
  (5-4)filesystem cache中的所有index segment file缓存数据,被fsync强行刷到磁盘上
  (5-5)现有的translog被清空,创建一个新的translog

fsync+清空translog,就是flush,默认每隔30分钟flush一次,或者当translog过大的时候,也会flush。

POST /my_index/_flush,一般来说别手动flush,让它自动执行就可以了。

translog,每隔5秒被fsync一次到磁盘上。在一次增删改操作之后,当fsync在primary shard和replica shard都成功之后,那次增删改操作才会成功。

但是这种在一次增删改时强行fsync translog可能会导致部分操作比较耗时,也可以允许部分数据丢失,设置异步fsync translog。

每次merge操作的执行流程

  • 选择一些有相似大小的segment,merge成一个大的segment
  • 将新的segment flush到磁盘上去
  • 写一个新的commit point,包括了新的segment,并且排除旧的那些segment
  • 将新的segment打开供搜索
  • 将旧的segment删除

3. ES查询数据原理

  • 客户端发送请求到任意一个node,成为coordinate node
  • coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡
  • 接收请求的node返回document给coordinate node
  • coordinate node返回document给客户端
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值