ES 写数据底层原理

1)document先写入导内存buffer中,同时写translog日志

2))https://www.elastic.co/guide/cn/elasticsearch/guide/current/near-real-time.html

refresh操作所以近实时搜索:写入和打开一个新段(一个追加的倒排索引)的轻量的过程叫做 refresh 每隔一秒钟把buffer中的数据创建一个新的segment,这里新段会被先写入到文件系统缓存--这一步代价会比较低,稍后再被刷新到磁盘--这一步代价比较高。不过只要文件已经在缓存中, 就可以像其它文件一样被打开和读取了,内存buffer被清空。此时,新segment 中的文件就可以被搜索了,这就意味着document从被写入到可以被搜索需要一秒种,如果要更改这个属性,可以执行以下操作

PUT /my_index
{
  "settings": {
    "refresh_interval": "30s" 
  }
}
3)https://www.elastic.co/guide/cn/elasticsearch/guide/current/translog.html

flush操作导致持久化变更:执行一个提交并且截断 translog 的行为在 Elasticsearch 被称作一次 flush刷新(refresh)完成后, 缓存被清空但是事务日志不会。translog日志也会越来越多,当translog日志大小大于一个阀值时候或30分钟,会出发flush操作。

  • 所有在内存缓冲区的文档都被写入一个新的段。
  • 缓冲区被清空。
  • 一个提交点被写入硬盘。(表明有哪些segment commit了)
  • 文件系统缓存通过 fsync 到磁盘。
  • 老的 translog 被删除。

分片每30分钟被自动刷新(flush),或者在 translog 太大的时候也会刷新。也可以用_flush命令手动执行

translog每隔5秒会被写入磁盘(所以如果这5s,数据在cache而且log没持久化会丢失)。在一次增删改操作之后translog只有在replica和primary shard都成功才会成功,如果要提高操作速度,可以设置成异步的

PUT /my_index
{
  "settings": {
    "index.translog.durability": "async" ,

    "index.translog.sync_interval":"5s"
  }
}

所以总结是有三个批次操作,一秒做一次refresh保证近实时搜索,5秒做一次translog持久化保证数据未持久化前留底,30分钟做一次数据持久化。

标签: translog、refresh、flush、guide、写入、面试
  • 回复
隐藏