快照

快照概述

师成师成· 更新于 2026-09-28· 阅读 16 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

简介

Ozone 快照可让你为存储桶创建时间点一致的只读镜像。主要用途包括:

  • 备份与恢复:用于常规的数据保护和恢复。
  • 归档与合规:用于长期数据保留。
  • 复制与灾难恢复(DR):用于将存储桶镜像复制到远程灾难恢复站点。
  • 增量复制:DistCp 配合 SnapshotDiff 可高效地同步存储桶。

架构

Ozone 快照提供存储桶的时间点只读副本,这依赖于 Ozone 不可变的数据块。创建快照时,Ozone Manager(OM)会利用其 RocksDB 存储复制存储桶的元数据(键命名空间)。数据块不会被复制;只要有任何快照或活动存储桶引用它们,它们就会被保留。后台服务会回收未被引用的数据块。

SnapshotDiff 功能会比较两个快照(或一个快照与活动存储桶),以识别新增、删除、修改或重命名的键等变更,并缓存结果以提高速度。

系统架构深入解析

Ozone 快照在 OM 中对存储桶元数据进行版本管理。RocksDB 中的专用快照元数据表记录了创建快照时的键目录树。这是一个瞬时操作,因为它涉及的是元数据指针(通过 RocksDB 检查点)而非数据复制。每个快照都有唯一的 ID 和名称。

当活动存储桶中的键被修改或删除时,只要某个快照引用了它们,其数据块就会被保留。这意味着在大量删除操作期间创建快照,会在快照中保留这些被删除的键,从而在快照被删除之前无法回收相应空间。这是为了保持快照一致性而刻意设计的。删除快照后,其独占引用的数据块即可由后台清理进程回收。

SnapshotDiff 实现: 差异通过 RocksDB 键比较以及针对近期变更(默认 30 天)的压缩 DAG 计算得出。对于较旧的快照,或 DAG 数据已被压缩的情况,则使用完整的元数据扫描。差异结果(+ 表示新增、- 表示删除、M 表示修改、R 表示重命名)会被缓存。

快照数据存储: 快照元数据存储在 OM 的 RocksDB 中。差异任务数据存储在 ozone.om.snapshot.diff.db.dir(默认为 OM 元数据目录)。

更多详情,请参阅 Prashant Pogde 的 Introducing Apache Ozone Snapshots。

管理快照

本节介绍如何通过 CLI 和 Java 管理 Ozone 快照。

通过 CLI 使用快照

使用 ozone sh 或 ozone fs(兼容 Hadoop)命令管理快照:

创建快照

ozone sh snapshot create /vol1/bucket1 [snapshotName]
# Or via Hadoop FS interface:
# ozone fs -createSnapshot ofs://om-service/vol1/bucket1 [snapshotName]

需要桶所有者或管理员权限。如果省略 snapshotName,系统会自动生成(例如 s20250530-005848.163)。自定义名称必须唯一,且为有效的 DNS 名称。

删除快照

ozone sh snapshot delete /vol1/bucket1 <snapshotName>
# Or via Hadoop FS interface:
# ozone fs -deleteSnapshot ofs://om-service/vol1/bucket1 <snapshotName>

列出快照

ozone sh snapshot list /vol1/bucket1
# Or via Hadoop FS interface (list .snapshot directory):
# ozone fs -ls /vol1/bucket1/.snapshot

快照会出现在存储桶的只读 .snapshot 目录中。

从快照读取

列出对象键:

ozone sh key list /vol1/bucket1/.snapshot/<snapshotName>
# Or: ozone fs -ls /vol1/bucket1/.snapshot/<snapshotName>

获取密钥:

ozone sh key get /vol1/bucket1/.snapshot/<snapshotName>/reports/Q1.csv ./Q1_snapshot.csv

需要对该存储桶拥有读权限。

快照差异

显示两个快照之间,或某个快照与当前存储桶之间的变更。

ozone sh snapshot diff /vol1/bucket1 <snap1> <snap2_or_live_bucket>

输出前缀:+(新增)、-(删除)、M(修改)、R(重命名)。使用 -p、-t 进行分页。管理 diff 任务:ozone sh snapshot listDiff /vol1/bucket1、ozone sh snapshot cancelDiff <jobId>。

