es读写底层原理剖析
一 . 根据id从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进行hash后对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法
,在primary shard以及其所有replica node中随机选择一个
,让读请求负载均衡
3)接收请求的node返回document给coordinate node
4)coordinate node返回document给客户端
二. es搜索数据过程
es最强大的是做全文检索,就是比如你有三条数据
java真好玩儿啊 java好难学啊 j2ee特别牛
你根据java关键词来搜索,将包含java的document给搜索出来
es就会给你返回:java真好玩儿啊,java好难学啊
1)客户端发送请求到一个coordinate node
2)协调节点将搜索请求转发到所有的shard
对应的primary shard或replica shard
3)query phase:每个shard将自己的搜索结果(其实就是一些doc id
),返回给协调节点
,由协调节点进行数据的合并、排序、分页
等操作,产出最终结果
4)fetch phase:接着由协调节点,根据doc id去各个节点上拉取实际的document数据
,最终返回给客户端
尤其要注意的这里是先拿的id哟