持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
1. ES中的日志应用
ES中的translog应用原理 es读写流程
1.什么是ES?ES全称elasticsearch,是基于lucene的全文搜索引擎,能够对海量数据的存储和高速检索.lucene是阿帕奇的开源搜索引擎框架,用于处理纯文本数据,提供建立索引,执行搜索等接口,不提供分布式服务,分布式服务是有es提供的,包括数据的存储.
es常用的场景就是商品的搜索以及ELK中的日志检索.
es之所以查询速度快,是因为es采用的的是倒排索引的方式存储和管理数据,倒排索引:ES的搜索是基于文档(document)的,每个文档的内容会被分成一个个的词(term),所有的词形成了词典(term list).es在存储数据时就会对doc进行拆分成term,然后会将这些term和doc进行关联形成倒排文件.
ES写入数据原理
segment file: 存储倒排索引的文件,每个segment本质上就是一个倒排索引,每秒都会生成一个segment文件,当文件过多时es会自动进行segment merge(合并文件)将多个segment file给merge成一个segment file,合并时会同时将已经标注删除的文档物理删除
translog日志文件: 为了防止elasticsearch宕机造成数据丢失保证可靠存储,es会将每次写入数据同时写到translog日志中
os cache: 操作系统里面,磁盘文件其实都有一个东西,叫做os cache,操作系统缓存,就是说数据写入磁盘文件之前,会先进入os cache,先进入操作系统级别的一个内存缓存中去. 缓存的出现就是为了避免频繁的磁盘IO,将多次磁盘IO合并为一次,同时提高数据写入的效率.但是当系统宕机时,缓存中的数据会丢失.
写入translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去,所以默认情况下,可能有5秒的数据会仅仅停留在buffer或者translog文件的os cache中,如果此时机器挂了,会丢失5秒钟的数据。但是这样性能比较好,最多丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。所以ES的数据也有丢失的可能
es里的写流程,有4个底层的核心概念,refresh、flush、translog、merge refresh 将buffer(内存buffer里的时候数据是搜索不到的)中的数据 refresh到磁盘文件(segment file) refresh也不是实时刷新,而是当buffer达到一定大小或者达到一定的时间间隔才会触发refresh 这个跟数据写入kafka时的原理类似,kafka的写入也是按一定大小或者一定时间间隔才会触发真正的发送 es是准实时的,原因就是因为refresh的刷新不是实时刷新的. 默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1秒之后才能被看到。 translog 数据写入buffer的时候会同时写入 translog文件,写入日志文件的作用
就是在你执行commit操作之前,数据要么是停留在buffer中,要么是停留在os cache中,无论是buffer还是os cache都是内存,一旦这台机器死了,内存中的数据就全丢了。所以需要将数据对应的操作写入一个专门的日志文件,translog日志文件中,一旦此时机器宕机,再次重启的时候,es会自动读取translog日志文件中的数据,恢复到内存buffer和os cache中去。 这个跟mysql中的redo log 作用是一样的.
merge 随着数据的写入segmentfile是逐渐增多的,但是文件也不能无限增加,所以就需要将多个segmentfile合并成一个大的segmentfile
flush flush就是将缓存中的数据进行刷盘,RocketMq也有刷盘,刷盘涉及到时间间隔的大小配置, (刷盘时间间隔越大,写入效率越高但同时数据安全性越低,所以就要执其两端,用其中)