老师,ES写数据,segment写入磁盘与translog写入磁盘问题?
来源:10-2 写性能优化

慕雪839906
2018-08-09
老师,ES写数据,segment写入磁盘与translog写入磁盘问,他俩都是把读取的文件写入磁盘,不会有冲突么,segment记录的数据不是跟translog中的一样的么?还有就是如果读取的数据都会存入到translog中的话,即使没有执行fsync操作入盘,重启服务器后应该还是会重新把tranlog中的数据fsync到磁盘的吧?这块会有数据丢失的情况么?除非是segment没有写入磁盘,translog中又没有记录到的数据才会出现数据丢失的情况吧?对讲的这块逻辑,一直有点不太理解具体的流程和原理?
2回答
-
segment 和 translog 最终肯定都是写文件,但是两者是各自写各自的,不相干, segment 是索引类的文件,在写之前要经过大量的计算,比如分词、构建倒排索引等,它存的是索引相关的数据,而 translog 只是简单的追加数据增删改的操作记录,只是为了后面服务意外中止时通过回放这个记录来减少数据的丢失。讲到这里你第一个问题就解决了,segment 记录的数据与 translog 是不一样的。
那么涉及到写文件逻辑就一样了,都要 fsync 后才能保证真正落盘不丢数据,fsync 前数据是存在 OS 文件系统 Cache 里面的,如果服务意外中止,那么这部分数据就丢失了,即便重启也不会再 fsync。因此 translog 其实也是会丢数据的,所以才有translog 的相关参数(index.translog.sync_interval)来控制它 fsync 的频率,这个频率越高,丢的数据就越少。降到这里你第二个问题就解决了。translog 一样会丢数据,你要设置好相关参数,确保自己可用接受相应的数据丢失。
translog 就是用来解决所谓容灾问题的。
122018-08-09 -
rockybean
2018-08-09
另外建议问问题的时候可以 1 2 3列出来,会清晰一些,方便交流
012018-08-09
相似问题