欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

Elasticsearch 如何保证写入过程中不丢失数据的

时间:2025-12-10 01:30:02|栏目:其它服务器|点击:

丢失数据的本质

在本文开始前,首先明白一个点,平时我们说的组件数据不丢失究竟是在指什么,如果你往ES写入数据,ES返回给你写入错误,这个不算数据丢失。如果你往ES写入数据,ES返回给你成功,但是后续因为ES节点重启或宕机导致写入的数据不见了,这个才叫数据丢失。

简而言之,丢失数据的本质是ES本身搞丢了返回结果是成功写入的数据

数据写入流程

image.png

1,写入时,ES会首先往一块内存缓存中写入数据,这快内存缓存在ES中叫index buffer,此时数据是不可见的,只有经过refresh操作后,数据才能变得可见。

index buffer的大小设置可以通过 下面的请求去进行设置,如下,设置了index buffer的大小为总内存的30%

PUT /_cluster/settings
{
   "persistent" : {
       "indices.memory.index_buffer_size" : "30%"  
   }
}

2, 在写入index buffer成功后,会写translog 记录写入的数据。此时数据依然不可见。由于操作系统对文件写入,并不会立即落盘。所以ES提供了关于刷盘的配置,index.translog.durability两个选项值,如下,

  • request 会在每次创建segment写入数据后就对translog进行刷盘操作。
  • async 则会定时对translog进行刷盘操作。定时刷新到磁盘的周期是通过index.translog.sync_interval 参数去进行控制,默认是5s。

3,refresh 操作可以主动触发也可以定时触发,默认是1s会进行一次, 该操作会创建一个lucece的segment段用于存储新写入到index buffer中的数据,注意这里即使写入到了segment里,数据还是在os Cache系统文件系统缓存中,并没有落入磁盘,只有 在lucece将数据 commit 到磁盘后,数据才能落盘。

4, 在文件系统缓存中的segment总归还是要写入磁盘,默认每30分钟,或者当translog的日志量达到某个量级时,segment会进行落盘,同时删掉translog日志。这个量级由index.translog.flush_threshold_size 去进行控制,默认是512mb。

在了解了ES的写入数据的过程后,我们可以发现,如果将index.translog.durability 设置为request ,这样便能让每次请求返回客户端成功时,保证一定会有translog日志存储到磁盘上,后续如果在系统缓存中的segment因为系统宕机而没有落盘依然能够通过translog去进行恢复。

而如果index.translog.durability 设置为 async 则有可能会丢失5s的数据。

上一篇:Linux中的awk命令全解析

栏    目:其它服务器

下一篇:linux系统运行时参数命令、网络、磁盘参数和日志监控

本文标题:Elasticsearch 如何保证写入过程中不丢失数据的

本文地址:https://zz.feitang.co/server/29740.html

广告投放 | 联系我们 | 版权申明

申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:257218569 | 邮箱:257218569@qq.com

Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号