elasticsearch索引index之translog数据功能分析-mile米乐体育

目录

  • translog的结构及写入方式

    • translogfile的继承关系

    • translogfile快照的方法

  • 总结

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(bufferoswww.cppcns.com);            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;     http://www.cppcns.com       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;ogqtr}            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数据功能的资料请关注mile米乐体育其它相关文章!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图