ES实时索引原理

目录结构:
    data——nodes——indices——shade(lucence分片)
    比如:/opt/search/elasticsearch-node1/data/elasticsearch/nodes/0/indices/logstash-custom-2018.07.27/0/index
    这里第一个0即是ES的节点,indices是ES的索引,第二个0是两个主分片之一,再下面的index是lucence级别的索引,不在ES管控范围了
    -rw-rw-r-- 1 elk elk 28810702 Jul 27 12:07 _azn.fdt
    -rw-rw-r-- 1 elk elk    26297 Jul 27 12:07 _azn.fdx
    -rw-rw-r-- 1 elk elk     3284 Jul 27 12:07 _azn.fnm
    -rw-rw-r-- 1 elk elk  7354691 Jul 27 12:07 _azn_Lucene50_0.doc
    -rw-rw-r-- 1 elk elk  3752835 Jul 27 12:07 _azn_Lucene50_0.pos
    -rw-rw-r-- 1 elk elk 10424860 Jul 27 12:07 _azn_Lucene50_0.tim
    -rw-rw-r-- 1 elk elk   203984 Jul 27 12:07 _azn_Lucene50_0.tip
    -rw-rw-r-- 1 elk elk  6571232 Jul 27 12:07 _azn_Lucene54_0.dvd
    -rw-rw-r-- 1 elk elk     1489 Jul 27 12:07 _azn_Lucene54_0.dvm
    -rw-rw-r-- 1 elk elk   581435 Jul 27 12:07 _azn.nvd
    -rw-rw-r-- 1 elk elk       98 Jul 27 12:07 _azn.nvm
    -rw-rw-r-- 1 elk elk      570 Jul 27 12:07 _azn.si
    -rw-rw-r-- 1 elk elk  8744349 Jul 27 14:16 _gt5.fdt
    -rw-rw-r-- 1 elk elk     6505 Jul 27 14:16 _gt5.fdx
    -rw-rw-r-- 1 elk elk     3284 Jul 27 14:16 _gt5.fnm
    -rw-rw-r-- 1 elk elk  1694649 Jul 27 14:16 _gt5_Lucene50_0.doc
    -rw-rw-r-- 1 elk elk   936611 Jul 27 14:16 _gt5_Lucene50_0.pos
    -rw-rw-r-- 1 elk elk  2835340 Jul 27 14:16 _gt5_Lucene50_0.tim
    -rw-rw-r-- 1 elk elk    50466 Jul 27 14:16 _gt5_Lucene50_0.tip
    -rw-rw-r-- 1 elk elk  1631937 Jul 27 14:16 _gt5_Lucene54_0.dvd
    -rw-rw-r-- 1 elk elk     1525 Jul 27 14:16 _gt5_Lucene54_0.dvm
    -rw-rw-r-- 1 elk elk   140036 Jul 27 14:16 _gt5.nvd
    -rw-rw-r-- 1 elk elk       98 Jul 27 14:16 _gt5.nvm
    -rw-rw-r-- 1 elk elk      570 Jul 27 14:16 _gt5.si
    lucence级别的索引是这种格式的,同一个文件名不同后缀的一大堆合起来是一个索引segment。
es实时索引原理:
    先校验JSON,确保索引映射语法正确。Lucence每次生成的倒排索引,成为一个segment,然后用另一个commit文件,记录索引内所有的segment,生成segment的数据源则是内存中的buffer,lucence会把文档攒到内存buffer里,定时(默认1s刷新一下)或者等到调用/_flush函数(可以根据业务情况手动设置刷新频率,不要太频繁)时把buffer区的内容写到新的segment里,也就是新的倒排索引,然后更新commit文件。相当于一个个索引的桶,segment生成后将不会改变。以实现实时索引。segment会随机merge成更大的segment,同时删除旧的segment。
    注意buffer在往segment里刷数据时,首先会写道文件系统的缓存里,这时虽然可以查询得到,但一旦出现断电等情况索引数据不会被持久化。
一般八核/十二核服务器单节点ES足够跑满,它跟redis这种不一样,redis单线程,没法利用多核优化,所以要开多个实例
du -sh * 查看目录文件大小
df -h查看硬盘分区占用
一般下,一个index下一个type足够,而且ES中type的概念不清晰,只是个标识
磁盘同步translog buffer:
    这个就是为了避免memory buffer刷到文件系统缓存中时突发意外情况丢失数据,memory buffer刷的同时,文档会被记录在translog buffer中,有点类似redis的aof。同时commit point的时间点也在,类似git。由此保证数据完整,和mysql等RDB不同的是,mysql的binlog可以持久化,而ES的translog会定时刷新。需要注意的是,translog本身也是写到文件系统缓存里的,它每隔5s会被强制刷新到磁盘上。无副本的情况下,可能导致5s的数据丢失。
    同样需要注意,开的ES副本占用的资源和单节点ES相同。
    segment从文件系统刷新到磁盘,更新commit
    清空translog
    默认30分钟间隔/512MB阈值(或者调用/_flush接口)

猜你喜欢

转载自blog.csdn.net/hfismyangel/article/details/81430214