列出快照差异任务

列出某个存储桶的快照差异任务。

ozone sh snapshot listDiff /vol1/bucket1

默认列出状态为 in_progress 的作业。使用 --job-status 可按特定状态进行筛选:

# List jobs with specific status (queued, in_progress, done, failed, rejected)
ozone sh snapshot listDiff /vol1/bucket1 --job-status done

使用 --all-status 可列出所有作业,无论其状态如何:

# List all snapshot diff jobs regardless of status
ozone sh snapshot listDiff /vol1/bucket1 --all-status

注意: --all-status 与 -all(或 -a)的区别:

  • --all-status:根据状态控制显示哪些作业(列出所有作业,不论状态如何)
  • -all(或 -a):控制返回结果的数量(分页选项,取消分页限制,与快照差异作业的状态无关)

例如:

# List all jobs regardless of status, with pagination limit removed
ozone sh snapshot listDiff /vol1/bucket1 --all-status -all
# Or limit results to 10 items
ozone sh snapshot listDiff /vol1/bucket1 --all-status -l 10

快照信息

ozone sh snapshot info /vol1/bucket1 <snapshotName>

显示 ID、创建时间、状态以及空间使用情况(引用大小和独占大小)。

CLI 操作会调用 Ozone Manager 的 RPC,并执行权限校验。

通过 Java 进行编程访问

使用 Java API 管理和访问快照:

Hadoop 兼容文件系统(HCFS)接口

使用 Ozone 文件系统(ofs)API(Hadoop FileSystem)。

// Example: Create, list, read, rename, delete snapshots
Configuration conf = new OzoneConfiguration();
FileSystem fs = FileSystem.get(new Path("ofs://om-service/vol1/bucket1").toUri(), conf);
Path bucketPath = new Path("/vol1/bucket1");

// fs.createSnapshot(bucketPath, "snapshotName");
// fs.listStatus(new Path(bucketPath, ".snapshot"));
// fs.open(new Path(bucketPath, ".snapshot/snapshotName/key"));
// fs.rename(new Path(bucketPath, ".snapshot/oldName"), new Path(bucketPath, ".snapshot/newName"));
// fs.deleteSnapshot(bucketPath, "snapshotName");

处理 OMException 或 IOException。快照位于存储桶的 .snapshot 目录中。

有关更多详情,请参阅 Ozone 文件系统 API 指南。

Ozone 对象存储客户端 API

使用 OzoneClient 和 ObjectStore API。

// Example: Create, list, get info, rename, delete snapshots
OzoneClient ozClient = OzoneClientFactory.getRpcClient(conf);
ObjectStore store = ozClient.getObjectStore();

// store.createSnapshot("vol1", "bucket1", "snapshotName");
// store.listSnapshot("vol1", "bucket1", null, null);
// store.getSnapshotInfo("vol1", "bucket1", "snapshotName");
// store.renameSnapshot("vol1", "bucket1", "oldName", "newName");
// store.deleteSnapshot("vol1", "bucket1", "snapshotName");

对权限不足或快照不存在等问题进行异常处理。

HTTP REST API 访问

使用 HttpFS Gateway(兼容 WebHDFS 的 REST API)对快照执行文件系统操作(例如读取 .snapshot 路径)。支持创建、删除和重命名;getSnapshotDiff 尚不支持。

配置

配置属性

注意:快照相关配置可能会随时间变化。请查阅 ozone-default.xml 以获取最新设置。

主要的快照相关配置属性包括:

  • ozone.om.snapshot.diff.db.dir:快照差异任务数据的存储目录(默认为 OM 元数据目录)
  • 快照保留策略的配置
  • 快照清理及后台服务的相关设置

有关详细的快照配置属性,请参阅快照配置属性。

监控

当快照数量较多或差异较大时,请监控 OM 的堆内存使用情况。启用 Ozone 原生 ACL 或 Ranger 以进行访问控制。

监控快照: 使用 OM 指标(Prometheus、RPC)查看快照数量、差异操作等。请检查 OM 日志中的快照相关信息。

授权

