有个人长的像洋葱,走着走着就哭了…….

大佬们,有一个疑惑,既然在写入文档时,有机会和时间去写translog到磁盘,为什么还要再费劲去写内存呢?

Elasticsearch | 作者 tianhuang101 | 发布于2019年11月04日 | 阅读数:3221

系统提示:这个人太懒了,什么问题描述都没有写!

已邀请:

rochy - rochy_he

赞同来自: tianhuang101

请参考下面的文章,主要的原因还是因为 translog 是为了防止内存中的数据意外断电丢失
 
https://www.ezlippi.com/blog/2 ... .html
https://elasticsearch.cn/question/3724

lu_xiao_xi

赞同来自: tianhuang101

个人认为这是对分布式应用的一个很好的实践吧,保证数据不丢失的同时尽量提高性能...
写buffer可以直接响应,提高响应性能。。但是又不能丢失内存数据,所以再写一份持久化log。。。最后,最终一致性(刷盘或重启读log)落盘segment.

zqc0512 - andy zhou

赞同来自: tianhuang101

性能与可靠性之间的博弈

zgq25302111 - github.com/zgq25302111

赞同来自: tianhuang101

如果仅写translog到磁盘,不写内存,下次访问必须读磁盘,速度慢,写入内存加快访问速度。
但又不能仅仅写入内存,如果这样一旦断电数据全丢。
结论:写内存同时写磁盘。

huangcy

赞同来自:

5秒写一次translog,30分钟才flush一次cache。应该是能说明磁盘写translog比flush segment要轻量。
translog应该只是把index的命令存储下来,就像put /index -d '{xxx}' 遇到意外恢复时,重放索引api就行了。(个人理解,并没看源码或官方文档印证)
而segment则是已经完全构建好的lucence索引,比较大。
translog类似redis持久化中的aof,而系统缓存中的segment是快照,类似redis中的rdb。

要回复问题请先登录注册