返回顶部
首页 > 资讯 > 后端开发 > Python >elasticsearch索引index之Translog数据功能分析
  • 857
分享到

elasticsearch索引index之Translog数据功能分析

2024-04-02 19:04:59 857人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录translog的结构及写入方式translogFile的继承关系TranslogFile快照的方法总结translog的结构及写入方式 跟大多数分布式系统一样,es也通过临时写

translog的结构及写入方式

跟大多数分布式系统一样,es也通过临时写入写操作来保证数据安全。因为lucene索引过程中,数据会首先据缓存在内存中直到达到一个量(文档数或是占用空间大小)才会写入到磁盘。这就会带来一个风险,如果在写入磁盘前系统崩溃,那么这些缓存数据就会丢失。es通过translog解决了这个问题,每次写操作都会写入一个临时文件translog中,这样如果系统需要恢复数据可以从translog中读取。本篇就主要分析translog的结构及写入方式。

这一部分主要包括两部分translog和tanslogFile,前者对外提供了对translogFile操作的相关接口,后者则是具体的translogFile,它是具体的文件。

translogFile的继承关系

如下图所示:

实现了两种translogFile,它们的最大区别如名字所示就是写入时是否缓存。FsTranslogFile的接口如下所示:

每一个translogFile都会有一个唯一Id,两个非常重要的方法add和write。add是添加对应的操作,这些操作都是在translog中定义,这里写入的只是byte类型的文件,不关注是何种操作。所有的操作都是顺序写入,因此读取的时候需要一个位置信息。add方法代码如下所示:

public Translog.Location add(BytesReference data) throws IOException {
        rwl.writeLock().lock();//获取读写,每个文件的写入都是顺序的。
        try {
            operationCounter++;
            long position = lastPosition;
            if (data.length() >= buffer.length) {
                flushBuffer();
                // we use the channel to write, since on windows, writing to the RAF might not be reflected
                // when reading through the channel
                data.writeTo(raf.channel());//写入数据
                lastWrittenPosition += data.length();
                lastPosition += data.length();//记录位置
                return new Translog.Location(id, position, data.length());//返回由id,位置及长度确定的操作位置信息。
            }
            if (data.length() > buffer.length - bufferCount) {
                flushBuffer();
            }
            data.writeTo(bufferOs);
            lastPosition += data.length();
            return new Translog.Location(id, position, data.length());
        } finally {
            rwl.writeLock().unlock();
        }
    }

这是SimpleTranslogFile写入操作,BufferedTransLogFile写入逻辑基本相同,只是它不会立刻写入到硬盘,先进行缓存。

TranslogFile快照的方法

另外TranslogFile还提供了一个快照的方法,该方法返回一个FileChannelSnapshot,可以通过它next方法将translogFile中所有的操作都读出来,写入到一个shapshot文件中。代码如下:

public FsChannelSnapshot snapshot() throws TranslogException {
        if (raf.increaseRefCount()) {
            boolean success = false;
            try {
                rwl.writeLock().lock();
                try {
                    FsChannelSnapshot snapshot = new FsChannelSnapshot(this.id, raf, lastWrittenPosition, operationCounter);
                    snapshot.seekTo(this.headsuccess = true;
                    returnerSize);
                     snapshot;
                } finally {
                    rwl.writeLock().unlock();
                }
            } catch (FileNotFoundException e) {
                throw new TranslogException(shardId, "failed to create snapshot", e);
            } finally {
                if (!success) {
                    raf.decreaseRefCount(false);
                }
            }
        }
        return null;
    }

TransLogFile是具体文件的抽象,它只是负责写入和读取,并不关心读取和写入的操作类型。各种操作的定义及对TransLogFile的定义到在Translog中。它的接口如下所示:

这里的写入(add)就是一个具体的操作,这是一个外部调用接口,索引、删除等修改索引的操作都会构造一个对应的Operation在对索引进行相关操作的同时调用该方法。这里还要着重说明一下makeTransientCurrent方法。操作的写入时刻进行,但是根据配置TransLogFile超过限度时需要删除重新开始一个新的文件。因此在transLog中存在两个TransLogFile,current和transient。当需要更换时需要通过读写锁确保单线程操作,将current切换到transient上来,然后删除之前的current。代码如下所示:

