1.document先写入导内存buffer中,同时写translog日志,每隔一秒钟把buffer中的数据刷入index segment file中,index segment file中的数据会立马进入os cache中,内存buffer被清空,此时,segment 中的文件就可以呗搜索了,这就意味着document从被写入到可以被搜索需要一秒种,如果要更改这个属性,可以执行以下操作
PUT /my_index
{
"settings": {
"refresh_interval": "30s"
}
}
segment file会越来越多,os cache中积累了很多segment file,translog日志也会越来越多,当translog日志大小大于一个阀值时候,会出发flush操作。flush操作先会执行commit操作,commit操作先会把buffer中现有的文件全部写入到segment中,然后会有一个叫commit point被写入到磁盘上,这个表明有哪些segment。然后就把os cache中的数据强行刷到磁盘上(fsync),现有translog日志文件清空。此时数据已经被持久化
fsync+清空translog,默认每隔30分钟执行一次,或者translog过大的时候也会执行
我们也可以用_flush命令手动执行
translog每隔5秒回被写入磁盘。在一次增删改操作之后只有在replica和primary shard都成功才会成功,如果要提高操作速度,可以设置成异步的
PUT /my_index
{
"settings": {
"index.translog.durability": "async" ,
"index.translog.sync_interval":"5s"
}
}
2.基于translog和commit point的数据恢复
在磁盘上会有一个上次持久化的commit point,translog上有一个commit point,根据这两个commit point,会把translog中的变更记录进行回放,重新执行之前的操作
3.删除原理,
删除的数据会被标记为del,放倒一个专门的segment中
4.merge操作
由于没秒会把buffer刷到segment中,所以segment会很多,为了防止这种情况出现,es内部会不断把一些相似大小的segment合并,并且物理删除del的segment,
当然也可以手动执行
POST /my_index/_optimize?max_num_segments=1,尽量不要手动执行,让它自动默认执行就可以了