Elasticsearch写入数据原理
首先,客户端接收写入请求,将请求路由到其中的一个node下的一个分片(随机轮询算法)。
一。refresh:数据打入buffer,再打入os cache(此时已经可以访问),再写入一个segmentfile。一个过程称之为refresh。当写入完成buffer清空,默认1s一次。
二。flush:数据不仅打入buffer,也记录在tranlog,但每次buffer数据清空,tranlog不清空。tranlog积攒5秒(默认)后,执行flush。 flush第一步 refreshbuffer。第二步,建立commit point写入磁盘 。第三步。os cache强刷进入磁盘。(有java rest api可以控制flush,也就是控制刷盘操作)。
三。段合并
定期段合并 将每个refresh产生的segmentfile合并,将合并后segment file写入磁盘,也写入一个commit point。将之前segment file标记del之后物理删除。
四。注意:tranlog写入os cache那5秒。数据在buffer,tranlog os cache,以及buffer refresh写入的segment file里。并未持久化,所以此时宕机会导致5秒的数据丢失。
ES集群写入优化原理
一。加大tranlog的flush间隔,降低iops和写阻塞:
默认index.translog.durability: request
修改为index.translog.durability: async
同时设置index.translog.sync_interval: 20s
也就是刷盘周期。默认刷盘周期5s。不可设置低于100毫秒。
同时因为加大了flush时间,导致tranlog增大,则应该增加
tranlog阈值。
index.translog.flush_threshold_size: 1024mb
最大1024默认512,不可超越1024,因为会导致refresh从

本文深入解析Elasticsearch写入流程,包括refresh、flush、段合并等关键步骤,并提供写入性能优化策略,如调整刷新间隔、段合并优化、索引缓冲区设置等。
最低0.47元/天 解锁文章
3990

被折叠的 条评论
为什么被折叠?



