Elasticsearch原理解析--snapshot实现原理解析

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的实现细节。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容