事务日志
由于Lucene采用了延迟写的方式来减少磁盘写入次数,但是这样会出现数据在内存中还没有持久化到磁盘时发生故障使得数据丢失,Elasticsearch通过使用事务日志(translog)来解决该问题,事务日志用来保存所有没有被持久化磁盘的数据(所有未提交的事务),当有错误发生时,事务日志将会被检查,必要时会再次执行某些操作,以确保没有丢失任何更改。事务日志中的信息与存储介质之间的同步(同时清空事务日志)被称为事务日志刷新(flushing)。
写索引的过程
- 内存缓存并记录日志:当有数据写入时,先写入内存,并且为了防止数据的丢失,追加一份数据到事务日志中(不直接写入磁盘是为了提升写入速度)
- Refresh:当达到默认时间或内存数据达到一定阈值时,会触发一次Refresh,将内存数据以段的格式缓存到文件系统缓存中,Refresh之后数据就可以被搜索到,每次Refresh都会产生一个新的段
- Flush:当数据大小达到某阈值时,触发一次Flush,将文件系统缓存中的段同步到磁盘,会将事务日志删除并创建一个空的日志
index.translog.flush_threshold_period
和index.translog.flush_threshold_ops
和index.translog.flush_threshold_size
translog在不断的增大,当经过一段时间(index.translog.sync_interval)则执行fsync操作,将所有File system cache中的segment写入磁盘,而translog会被删除(如果fsync还没有执行突然断电了,此时的translog是保留的,elasticsearch可以根据translog来进行数据的还原和恢复)
1 | 除了可以自动刷新还可以使用api手动刷新 |
事务日志配置
index.translog.flush_threshold_period
默认30分钟,控制了强制自动Flush的时间间隔index.translog.flush_threshold_ops
当索引更改操作次数超过该数时,强制进行Flush操作index.translog.flush_threshold_size
事务日志的最大容量,超过该值时,强制进行Flushindex.translog.sync_interval
多长时间检查一次translog,进行刷新到磁盘index.gateway.local.sync
通过fsync系统调用同步事务日志数据的频率index.translog.disable_flush
禁用事务日志刷新index.translog.durability
默认是request,表示事务日志成功提交之后才会回复客户端成功,也就是同步的;如果设置为async,会经过index.translog.sync_interval
检查一次translog