【分布式搜索引擎】Elasticsearch写入和读取数据过程

1、Elasticsearch写人数据的过程java

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都搞定以后,就返回响应结果给客户端node

 

2、Elasticsearch读取数据的过程算法

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

1.写入document时,每一个document会自动分配一个全局惟一的id即doc id,同时也是根据doc id进行hash路由到对应的primary shard上。也能够手动指定doc id,好比用订单id,用户id。 2.读取document时,你能够经过doc id来查询,而后会根据doc id进行hash,判断出来当时把doc id分配到了哪一个shard上面去,从那个shard去查询

 

3、Elasticsearch搜索数据过程缓存

es最强大的是作全文检索restful

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

搜索的底层原理:倒排索引

 

4、Elasticsearch写数据的底层原理fetch

1)先写入buffer,在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件。spa

2)若是buffer快满了,或者到必定时间,就会将buffer数据refresh到一个新的segment file中,可是此时数据不是直接进入segment file的磁盘文件的,而是先进入os cache的。这个过程就是refresh。操作系统

每隔1秒钟,es将buffer中的数据写入一个新的segment file,每秒钟会产生一个新的磁盘文件,segment file,这个segment file中就存储最近1秒内buffer中写入的数据。

可是若是buffer里面此时没有数据,那固然不会执行refresh操做咯,每秒建立换一个空的segment file,若是buffer里面有数据,默认1秒钟执行一次refresh操做,刷入一个新的segment file中。

操做系统里面,磁盘文件其实都有一个东西,叫作os cache,操做系统缓存,就是说数据写入磁盘文件以前,会先进入os cache,先进入操做系统级别的一个内存缓存中去。

只要buffer中的数据被refresh操做,刷入os cache中,就表明这个数据就能够被搜索到了。

为何叫es是准实时的?NRT,near real-time,准实时。默认是每隔1秒refresh一次的,因此es是准实时的,由于写入的数据1秒以后才能被看到。

能够经过es的restful api或者java api,手动执行一次refresh操做,就是手动将buffer中的数据刷入os cache中,让数据立马就能够被搜索到。

只要数据被输入os cache中,buffer就会被清空了,由于不须要保留buffer了,数据在translog里面已经持久化到磁盘去一份了。

相关文章
相关标签/搜索