Elasticarch存储深⼊详解
在本⽂中,我们将研究Elasticarch的各个部分写⼊数据⽬录的⽂件。我们将查看节点,索引和分⽚级⽂件,并简要说明其内容,以便了解Elasticarch写⼊磁盘的数据。
1、从Elasticarch路径说起
Elasticarch配置了多个路径:
path.home:运⾏Elasticarch进程的⽤户的主⽬录。默认为Java系统属性ur.dir,它是进程所有者的默认主⽬录。
path.plugins:⼦⽂件夹为Elasticarch插件的⽬录。这⾥⽀持Sym-links,当从同⼀个可执⾏⽂件运⾏多个Elasticarch实例时,可以使⽤它来有选择地启⽤/禁⽤某个Elasticarch实例的⼀组插件。
path.logs:存储⽣成的⽇志的位置。如果其中⼀个卷的磁盘空间不⾜,则将它放在与数据⽬录不同的卷上可能是有意义的。path.data:包含Elasticarch存储的数据的⽂件夹的路径。
在本⽂中,我们将仔细研究数据⽬录(path.data)的实际内容,并尝试了解所有⽂件的⽤途。
农场对对碰2、⽂件从哪⾥来?
由于Elasticarch使⽤Lucene来处理分⽚级别的索引和查询,因此数据⽬录中的⽂件由Elasticarch和Lucene写⼊。两者的职责都⾮常明确:
Lucene负责写和维护Lucene索引⽂件,
⽽Elasticarch在Lucene之上写与功能相关的元数据,例如字段映射,索引设置和其他集群元数据。 最终⽤户和⽀持功能
在低级Lucene中不存在,由Elasticarch提供。
在深⼊研究并最终找到Lucene索引⽂件之前,让我们看看Elasticarch编写的外部级别数据。
3、节点数据
只需从空数据⽬录启动Elasticarch即可⽣成以下⽬录树:
node.lock⽂件⽤于确保⼀次只能从⼀个数据⽬录读取/写⼊⼀个Elasticarch相关安装信息。
有趣的是global-0.st⽂件。 global-前缀表⽰这是⼀个全局状态⽂件,
⽽.st扩展名表⽰这是⼀个包含元数据的状态⽂件。您可能已经猜到,此⼆进制⽂件包含有关您的集群的全局元数据,前缀后的数字表⽰集群元数据版本,遵循跟随您的集群严格增加的版本控制⽅案。
注意:虽然在紧急情况下使⽤⼗六进制编辑器在技术上可以编辑这些⽂件,但强烈建议不要这样做,因为它很快就会导致数据丢失。
4、索引数据
让我们创建⼀个分⽚索引并查看Elasticarch更改的⽂件。
我们看到已经创建了与索引名称对应的新⽬录。 此⽬录有两个⼦⽂件夹:_state和0.
前者state包含所谓的索引状态⽂件(indices / {index-name} / state / state- {version} .st),其中包含有关索引的元数据,例如 它的创建时间戳。 它还包含唯⼀标识符以及索引的设置和映射。
后者0包含与索引的第⼀个(也是唯⼀的)分⽚相关的数据(分⽚0)。
接下来,我们将仔细研究⼀下。
英文游戏名字
5、分⽚数据
分⽚数据⽬录包含分⽚的状态⽂件,其中包括版本控制以及有关分⽚是主分⽚还是副本的信息。
在早期的Elasticarch版本中,还在分⽚数据⽬录中找到了单独的{shard_id} / index / _checksums-⽂件(和.cks-files)。在当前版本中,这些校验和现在可以在Lucene⽂件的页脚中找到,因为Lucene已经为其所有索引⽂件添加了端到端校验和。
{shard_id} / index⽬录包含Lucene拥有的⽂件。 Elasticarch通常不直接写⼊此⽂件夹(除了早期版本中的旧校验和实现)。这些⽬录中的⽂件构成了任何Elasticarch数据⽬录的⼤⼩。
在我们进⼊Lucene的世界之前,我们将看⼀下Elasticarch 事务⽇志,这在每个分⽚translog⽬录中的前缀translog-中存在。Translog ⽇志对于Elasticarch的功能和性能⾮常重要,因此我们将在下⼀节中更详细地解释它的⽤法。
6、每个分⽚的 事务⽇志(Transaction Log)
Elasticarch事务⽇志确保可以安全地将数据索引到Elasticarch,⽽⽆需为每个⽂档执⾏低级Lucene提交。提交Lucene索引会在Lucene级别创建⼀个新的gment,即执⾏fsync(),会导致⼤量磁盘I / O影响性能。
为了接受索引⽂档并使其可搜索⽽不需要完整的Lucene提交,Elasticarch将其添加到Lucene IndexWriter并将其附加到事务⽇志中。在每个refresh_interval之后,它将在Lucene索引上调⽤reopen(),这将使数据可以在不需要提交的情况下进⾏搜索。这是Lucene Near Real Time API的⼀部分。当IndexWriter最终由于⾃动刷新事务⽇志或由于显式刷新操作⽽提交时,先前的事务⽇志将被丢弃并且新的事务⽇志将取代它。
如果需要恢复,将⾸先恢复在Lucene中写⼊磁盘的gments,然后重放事务⽇志,以防⽌丢失尚未完全提交到磁盘的操作。
7、Lucene索引⽂件
Lucene在记录Lucene索引⽬录中的⽂件⽅⾯做得很好,为了⽅便起见,这⾥重现了这些⽂件(Lucene中的链接⽂档也详细介绍了这些⽂件从Lucene 2.1返回后所经历的变化,所以检查⼀下 出来):
Lucene Index Files
Name Extension Brief Description
ausfSegments File gments_N Stores information about a commit point
Lock File write.lock The Write lock prevents multiple IndexWriters from writing to the same file.
Segment Info .si Stores metadata about a gment
Compound File .cfs, .cfe An optional “virtual” file consisting of all the other index files for systems that frequently run out of file handles.
background什么意思Fields .fnm Stores information about the fields
Field Index .fdx Contains pointers to field data
Field Data .fdt The stored fields for documents
Term Dictionary .tim The term dictionary, stores term info
Term Index .tip The index into the Term Dictionary
Frequencies .doc Contains the list of docs which contain each term along with frequency
Positions .pos Stores position information about where a term occurs in the index
Payloads .pay Stores additional per-position metadata information such as character offts and ur payloads
Norms .nvd, .nvm Encodes length and boost factors for docs and fields
Per-Document Values .dvd, .dvm Encodes additional scoring factors or other per-document information.
Term Vector Index .tvx Stores offt into the document data file
Term Vector Documents .tvd Contains information about each document that has term vectors
Term Vector Fields .tvf The field level info about term vectors
Live Documents .liv Info about what files are live
通常,您还会在Lucene索引⽬录中看到⼀个⽂件,该⽂件是⼀个帮助⽂件,其中包含有关当前/最新gments_N⽂件的信息,并⽤于可能⽆法通过⽬录列表返回⾜够信息的⽂件系统,以确定 最新⼀代段⽂件。在较旧的Lucene版本中,您还可以找到带有.del后缀的⽂件。 它们与Live Documents(.liv)⽂件的⽤途相同 - 换句话说,这些是删除列表。
Lucene CheckIndex⼯具包含在默认的Elasticarch发⾏版中,⽆需额外下载。
如果CheckIndex检测到问题并且其建议修复它看起来很合理,您可以通过添加-fix命令⾏参数告诉CheckIndex应⽤修复程序。
9、存储快照
您可能想知道所有这些⽂件如何转换为快照存储库使⽤的存储。 不⽤再想了:拿这个集群,将它作为我的快照快照到基于⽂件系统的⽹关,并检查存储库中的⽂件,我们会找到这些⽂件(为简洁起见省略了⼀些⽂件):
在根⽬录下,我们有⼀个索引⽂件,其中包含有关此存储库中所有快照的信息,每个快照都有⼀个关联的快照和元数据⽂件。
根⽬录下的快照⽂件包含有关快照状态,快照包含的索引等信息。 根⽬录下的元数据⽂件包含快照时的群集元数据。
当设置compress:true时,使⽤LZF压缩元数据和快照⽂件,LZF专注于压缩和解压缩速度,这使其⾮常适合Elasticarch。
数据存储有标题:ZV + 1字节,指⽰数据是否被压缩。 在标题之后,格式上将存在⼀个或多个压缩的64K块:2字节块长度+2字节未压缩⼤⼩+压缩数据。 使⽤此信息,您可以使⽤任何兼容LibLZF的解压缩程序。
在索引级别,还有另⼀个⽂件indices / {index_name} / snapshot- {snapshot_name},其中包含索引元数据,例如快照时索引的设置和映射。
在分⽚级别,您将找到两种⽂件:重命名的Lucene索引⽂件和分⽚快照⽂件:indices / {index_name} / {shard_id} / snapshot-{snapshot_name}。 此⽂件包含有关快照中使⽤的分⽚⽬录中的哪些⽂件的信息,以及从快照中的逻辑⽂件名到具体⽂件名的映射,这些⽂件名在还原时应存储为磁盘。 它还包含可⽤于检测和防⽌数据损坏的所有相关⽂件的校验和,Lucene版本控制和⼤⼩信息。.
您可能想知道为什么这些⽂件已被重命名⽽不是仅保留其原始⽂件名,这可能更容易直接在磁盘上使⽤。
原因很简单:可以在再次快照之前对索引进⾏快照,删除并重新创建它。 在这种情况下,⼏个⽂件最终会有相同的名称,但内容不同。
10、⼩结
在本⽂中,我们查看了各种级别的Elasticarch写⼊数据⽬录的⽂件:节点,索引和分⽚级别。我们已经看到了Lucene索引存储在磁盘上的位置,并简要描述了如何使⽤Lucene CheckIndex⼯具来验证和修复有问题的碎⽚。
希望您不需要对Elasticarch数据⽬录的内容执⾏任何操作,但是了解您最喜欢的基于搜索的数据库将哪种数据写⼊⽂件系统总是有帮助的!
不需要完整记住每个⽂件的确切含义,关键的时候知道去哪⾥更快的查找最重要。
11、补充认知
⼀份数据写⼊es会产⽣多份数据⽤于不同查询⽅式,会⽐原数据占⽤更多磁盘空间。⽽索引tting⾥"codec": "best_compression"是针对_source进⾏压缩的,压缩算法是deflate压缩⽐为6。
sb是什么意思对照上⾯的lucene表进⾏如下的关联。
存储原⽂_source 的⽂件.fdt .fdm .fdx;
存储倒排索引 的⽂件.tim .tip .doc;
⽤于聚合排序 的列存⽂件.dvd .dvm;
全⽂检索⽂件.pos .pay .nvd .nvm等。
加载到内存中的⽂件有.fdx .tip .dvm,
motioncontrol其中.tip占⽤内存最⼤,⽽.fdt . tim .dvd⽂件占⽤磁盘最⼤,例如
11.5M _ap9_1w3.liv 25.0G _ap9.fdt 31.9M _ap9.fdx 444K _ap9.fnm 53.1G _ap9_Lucene50_0.doc
64.2G _ap9_Lucene50_0.tim 781M _ap9_Lucene50_0.tip 87.7G _ap9_Lucene54_0.dvd
920K _ap9_Lucene54_0.dvm104.0K _ap9.si
另外gment较⼩时⽂件内容是保存在.cfs⽂件中,.cfe⽂件保存Lucene各⽂件在.cfs⽂件的位置信息,这是为了减少Lucene打开的⽂件句柄数。
es节点上shard过多了会导致内存不够,可以对静态的索引进⾏
POST {indexName}/_forcemerge?max_num_gments=1
定义
在Lucene中基本的概念包括:index、document、field和term。⼀个index包含⼀个documents的序列
⼀个document是⼀个fields的序列
⼀个field是⼀个命名的terms序列
⼀个term是⼀个bytes的序列
在两个不同fields中的相同bytes序列被认为是不同的term。因此,term表⽰为⼀对:命名field的字符串,以及field内的bytes。
倒排索引
谈到倒排索引,那么⾸先看看正排是什么样⼦的呢?假设⽂档1包含【中⽂、英⽂、⽇⽂】,⽂档2包含【英⽂、⽇⽂、韩⽂】,⽂档3包含【韩⽂,中⽂】那么根据⽂档去查找内容的话
⽂档1->【中⽂、英⽂、⽇⽂】
⽂档2->【英⽂、⽇⽂、韩⽂】
⽂档3->【韩⽂,中⽂】
反过来,根据内容去查找⽂档
中⽂->【⽂档1、⽂档3】
广东汽车维修学校英⽂->【⽂档1、⽂档2】
⽇⽂->【⽂档1、⽂档2】
韩⽂->【⽂档2、⽂档3】
就是倒排索引,⽽Lucene擅长的也正在于此。
Fields的类型
TextField:索引并分词,不包含词向量,多⽤于⽂本的正⽂
StringField:索引但不分词,整个String作为单个标记索引,例如可⽤于“国家名称”或“ID”等,或者其它任何你想要⽤来排序的字段IntPoint:int型⽤于精确/范围查询的索引
江南春翻译LongPoint:long型⽤于精确/范围查询的索引
FloatPoint:float型⽤于精确/范围查询的索引
DoublePoint:double型⽤于精确/范围查询的索引
SortedDocValuesField:存储每个⽂档BytesRef值的字段,索引⽤于排序,如果需要存储值,需要再⽤StoredField实例SortedSetDocValuesField:存储每个⽂档⼀组BytesRef值的字段,索引⽤于faceting/grouping/joining,如果需要存储值,需要再⽤StoredField实例
NumericDocValuesField:存储每个⽂档long值的字段,⽤于scoring/sorting/值检索
SortedNumericDocValuesField:存储每个⽂档⼀组long值的字段,⽤于scoring/sorting/值检索英语口语mp3下载
StoredField:⽤于在汇总结果中检索的仅存储值
段(Segments)
Lucene的索引可能是由多个⼦索引或Segments组成。每个Segment是⼀个完全独⽴地索引,可以单独⽤于搜索。索引涉及
为新添加的documents创建新的gments
合并已经存在的gments
搜索可能涉及多个gments或/和多个索引,每个索引可能由⼀组gments组成。
⽂档编号
Lucene通过⼀个整型的⽂档编号指向每个⽂档,第⼀个被加⼊索引的⽂档编号为0,后续加⼊的⽂档编号依次递增。注意⽂档编号是可能发⽣变化的,所以在Lucene外部存储这些值时需要格外⼩⼼。
索引结构概述
每个gment索引包括信息
Segment info:包含有关gment的元数据,例如⽂档编号,使⽤的⽂件
Field names:包含索引中使⽤的字段名称集合
Stored Field values:对于每个document,它包含属性-值对的列表,其中属性是字段名称。这些⽤于存储有关⽂档的辅助信息,例如其标题、url或访问数据库的标识符
Term dictionary:包含所有⽂档的所有索引字段中使⽤的所有terms的字典。字典还包括包含term的⽂档编号,以及指向term的频率和接近度的指针
Term Frequency data:对于字典中的每个term,包含该term的所有⽂档的数量以及该term在该⽂档中的频率,除⾮省略频率(IndexOptions.DOCS)
Term Proximity data:对于字典中的每个term,term在每个⽂档中出现的位置。注意,如果所有⽂档中的所有字段都省略位置数据,则不会存在
Normalization factors:对于每个⽂档中的每个字段,存储⼀个值,该值将乘以该字段上的匹配的分数
Term Vectors:对于每个⽂档中的每个字段,可以存储term vector,term vector由term⽂本和term频率组成
Per-document values:与存储的值类似,这些也以⽂档编号作为key,但通常旨在被加载到主存储器中以⽤于快速访问。存储的值通常⽤于汇总来⾃搜索的结果,⽽每个⽂档值对于诸如评分因⼦是有⽤的
Live documents:⼀个可选⽂件,指⽰哪些⽂档是活动的
Point values:可选的⽂件对,记录索引字段尺⼨,以实现快速数字范围过滤和⼤数值(例如BigInteger、BigDecimal(1D)、地理形状交集(2D,3D))
⽂件命名
属于⼀个段的所有⽂件具有相同的名称和不同的扩展名。当使⽤复合索引⽂件,这些⽂件(除了段信息⽂件、锁⽂件和已删除的⽂档⽂件)将压缩成单个.cfs⽂件。当任何索引⽂件被保存到⽬录时,它被赋予⼀个从未被使⽤过的⽂件名字。
⽂件扩展名摘要
名称 ⽂件扩展名 简短描述
Segments File gments_N 保存了⼀个提交点(a commit point)的信息
Lock File write.lock 防⽌多个IndexWriter同时写到⼀份索引⽂件中
Segment Info .si 保存了索引段的元数据信息
Compound File .cfs,.cfe ⼀个可选的虚拟⽂件,把所有索引信息都存储到复合索引⽂件中agreement
Fields .fnm 保存fields的相关信息
Field Index .fdx 保存指向field data的指针
Field Data .fdt ⽂档存储的字段的值
Term Dictionary .tim term词典,存储term信息
Term Index .tip 到Term Dictionary的索引
Frequencies .doc 由包含每个term以及频率的docs列表组成
Positions .pos 存储出现在索引中的term的位置信息
Payloads .pay 存储额外的per-position元数据信息,例如字符偏移和⽤户payloads
Norms .nvd,.nvm .nvm⽂件保存索引字段加权因⼦的元数据,.nvd⽂件保存索引字段加权数据
Per-Document Values .dvd,.dvm .dvm⽂件保存索引⽂档评分因⼦的元数据,.dvd⽂件保存索引⽂档评分数据
Term Vector Index .tvx 将偏移存储到⽂档数据⽂件中
Term Vector Documents .tvd 包含有term vectors的每个⽂档信息
Term Vector Fields .tvf 字段级别有关term vectors的信息
Live Documents .liv 哪些是有效⽂件的信息
Point values .dii,.dim 保留索引点,如果有的话
锁⽂件
默认情况下,存储在索引⽬录中的锁⽂件名为“write.lock”。如果锁⽬录与索引⽬录不同,则锁⽂件将命名为“XXXX-write.lock”,其中XXXX是从索引⽬录的完整路径导出的唯⼀前缀。此锁⽂件确保每次只有⼀个写⼊程序在修改索引。
Lucene的索引结构是有层次结构的,主要分以下⼏个层次:
索引(Index):
在Lucene中⼀个索引是放在⼀个⽂件夹中的。
如上图,同⼀⽂件夹中的所有的⽂件构成⼀个Lucene索引。
段(Segment):
⼀个索引可以包含多个段,段与段之间是独⽴的,添加新⽂档可以⽣成新的段,不同的段可以合并。