快照操作需要特定的权限:

  • 创建、删除、重命名快照: 需要管理员或存储桶所有者权限,否则将被拒绝访问。
  • 列出快照、获取快照信息: 需要对存储桶的读取/列表权限。能够列出存储桶内容的用户通常也可以列出该存储桶的快照。
  • SnapshotDiff、取消/列出 SnapshotDiff 任务: 需要对存储桶的读取权限,因为差异信息会暴露键的相关信息。

Ozone 支持原生 ACL 以及可选的 Ranger 策略来进行快照授权。上述行为描述基于原生 ACL。如果使用 Ranger,请确保为快照操作配置了相应的权限。

与 HDFS 快照的对比

Ozone 和 HDFS 的快照在概念上相似,但在关键方面存在差异:

  • 粒度: Ozone 快照是存储桶级别的;HDFS 快照可以在任意目录层级创建(只要该目录被标记为可快照)。
  • 元数据与数据变更: 两者都跟踪键/文件的变更。Ozone 快照不会对存储桶元数据变更(例如配额、ACL)进行版本管理。
  • 访问与恢复: 两者都通过 .snapshot 路径进行只读访问。Ozone 中的恢复是手动复制过程(例如使用 DistCp);不支持自动回滚。
  • 实现方式: Ozone 使用 OM 的键值存储(RocksDB)实现基于 O(1) 元数据指针的快照。HDFS 同样采用元数据操作,但 Ozone 的对象存储特性意味着快照不涉及 Datanode 层面的块跟踪;所有逻辑都集中在 OM 中。

已知问题与限制

Ozone 快照的主要限制包括:

  • S3 接口支持: 快照操作(创建、列出、删除)无法通过 S3 API 或 s3a 连接器使用。请使用 Ozone RPC(shell、ozone fs、Java API)来管理快照。快照数据可以通过 S3 使用 .snapshot/snapshotName/keyName 路径进行读取。
  • Ratis 与 EC 桶: 快照同时适用于 Ratis 桶和 EC 桶,通过 Ozone 接口进行管理。
  • 保留命名空间名称 .snapshot: .snapshot 是桶根目录下的保留名称,不能用作用户创建的键或目录。
  • 快照性能与规模: 虽然创建快照很快,但单个桶中存在大量快照(数千个)会增加 OM 元数据大小,并可能拖慢列举操作。快照 diff 的性能通常不受快照数量影响,而受并发 diff 操作的影响。
  • 空间利用报告: 快照占用的空间(数据已不在活动桶中,但仍被快照保留)会在 ozone sh snapshot info 中报告。删除快照会异步释放空间。
  • 硬链接上限: RocksDB 检查点使用硬链接,受文件系统限制,每个文件最多 65,535 个。这限制了每个桶的快照数量。

有关这些限制的更新,请参阅项目发行说明。

Linux 系统配置

为在使用 Ozone 快照时获得最佳性能和稳定性(尤其是在生产环境中),请考虑以下系统配置:

  • 打开的文件描述符: 为 Ozone Manager(OM)进程提高 nofile ulimit(例如设置为 64,000 或更高),以便处理大量 RocksDB 文件和快照操作。
  • 元数据存储: 为 OM 元数据目录(ozone.metadata.dirs)使用 NVMe SSD 等高性能存储,以改善快照和 diff 操作的 I/O 性能。
  • OM 资源: 为 Ozone Manager 分配充足的内存(例如 16-32GB 以上,并监控 GC)和 CPU,尤其是对于快照众多或有并发 diff 任务的集群。
  • Datanode 磁盘空间: 需考虑 Datanode 磁盘占用的增加,因为快照会保留本应被删除的数据块。请根据快照保留策略和数据变化率规划容量。
  • 文件系统与内核: OM 元数据请使用 ext4 或 xfs 等文件系统(RocksDB 通常更偏好这些)。确保磁盘调度器和 RAID 配置已针对低延迟进行优化。
  • 网络: 确保与 OM 之间具备稳定可靠的网络连接,因为快照 diff 或 HttpFS 访问可能涉及大量数据传输。

请务必在预期负载下测试快照操作,以对这些配置进行微调。

评论

登录后参与评论

正在加载评论…