ES snapshot是ES数据备份功能,完整的功能可以查看官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.6/snapshot-restore.html
本篇文章主要来看看ES是如何实现snapshot功能。
先来看下snapshot的一些基本概念:
- repository:备份使用的仓库,使用snapshot前,需要先创建仓库。
- snapshot:仓库中存放的snapshot数据,每个snapshot可以备份当前时间指定的索引列表。
- restore:将snapshot加载到集群中。
然后来看下snapshot的代码实现。
ES snapshot所有的操作都在repository中实现。RepositoriesService对象用来管理Repository,主要有下面几个方法:
- registerRepository:注册一个仓库
- unregisterRepository:卸载一个仓库
创建的Repository,就能操作Snapshot,Repository主要包括下面一些操作:
- getMetadata
- getSnapshotInfo
- getSnapshotGlobalMetadata
- getSnapshotIndexMetaData
- getRepositoryData
- initializeSnapshot
- finalizeSnapshot
- deleteSnapshots
- snapshotShard
- restoreShard
可以看到是一些元数据和snapshot的操作。这里面不同的仓库源就能继承Repository,实现具体的snapshot功能。
目前ES用的多的是BlobStoreRepository,很多对象存储等snapshot插件都是继承自BlobStoreRepository。
BlobStoreRepository就会管理snapshot目录结构,主要包含以下几个对象:
- BlobStoreIndexShardSnapshot:某个具体snapshot一个shard的metadata对象
- BlobStoreIndexShardSnapshots:一个shard全部snapshot的metadata。一个shard可能经过很多次备份,所以会产生很多BlobStoreIndexShardSnapshot对象。
- SnapshotInfo:一个snapshot的metadata。
- FileInfo:一个具体snapshot文件的metadata。
- SnapshotFiles:一个snapshot用到的全部snapshot文件
BlobStoreRepository操作的是Blob对象,一个Blob对象就记录一个具体的块。Blob相关的类包括:
- BlobContainer:实际操作blob的对象,对比文件系统,有点像目录的概念
- BlobPath:blob的路径,用/分割的一个List
- BlobStore:存储blob,获得blobContainer对象
- BlobMetadata:一个blob的元数据,名称和长度
下面再看下BlobStoreRepository管理的文件目录里的具体文件:
index-[gen]:记录RepositoryData的序列号数据,一次备份的数据
index.latest:记录当前最新的generation
meta-[snapshotId].dat:一次snapshot的Metadata数据
snap-[snapshotId].dat:一次snapshot的SnapshotInfo对象序列化的数据
indices目录,用uuid生成:
meta-[snapshotId].dat:IndexMetadata数据
shard目录:
snap-[snapshotId].dat:一次snapshot的BlobStoreIndexShardSnapshot对象序列化的数据
index-[snapshotId]:一次snapshot的BlobStoreIndexShardSnapshots对象序列化的数据
__[uuid]:备份的segment数据
RepositoriesService对象用来管理Repository,管理Snapshot是SnapshotsService。SnapshotsService主要包括以下几个方法:
- createSnapshot
- deleteSnapshots
- beginSnapshot
- applyClusterState
最终执行snapshot的是在shard级别,通过SnapshotsService来管理,主要有下面几个方法:
- clusterChanged
- startNewShards
- cancelRemoved
- syncShardStatsOnNewMaster
以上大概就是ES snapshot的实现细节。