elasticsearch作为开源的搜索存储引擎,依赖的一个重要数据结构就是inverted index,内容相当宠大,而且建立过程耗时。
一、如何存储inverted index?
1、inverted 必须保存在磁盘中,以便可以重复使用。
2、elastic是基于lucene来构建的,在lucene的世界里,inverted index 就是存放于disk的一块不可变更的segment。
二、如何高效的存放inverted index?
1、使用memory来做缓存数据,然后批量写入disk file,所以引入了index memory buffer 来暂存doc的inverted index。
2、当这些doc inverted index累积到一定量后,就可以写到disk了。
三、索引的创建和可搜索
1、索引的创建和索引的可搜索之间的时间间隔我们称之为gap time,如何尽量缩短这个时间?。
2、一个可以被优化的地方就是disk page cache ,disk page cache也是os为了优化disk io而做的努力。
3、已经写入到disk page cache的inverted index是可以被搜索的。
4、由index memory buffer到disk page cache的时间要远远少于index memory buffer到 disk segment的时间。
5、引入disk page cache之后,对应的引入了2个api,refresh api ,flush api。
6、index memory buffer----默认每秒refresh--->disk page cache--->默认30min flush--->disk segment。
四、写入到disk page cache中的数据,发生power off时,数据会丢吗?
会丢
1、写入translog就是为inverted index作backup,但是translog同时需要经历disk page cache到disk translog的过程。
2、默认disk page cache到disk translog是5秒刷新一次,也即默认为有5秒数据的丢失。
3、当inverted index 完成flush后,对应的disk translog就可以被清除掉了。
五、如何避免数据不丢?
1、通过replica node从其它节点将数据取回来,这进一步降低了数据丢失的概率。
六、整个机制的目的就是围绕如何高效地存储disk segment来展开。
1、为了降低disk I/O的overhead,引入了in memory index buffer.
2、为了降低创建索引和索引可搜索的time gap,引入了disk page cache。
3、为了对disk page cache做临时备份,引入了translog。
七、segment到底是放在disk上,还是在memory中?
1、segment作为存放inverted index的data structure,是要被持久化到disk的,所以他本质上是disk file。
2、但是segment使用非常频繁,如何一直做disk io来读取inverted inex将会是低效的,所以es使用mmap来将
inverted index映射到memory中,以加速对inverted index的访问。
3、所以ES建议设置sysctl -w vm.max_map_count=262144的原因在这里。
4、同时为了减少mmap中的内容被swap off到 disk ,通常要求disable swap on,以减少 disk io的影响。
代码语言:txt复制PUT my_logs_index/_settings
{
"translog.durability": "REQUEST",
"translog.flush_threshold_age": "1m",
"translog.flush_threshold_size": "512M",
"translog.generation_threshold_size": "64mb",
"translog.sync_interval": "5s"
}