elasticsearch索引数据结构,elasticsearch数据查询
目录
translog结构和translogFile的写方法继承TranslogFile快照的方法概述
00-1010和大多数分布式系统一样,es也通过临时写操作来保证数据安全。因为在lucene索引过程中,数据一开始会缓存在内存中,直到达到一定量(文档的数量或者占用空间的大小)才会写入磁盘。存在这样的风险:如果系统在写入磁盘之前崩溃,缓存的数据将会丢失。这个问题由ESTranslog解决。每次写操作都会写入一个临时文件translog,这样如果系统需要恢复数据,就可以从translog中读取。本文主要分析了translog的结构和写作方式。
这一部分主要包括两个部分:translog和tanslogFile。前者为translogFile操作提供外部接口,后者是具体的translogFile,是一个具体的文件。
00-1010如下图所示:
实现了两种translogFile。二者最大的区别,顾名思义,就是写的时候是否缓存。FsTranslogFile的接口如下:
每个translogFile都有一个惟一的Id和两个非常重要的方法,add和write。添加是添加相应的操作。这些操作是在translog中定义的,不管操作是什么,只写字节类型的文件。的所有操作都是顺序写入的,因此读取时需要位置信息。添加方法代码如下:
公共事务日志。Location add(BytesReference data)引发IOException { rwl.writeLock()。lock();//获取读写锁,每个文件的写入是顺序的。请尝试{ operationCounter多头=lastPositionif(data . length()gt;=buffer . length){ flush buffer();//我们使用通道进行写入,因为在windows上,通过通道data.writeTo(raf.channel())进行读取时,写入RAF可能不会得到反映//;//写数据lastwritenposition=data . length();last position=data . length();//记录位置返回新的translog.location (ID,position,data . length());//返回由id、位置和长度确定的操作位置信息。} if(data . length()gt;buffer . length-buffer count){ flush buffer();} data . write to(buffer OS);last position=data . length();返回新的事务日志。Location(id,position,data . length());}最后是{ rwl.writeLock()。unlock();}}}这是一个SimpleTranslogFile写操作。BufferedTransLogFile写逻辑基本相同,只是不会马上写到硬盘,先缓存。
00-1010此外,TranslogFile还提供了一个snapshot方法,该方法返回一个FileChannelSnapshot,通过该方法,translogFile中的所有操作都可以被next方法读出,并写入一个shapshot文件。代码如下:
public FsChannelSnapshot snapshot()引发translog exception { if(RAF . increase refcount()){
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数据功能的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。