Elasticsearch的写底层原理以及删除更新的原理

一、写数据的底层原理

数据写入的底层流程原理

写底层原理
1、数据先被写进内存buffer,同时这一操作也写进translog中,这时的数据还不可被检索到。
2、每隔1s(这个时间可以调整)进行一次refresh,将buffer内1s的数据写进os cache中,构成一个segment分段,同时清空buffer,这时数据可以被检索到,但由于数据仍然在内存中,若发生故障,数据是可以丢失的。
3、不断地重复上面的步骤,不断产生新的segment,translog也不断的变大。
4、当时间达到30分钟或者translog足够大的时候,进行一次fsync,将内存中所有的segment都写进磁盘中,并删除translog,重新生成新的translog。
由上面可以看得出来,文件存储在内存以及os cache中是不安全的,因此ES引入translog来记录两次fsync之间的操作,以便发生故障,也能恢复数据。
但translog也是存在内存中的,发生故障依然会丢失数据,因此每隔5s或一次请求完成后,translog就会写进磁盘,被写进磁盘后就可以认为是安全复原的,因此只有当translog写入磁盘后,ES才能向客户端反馈成功的信息。
另外每隔1s就产生一个segment,很快分片内就有大量的segment,而搜索时会搜索所有的segment,影响性能,因此ES会自动合并大小相似的segment,同时删除合并的旧segment

二、删除/更新的底层原理

ES的索引是不能改的,删除和更新都不是直接在原索引中执行
每一个segment都会维护一个del文件,用来记录删除的文档。用户发出删除请求后,文档并没有真正被删除,而是del文件中记录被删除的文档,但该文档依然能被检索到,只是在最后过滤掉,当segment合并时,才会真正地删除del标志的文档。
更新文档,首先获取原文档的版本号,然后将修改后的文档和版本号一起写进,这过程和新增相同,同时旧文档也被标志成删除文档,同样能被检索到,只不过最终被过滤掉而已

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值