首页新闻动态正文

ElasticSearch读写原理介绍【黑马java培训】

更新时间:2021年03月18日 08时58分22秒 来源:黑马程序员论坛

黑马中级程序员课程





读写原理:

1、es 写数据过程

客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)

coordinating node,对 document 进行路由,将请求转发给对应的 node(有 primary shard)

实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node

coordinating node,如果发现 primary node 和所有 replica node 都搞定之后,就返回响应结果给客户端

2、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 给客户端

3、写数据底层原理

先写入 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。




推荐了解热门课程

java培训Python人工智能Web前端培训PHP培训
区块链培训影视制作培训C++培训产品经理培训
UI设计培训新媒体培训产品经理培训Linux运维
大数据培训智能机器人软件开发


传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。


黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会)零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript软件测试入门到精通


分享到:
在线咨询 我要报名
和我们在线交谈!