1.上一篇文章中提到index segment只要刷入到os cache后,就打开供查询,这个操作是非常危险的,一旦未将数据刷入到os disk,而此时数据丢失,将会导致不可逆的问题。
所以本篇补充,继续进行优化docuemnt写入流程。
2.最终的优化的写入流程:
1)数据写入buffer缓冲和translog日志文件中。
当你写一条数据document的时候,一方面写入到buffer缓冲中,一方面同时写入到translog日志文件中。
2)每隔1秒,buffer中的数据会被写入index segment file,并写入os cache,此时index segment并打开供search查询使用
3)buffer被清空
4)重复1~3步骤,新的segment不断添加,buffer不断被清空,而translog的数据不断增加,随着时间的推移,translog文件会越来越大
5)当translog长度达到一定程度的时候,commit操作发生
5-1)buffer中的所有数据写入一个新的segment,并写入os cache打开供使用
5-2)buffer被清空
5-3)一个commit point被写入磁盘,这个commit point中标明所有的index segment
5-4)filesystem cache(os cache)中的所有index segment file缓存数据,被fsync强制刷到磁盘os disk
5-5)现在的translog被清空,创建一个新的translog
3.基于translog和commit point,如何进行数据恢复
fsync+清空translog,就是flush,默认每隔30分钟flush一次,或者当translog过大的时候,也会flush
POST /my_index/_flush/?wait_for_ongoing
新版本使用
POST /my_index/_flush
执行结果:
{
"_shards": {
"total": 10,
"successful": 5,
"failed": 0
}
}
但是不建议使用手动flush,让es自动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"
}
4.es数据恢复
os cache中囤积了一些数据,但是此时服务器宕机,os cache中的数据全部丢失,那么我们怎么进行数据恢复?
机器被重启,disk上的数据并没有丢失,
os disk 上面存放了上一次commit point为止,所有的segment file都fsync到磁盘上
translog就存储了上一次flush(commit point)直到现在最近的数据的变更记录。
此时就会将trangslog文件中的变更记录回放,重新执行之前的各种操作在,写入到buffer中,再重新刷一个一个的segment到os cache中,等待下一次commit发生即可。