public void revertTransient() {
        FsTranslogFile tmpTransient;
        rwl.writeLock().lock();
        try {
            tmpTransient = trans;//交换
            this.trans = null;
        } finally {
            rwl.writeLock().unlock();
        }
        logger.trace("revert transient {}", tmpTransient);
        // previous transient might be null because it was failed on its creation
        // for example
        if (tmpTransient != null) {
            tmpTransient.close(true);
        }
    }

translog中定义了index,create,delete及deletebyquery四种操作它们都继承自Operation。这四种操作也是四种能够改变索引数据的操作。operation代码如下所示:

static interface Operation extends Streamable {
        static enum Type {
            CREATE((byte) 1),
            SAVE((byte) 2),
            DELETE((byte) 3),
            DELETE_BY_QUERY((byte) 4);
            private final byte id;
            private Type(byte id) {
                this.id = id;
            }
            public byte id() {
                return this.id;
            }
            public static Type fromId(byte id) {
                switch (id) {
                    case 1:
                        return CREATE;
                    case 2:
                        return SAVE;
                    case 3:
                        return DELETE;
                    case 4:
                        return DELETE_BY_QUERY;
                    default:
                        throw new elasticsearchIllegalArgumentException("No type mapped for [" + id + "]");
                }
            }
        }
        Type opType();
        long estimateSize();
        Source getSource();
    }

tanslog部分就是实时记录所有的修改索引操作确保数据不丢失,因此它的实现上不上非常复杂。

总结

TransLog主要作用是实时记录对于索引的修改操作,确保在索引写入磁盘前出现系统故障不丢失数据。tanslog的主要作用就是索引恢复,正常情况下需要恢复索引的时候非常少,它以stream的形式顺序写入,不会消耗太多资源,不会成为性能瓶颈。它的实现上,translog提供了对外的接口,translogFile是具体的文件抽象,提供了对于文件的具体操作。

以上就是elasticsearch索引index之Translog数据功能分析的详细内容,更多关于elasticsearch索引index Translog数据功能的资料请关注编程网其它相关文章!

--结束END--

本文标题: elasticsearch索引index之Translog数据功能分析

