`
qindongliang1922
  • 浏览: 2189013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117676
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126079
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60034
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71405
社区版块
存档分类
最新评论

Elasticsearch如何保证数据不丢失?

    博客分类:
  • ELK
阅读更多

上篇文章提到过,在elasticsearch和磁盘之间还有一层cache也就是filesystem cache,大部分新增或者修改,删除的数据都在这层cache中,如果没有flush操作,那么就不能100%保证系统的数据不会丢失,比如突然断电或者机器宕机了,但实际情况是es中默认是30分钟才flush一次磁盘,这么长的时间内,如果发生不可控的故障,那么是不是必定会丢失数据呢?


很显然es的设计者早就考虑了这个问题,在两次full commit操作(flush)之间,如果发生故障也不能丢失数据,那么es是如何做到的呢?

在es里面引入了transaction log(简称translog),这个log的作用就是每条数据的任何操作都会被记录到该log中,非常像Hadoop里面的edits log和hbase里面的WAL log,如下图:



transaction log的工作流程如下:

(1)当一个文档被索引时,它会被添加到内存buffer里面同时也会在translog里面追加

(2)当每个shard每秒执行一次refresh操作完毕后,内存buffer会被清空但translog不会。

过程如下:
````
2.1 当refresh动作执行完毕后,内存buffer里面的数据会被写入到一个segment里面,这个还在cache中,并没有执行flush命令

2.2 新生成的segment在cache中,会被打开,这个时候就可以搜索新加的数据

2.3 最后内存buffer里面的数据会被清空
````

上面过程如下图:


(3)随着更多的document添加,内存buffer区会不断的refresh,然后clear,但translog数量却越增越多,如下图:




(4)当达到默认的30分钟时候,translog也会变得非常大,这个时候index要执行一次flush操作,同时会生成一个新的translog文件,并且要执行full commit操作,流程如下:


````
4.1 内存buffer里的所有document会被生成一个新的segment

4.2 然后segment被refresh到系统cache后,内存buffer会被清空

4.3 接着commit point会被写入到磁盘上

4.4 filesystem cache会被flush到磁盘上通过fsync操作

4.5 最后旧的translog会被删除,并会生成一个新的translog

````


如下图:


tanslog的作用就是给所有还没有flush到硬盘上的数据提供持久化记录,当es重启时,它首先会根据上一次停止时的commit point文件把所有已知的segments文件给恢复出来,然后再通过translog文件把上一次commit point之后的所有索引变化包括添加,删除,更新等操作给重放出来。


除此之外tanslog文件还用于提供一个近实时的CURD操作,当我们通过id读取,更新或者删除document时,es在从相关的segments里面查询document之前,es会首先从translog里面获取最近的变化,这样就意味着es总是近实时的优先访问最新版本的数据。



我们知道执行flush命令之后,所有系统cache中的数据会被同步到磁盘上并且会删除旧的translog然后生成新的translog,默认情况下es的shard会每隔30分钟自动执行一次flush命令,或者当translog变大超过一定的阈值后。

flush命令的api如下:
 ````
 
POST /blogs/_flush  //flush特定的index

POST /_flush?wait_for_ongoing//flush所有的index知道操作完成之后返回响应
 
 ````



flush命令基本不需要我们手动操作,但当我们要重启节点或者关闭索引时,最好提前执行以下flush命令作为优化,因为es恢复索引或者重新打开索引时,它必须要先把translog里面的所有操作给恢复,所以也就是说translog越小,recovery恢复操作就越快。



我们知道了tangslog的目的是确保操作记录不丢失,那么问题就来了,tangslog有多可靠?


默认情况下,translog会每隔5秒或者在一个写请求(index,delete,update,bulk)完成之后执行一次fsync操作,这个进程会在所有的主shard和副本shard上执行。 这个守护进程的操作在客户端是不会收到200 ok的请求。

在每个请求完成之后执行一次translog的fsync操作还是比较耗时的,虽然数据量可能比并不是很大。
默认的es的translog的配置如下:
````
"index.translog.durability": "request"
````


如果在一个大数据量的集群中数据并不是很重要,那么就可以设置成每隔5秒进行异步fsync操作translog,配置如下:

````
PUT /my_index/_settings
{
    "index.translog.durability": "async",
    "index.translog.sync_interval": "5s"
}
````



上面的配置可以在每个index中设置,并且随时都可以动态请求生效,所以如果我们的数据相对来说并不是很重要的时候,我们开启异步刷新translog这个操作,这样性能可能会更好,但坏的情况下可能会丢失5秒之内的数据,所以在设置之前要考虑清楚业务的重要性。

如果不知道怎么用,那么就用es默认的配置就行,在每次请求之后就执行translog的fsycn操作从而避免数据丢失。

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
1
0
分享到:
评论

相关推荐

    Elasticsearch如何保证数据不丢失1

    Elasticsearch是一个强大的分布式搜索引擎,其在处理大量数据时如何保证数据不丢失是至关重要的。在Elasticsearch中,为了确保数据的持久性和可靠性,它引入了一种名为Transaction Log(简称Translog)的日志机制。 ...

    ElasticSearch面试题

    5. **Elasticsearch如何保证数据一致性?** ES使用软实时性,即数据写入后,经过短暂延迟后才对外可见。在更新或删除操作时,使用版本控制确保并发一致性。 6. **Elasticsearch如何处理数据丢失?** 通过副本分片...

    mysql数据导入elasticsearch并支持SQL查询

    - 定期备份Elasticsearch的数据,以防数据丢失。同时,可以设置MySQL的主从复制,确保数据源的安全。 6. **安全性**: - 在使用中间件进行数据同步时,应确保连接MySQL和Elasticsearch的凭证安全,避免数据泄露。...

    数据持久性揭秘:Elasticsearch 的数据恢复是如何工作的?

    为了保证数据的持久性和可靠性,Elasticsearch 设计了一套完善的数据恢复机制。这主要通过其核心特性——分片(shards)和副本(replicas)来实现。 - **分片**:Elasticsearch 将数据划分成多个分片,每个分片都是...

    es迁移工具,实现es数据的两个集群之间或者导出到本地进行迁移.zip

    **Elasticsearch (ES) 迁移工具详解** 在大数据时代,Elasticsearch作为一个流行的分布式搜索引擎和数据分析...正确理解和使用这个工具,可以帮助我们更好地管理和维护Elasticsearch集群,保证数据的可用性和一致性。

    elasticsearch7.8.0.zip

    为了保证ELK堆栈的稳定运行,还需要考虑监控和维护方面,例如定期检查硬件资源使用情况,优化索引设置以提高性能,以及定期备份数据防止数据丢失。此外,对于安全性,需要设置合适的网络策略和用户权限,防止未授权...

    ElasticSearch数据迁移与容灾实践.docx

    ElasticSearch(ES)是一款基于 Lucene 打造的分布式搜索引擎,广泛应用于搜索、日志、APM、IOT 等领域。为满足不同数据源与 ES 之间的数据导入导出需求,ES 提供了多种异构数据同步方式。 一、异构数据与 ES 同步 ...

    kafka数据同步工具kafka2x-elasticsearch-master.zip

    《Kafka数据同步至Elasticsearch的深度解析》 在大数据处理领域,Kafka和Elasticsearch都是不可或缺的重要组件。Kafka作为一个强大的分布式...同时,对Kafka和Elasticsearch的深入理解,也是保证数据同步成功的关键。

    ElasticSearch文档.pdf

    Java API主要分为Node方式和TransportClient方式,Node方式允许Java应用作为Elasticsearch集群中的一个节点,而TransportClient方式则是一个轻量级的客户端,可以访问Elasticsearch集群中的数据,但不参与集群的任何...

    ElasticSearch个人笔记【深入浅出,非常完整】.zip

    为了保证数据的可靠性,笔记会讲解Elasticsearch的副本分片(Replica Shard)和恢复机制。当节点故障时,系统会自动从副本分片中选取新的主分片,确保服务不中断。同时,快照和镜像功能可以定期备份数据,防止数据...

    elasticsearch-7.9.3全平台下载

    这种机制称为分片复制,能够在某个节点发生故障时,保证数据不会丢失,并可继续进行搜索操作。 在Elasticsearch中,文档(Document)是索引中的基本数据单元,相当于关系数据库中的一行。文档以JSON格式存储,每个...

    Elasticsearch Indexing.pdf

    此外,Elasticsearch还允许将分片复制为副本(replicas),从而提供数据冗余,以防止硬件故障导致数据丢失,同时也能够提高搜索性能。 Elasticsearch索引过程包括创建索引、索引文档、更新文档和删除文档等操作。当...

    elasticsearch-6.5.2.tar.gz

    6. **数据持久化**:Elasticsearch 使用 Lucene 库作为其核心搜索引擎,确保数据在内存中的同时也在磁盘上持久化,即使服务器重启,数据也不会丢失。 7. **多租户支持**:通过索引模板和别名,Elasticsearch 支持在...

    es1.6_es_sink

    标题“es1.6_es_sink”和描述“es1.6 elasticsearch5 sink”都指向一个关键主题,即使用Flume 1.6版本将数据流传输到Elasticsearch 5.0版本的接收器(sink)。Flume是Apache开发的一个分布式、可靠且可用于有效收集...

    Elasticsearch简介及与MySQL查询原理对比

    此外,Elasticsearch的查询是近实时的,新数据在写入后需要一定时间才能被查询到,这可能导致数据丢失风险,尤其是在高并发写入时。这种延迟是由数据持久化策略决定的,通过FileSystem Cache来优化磁盘I/O,定期将...

    Windows下Mongodb自动同步Elasticsearch教程

    Windows环境下实现MongoDB与Elasticsearch数据自动同步是大数据和搜索领域经常需要进行的操作,可以帮助用户实时将数据库中的数据变化同步到搜索引擎中,以便快速检索。本文介绍如何使用Python 2.7.14,MongoDB ...

    Elasticsearch服务器开发高清(第2版).pdf

    3. **备份与恢复**:定期备份索引,以便在数据丢失时恢复,保证数据完整性。 总的来说,《Elasticsearch服务器开发高清(第2版)》是一本全面介绍Elasticsearch技术的指南,涵盖了从基础概念到高级特性的各个方面,...

    elasticsearch6实战教程资料

    4. **故障恢复**:当节点离线时,Elasticsearch 自动重新分配分片,保证服务连续性。 5. **安全性**:使用 X-Pack 插件实现身份验证、权限控制、SSL 加密等功能。 ### 七、最佳实践 1. **合理设置分片与副本**:...

Global site tag (gtag.js) - Google Analytics