再次优化的写入流程
- 数据写入
buffer
缓冲和translog
日志文件
- 每隔一秒钟,
buffer
中的数据被写入新的segment file
,并进入os cache
,此时segment
被打开并供search
使用
buffer
被清空
- 重复1~3,新的
segment
不断添加,buffer
不断被清空,而translog
中的数据不断累加
- 当
translog
长度达到一定程度的时候,commit
操作发生
5.1.buffer
中的所有数据写入一个新的segment
,并写入os cache
,打开供使用
5.2.buffer
被清空
5.3. 一个commit ponit
被写入磁盘,标明了所有的index segment
5.4.filesystem cache
中的所有index segment file
缓存数据,被fsync
强行刷到磁盘上
5.5. 现有的translog
被清空,创建一个新的translog
基于translog
和commit point
,如何进行数据恢复fsync
+清空translog
,就是flush
,默认每隔30分钟flush
一次(时间间隔可以设置),或者当translog
过大的时候(文件大小可设置),也会flush
POST /my_index/_flush
,一般来说别手动flush,让它自动执行就可以了translog
,每隔5秒被fsync一次到磁盘上。在一次增删改操作之后,当fsync在primary shard
和replica shard
都成功之后,那次增删改操作才会成功
但是这种在一次增删改时强行fsync translog
可能会导致部分操作比较耗时,也可以允许部分数据丢失,设置异步fsync translog
PUT /my_index/_settings
{
"index.translog.durability": "async",
"index.translog.sync_interval": "5s"
}