不为失败找理由,要为成功找方法。

如何深入了解ES中的快照

Elasticsearch | 作者 Charele | 发布于2022年05月13日 | 阅读数:1938

Elasticsearch快照,
如何真正的去理解它的内部机制呢?
 光靠看网上的东西肯定是不行的,
 百度一搜一大把,文章,博客,视频,,,但都是教你怎么做的,
就几个命令,一些参数,键盘一敲,就搞定。
 
张三半天就学会了,李四也能学会。
这只能说会做了,跟真正理解,跟本不是一码事。
 代码相对复杂,虽然不是什么高深的东西,
但一下子看懂是不可能的。 
我试着从另外一个切入点来谈这个主题。
 
另外, 有能力的同学也可以直接看代码,入口类是:
 
1 TransportPutRepositoryAction   建苍库
这个稍简单,不过苍库里有一些比较难理解的概念:
比如uncleanStart(脏开始?),bestEffortConsistency(尽力而为的连续?)

111.png

  2 TransportCreateSnapshotAction  建快照
3 TransportRestoreSnapshotAction 快照恢复
 
 另外,我这里说的,仅仅是"fs"这种最常用的苍库类型
已邀请:

Charele - Cisco4321

赞同来自:

1
新建一个苍库,插入一条数据(它会自动建一个索引a,也会自动建一个分片),
然后,用下面的方法来生成一个快照

111.png

 
它会生成9个文件(在不同的位置),
(可能不是9个,但我这个简单例子里,肯定是9个)
要理解快照,首先得理解这9个文件分别是什么,
这是苍库根目录下的文件

222.png

 
 

Charele - Cisco4321

赞同来自:

2
首先来谈index-N文件,上面红框里的,
这个是起点,就代表了这个苍库中的所有东东,

index-0, index-1,2,3,4,,,
 
每次苍库发生变化(像创建快照,或删除快照),这个文件名都是依次增加,
1> 这个文件是原子写入的,就是说不能同时有多个同时写入
不能说是你写index-10的时候,我写index-11,
也不能同时写index-10
 2> 这个文件是全量写入的,比如写完新的index-10后,会把旧的index-9删掉
3> 这个文件是最后写入的,就是在所有其他文件都完成后,才会写
 
我贴图只是为了有一个大概的印像
333.png
 
 

Charele - Cisco4321

赞同来自:

3 继续上面index-N
这个index-N,读到内存,其实就是一个RepositoryData对像
 
A class that represents the data in a repository
RepositoryData就抽像代表了一个苍库里的所有数据
抽像的意思是说,从这个类,可以找到真实数据在哪里
 
888.png

 
这也是我开始这个问题的答案
https://elasticsearch.cn/question/12609
 
 
这个文件,其实是一个文本格式的Json文件(除了这个,其他文件都是二进制文件)
 
格式化一下(删除掉了些无关紧要的条目),你就发现一些明朗的情况:
各各代表啥,有何作用,我会在后面一一解释。。。

444.png

可能开始比较乱,但慢慢理解后,你就会发现,一切是那么地清析自然。

Charele - Cisco4321

赞同来自:

4 继续上面index-N
看上面的图,你可以直观的看到,这个文件,可以分3部分
快照,索引,和那个“identifiers"
 
先看那个红色的,就是一个快照的uuid,唯一的代表了一个快照,
(这个uuid和你GET _snapshot/苍库名/快照名 时,看到的id是一样的:-)
 
有了这个红色的uuid,就能找到快照的具体信息在哪里,就能读出来,
 
比如我需要 快照ss1里面ES元数据<注意:不是快照的元数据>,在哪呢?
(你可能在一些文章或视频中看到过,备份,恢复快照时,“包含或不包含元数据”之类的信息)
 
从快照名ss1,就可以找到这个快照这个uuid,
在 根目录\"meta-"+ uuid + ".dat"里面,读出来,
就形成一个MetaData对像了) 
看这个开始的图:

111.png

 
这两个绿色的dat文件,
meta-QV...dat,一个是创建快照时的ES元数据(MetaData),
 
snap-QV...dat,就是快照信息SnapshotInfo
就是快照啥时创建的,啥时结束的之类,
就是你用 GET _snapshot/苍库名/快照名 看到的结果 
 
 
 

Charele - Cisco4321

赞同来自:

5
下面给出一个稍直观的理解,,,
 
可以执行一下这个,GET快照信息
因为你给定了快照名,从上面分析,可以拿到这个快照的uuid,然后就晓得对应SnapshotInfo文件在哪,
读出来,返回给用户。

111.png

 
可以试着看下代码,这个操作,起点类是TransportGetSnapshotsAction
你最后就会发现,你看到的结果,它就是从文件出读出来的:
 
如果你看代码能看到这里,说明你迈出了重要的一步。
222.png

 

要回复问题请先登录注册