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

es flush时间 和 translog fsync时间的疑惑

Elasticsearch | 作者 liyc98 | 发布于2018年04月02日 | 阅读数:10041


8d99ea2aa19ed5d0abbd3fe7fb5e053.png


80c3ef2ad10f084a34c10cb6b6d2363.png

 
 我的理解,flush其实就是将translog中的数据fsync到磁盘,那这个两个时间是不是矛盾,或者应该怎么理解
已邀请:

medcl - 今晚打老虎。

赞同来自: laoyang360 liyc98

这个算是以前的机制了,flush 目的是调用并清理 translog 的事务,确保索引文件的成功写入。flush 操作成功之后会清理本地的 translog 文件。translog 日志也是文件,而 fsync ​是保证该日志文件落地到磁盘,保证该数据可靠不丢。
 
不过在6.0之后,为了实现 SequenceIDs 机制,translog 不再被立即清除,而是会保留在本地,并按大小和过期时间进行定期清理。默认512MB 大小和 12 小时的时间窗口,注意分片的磁盘占用会变大。
 
另外现在默认的参数为了数据一致性,是每次写操作会主动调用一次 fsync,这个是有开销的,会影响索引速度,可以修改参数 index.translog.durability 为 async,风险自理,可参见文档:https://www.elastic.co/guide/e ... tings
 
 

yayg2008

赞同来自: shjdwxy thewind

这个问题最初我也没弄清楚。但是最近研究节点恢复过程,终于弄明白了:
translog记录的是已经在内存生成了segments但是还没写到磁盘的那些索引操作,此时新写入的数据可以被搜索到,但是当节点挂掉后segments的数据会丢失,需要从trangslog恢复。
相应的,translog的写入也可以设置,默认是request,每次请求都会写入磁盘(fsync),这样就保证所有数据不会丢,但写入性能会受影响;如果改成async,则按照配置触发trangslog写入磁盘,注意这里说的只是trangslog本身的写盘。
translog什么时候清空?默认是512mb,或30分钟。这个动作就是flush,同时伴随着segment提交(写入磁盘)。flush之后,这段translog的使命就完成了,因为segment已经写入磁盘,就算故障,也可以从segment文件恢复。
另外,有一个/_flush/sync命令,在做数据节点维护时很有用。其逻辑就是flush translog并且将sync_id同步到各个分片。可以实现快速恢复。
综述:fsync指的是translog本身被写入磁盘的动作;flush指的是逻辑上的刷新,包含一系列逻辑操作。
节点恢复相关的,有兴趣可以查看:https://zhuanlan.zhihu.com/p/35225828
 

kennywu76 - Wood

赞同来自: laoyang360

flush指的是将底层的索引文件(segment file)持久化到磁盘,从而可以清除掉translog的过程。 而translog的的fsync指的是将translog文件本身持久化到磁盘的一个系统调用,和segment file的持久化是两回事情。

ESWorker

赞同来自:

首先你要理解flush的意思(冲刷)。
而fsync,我个人的理解是将translog文件同步写入磁盘的过程。它的出发条件很多,所以间隔要小,才能防止数据丢失。
其实flush API的作用是强制停止translog的fsync行为,提交segment并清除translog。间隔要尽量大一点(需要优化写速度的话,就稍微调大一点flush间隔。)
所以fsync行为是translog平时进行的持久化行为,而flush只是一种强制行为,一般手动执行的话,是在关闭节点前进行的,确保数据全部写入磁盘。
虽然这两种方式都在操作translog,但理解起来要从作用出发,而不是关注translog。
纯属个人理解,希望对你有所帮助。

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

  • flush定义:事务日志 (transcation log)中的信息与存储介质之间的同步(同时清空事务日志);

 
  • 30分钟定义:index_translog.flush_threshold_period该参数对应的默认值,它控制了强制自动事务日志刷新的时间间隔(即便是没有新数据写入)。强制进行事务日志刷新通常会导致大量的IO操作,因此有时当事务日志涉及少量数据时,更适合进行频繁的事务日志刷新操作。

 
  • 5S的定义:index.gateway.local.sync参数的对应值,该参数定义了通过fsync系统调用同步事务日志数据的频率,默认5s一次。

liyc98 - 80後,IT男

赞同来自:

谢谢各位大佬,理解了

要回复问题请先登录注册