本文链接: https://lsjlt.com/news/146883.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • elasticsearch索引index之Translog数据功能分析
    目录translog的结构及写入方式translogFile的继承关系TranslogFile快照的方法总结translog的结构及写入方式 跟大多数分布式系统一样,es也通过临时写...
    99+
    2024-04-02
  • elasticsearch索引index数据功能源码示例
    从本篇开始,对elasticsearch的介绍将进入数据功能部分(index),这一部分包括索引的创建,管理,数据索引及搜索等相关功能。对于这一部分的介绍,首先对各个功能模块的分析,...
    99+
    2024-04-02
  • elasticsearch索引index之put mapping的设置分析
    目录mapping的设置过程put mappingupdateTask响应总结mapping的设置过程 mapping机制使得elasticsearch索引数据变的更加灵活,近乎于n...
    99+
    2024-04-02
  • elasticsearch索引的创建过程index create逻辑分析
    目录索引的创建过程materOperation方法实现clusterservice处理建立索引 修改配置总结索引的创建过程 从本篇开始,就进入了Index的核心代码部分。这里首先分析...
    99+
    2024-04-02
  • elasticsearch数据信息索引操作action support示例分析
    目录抽象类分析doExecute方法performOperation代码master的相关操作总结抽象类分析 Action这一部分主要是数据(索引)的操作和部分集群信息操作。&nbs...
    99+
    2024-04-02
  • elasticsearch分布式及数据的功能源码分析
    从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主要是索引和搜索。代码上这些功能并不是完全独...
    99+
    2024-04-02
  • SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能
    目录一、简介二、代码实践2.1、导入依赖2.2、配置环境变量2.3、创建 elasticsearch 的 config 类2.4、索引管理2.5、文档管理三、小结今天给大家讲讲&nb...
    99+
    2024-04-02
  • Pandas数据分析-pandas数据框的多层索引
    目录前言创建多层索引 多层索引操作 索引名称的查看 索引的层级 索引内容的查看数据查询 数据分组前言 pandas数据框针对高维数据...
    99+
    2024-04-02
  • HTML5的IndexedDB索引数据库实例分析
    本篇内容主要讲解“HTML5的IndexedDB索引数据库实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5的IndexedDB索引数据库实例分析...
    99+
    2024-04-02
  • 索引对数据库查询性能的影响:深入分析
    索引是数据库中用于加速数据检索的数据结构,它通过对表中的特定列进行排序和组织,从而快速定位符合查询条件的行。索引对数据库查询性能的影响主要表现在以下方面: 1. 查询时间优化 快速查询:索引允许数据库直接跳到包含匹配数据的表部分,而不需...
    99+
    2024-03-15
    数据库索引
  • MySQL数据库优化之索引实现原理与用法分析
    本文实例讲述了MySQL数据库优化之索引实现原理与用法。分享给大家供大家参考,具体如下: 索引 什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行...
    99+
    2024-04-02
  • Python数据分析:数据驱动成功之路
    Python 数据分析涉及使用 Python 编程语言从各种数据源中收集、清理、探索、建模和可视化数据。它提供了强大的工具和库,例如 NumPy、Pandas、Scikit-learn 和 Matplotlib,使研究人员和分析师能够高...
    99+
    2024-02-17
    Python 数据分析 数据探索 数据建模 可视化 成功
  • PHP 中 Elasticsearch 实现大数据分析与挖掘技术探索
    摘要:随着大数据时代的到来,如何高效地对海量数据进行分析与挖掘成为了一项重要的任务。本文将介绍如何利用PHP语言结合Elasticsearch搜索引擎来实现大数据分析与挖掘。并通过具体的代码示例来展示其实现方法和技术要点。关键词:PHP、E...
    99+
    2023-10-21
    elasticsearch 大数据分析 挖掘技术
  • mysql数据库索引应用的示例分析
    mysql数据库索引应用的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、索引的概念    ...
    99+
    2024-04-02
  • HTML5的IndexedDB索引数据库的示例分析
    本篇文章给大家分享的是有关HTML5的IndexedDB索引数据库的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。IndexedDB是...
    99+
    2024-04-02
  • Oracle数据库中索引重复情况分析
    Oracle数据库中索引重复情况分析 索引在数据库中起着至关重要的作用,它可以提高查询的效率,加快数据检索的速度。然而,在实际应用中,有时候会出现索引重复的情况,这会影响到数据库的性能...
    99+
    2024-03-07
    oracle 重复检测 索引分析
  • MYSQL INNODB 组合索引分支节点数据解析
    1、本文证明组合索引的所有键值在分支节点(非叶子结点也进行了存储)。 2、本文给出B+ 索引如何进行验证其B+树结构 关于B树结构(不是B+树)可以参考: http://blog.itpub.net/77...
    99+
    2024-04-02
  • MongoDB数据库中索引和explain的示例分析
    这篇文章主要介绍了MongoDB数据库中索引和explain的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。mongodb 索引使用...
    99+
    2024-04-02
  • 数据库索引的时空奥义:探索数据维度,掌控性能之匙
    数据库索引是加速数据检索的关键技术。它是一种排好序的数据结构,将数据表中的特定列映射到表中相应记录的指针。当查询表时,索引允许数据库绕过表中的逐行扫描,直接跳转到包含所需数据的行。 时空维度:索引的两个基石 索引的时空属性是其核心的两个方...
    99+
    2024-03-11
    索引:数据存取的加速器
  • Python数据分析模块Numpy切片、索引和广播源码分析
    这篇文章主要讲解了“Python数据分析模块Numpy切片、索引和广播源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python数据分析模块Numpy切片、索引和广播源码分析”吧!N...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作