性能

Apache Ozone 中的 RocksDB

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

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

本页介绍高级主题。Ozone 的日常运维通常无须修改这些设置。

RocksDB 是 Apache Ozone 的关键组件,提供高性能的嵌入式键值存储。Ozone 的多个服务使用它来持久化元数据和状态。

1. RocksDB 简介

RocksDB 是由 Facebook 创建的基于日志结构合并树(LSM-tree)的键值存储。它针对 SSD 等高速存储环境进行了优化,具有高写入吞吐量和高效的点查询能力。更多详情请参阅 RocksDB GitHub 项目和 RocksDB Wiki。

2. Ozone 如何使用 RocksDB

RocksDB 被以下 Ozone 组件用于存储关键元数据:

Ozone Manager(OM): OM 使用 RocksDB 作为其主要元数据存储,保存整个命名空间及相关信息。如 OMDBDefinition.java 中所定义,其中包括以下表:

  • 命名空间:

    • 对象存储布局: volumeTable、bucketTable、keyTable(用于对象存储布局)、openKeyTable(用于跟踪分段上传期间的未完成键)以及 multipartInfoTable(用于存储分段上传信息)。
    • 文件系统布局: directoryTable 和 fileTable(用于文件系统布局)、openFileTable(用于跟踪打开的文件)以及 deletedDirectoryTable(用于跟踪已删除的目录)。
    • 访问控制: prefixTable(用于存储基于前缀的访问控制信息)。
  • 安全: userTable、dTokenTable(委托令牌)和 s3SecretTable。

  • S3 多租户: tenantStateTable(用于存储租户状态信息)、tenantAccessIdTable(用于存储访问 ID 信息)以及 principalToAccessIdsTable(用于将用户主体映射到访问 ID)。

  • 状态管理:

    • transactionInfoTable,用于跟踪事务。
    • metaTable,用于存储各类杂项元数据键值对。
    • deletedTable,用于存储待删除的键。
  • 快照: snapshotInfoTable 用于管理 Ozone 快照,snapshotRenamedTable(用于跟踪快照之间被重命名的对象),以及 compactionLogTable(用于存储压缩日志条目)。

Storage Container Manager(SCM): SCM 将存储层的状态持久化到 RocksDB 中。其结构在 SCMDBDefinition.java 中定义,包含以下表:

  • pipelines:管理数据管道的状态与构成。
  • containers:存储集群中所有存储容器的信息。
  • deletedBlocks:跟踪被标记为删除并等待垃圾回收的块。
  • move:协调容器移动,以实现数据再平衡。
  • validCerts:存储用于校验 Datanode 的证书。
  • validSCMCerts:存储用于校验 SCM 的证书。
  • scmTransactionInfos:跟踪 SCM 事务。
  • sequenceId:管理各种 SCM 操作的序列 ID。
  • meta:存储 SCM 的各类元数据,包括升级最终化状态和元数据布局版本。
  • statefulServiceConfig:存储有状态服务的配置。

Datanode: Datanode 主要出于以下两个用途使用 RocksDB:

  • 每卷元数据: 每个存储卷都会维护一个 RocksDB 实例。每个这样的实例管理存储在该特定卷上的容器和块的元数据。如 DatanodeSchemaThreeDBDefinition.java 中所指定,该数据库由 block_data、metadata、delete_txns、finalize_blocks 和 last_chunk_info 这几个列族构成。为了优化性能,它使用基于容器 ID 的定长前缀,从而借助 RocksDB 的前缀 seek 功能实现高效查找。
  • 全局容器跟踪: 此外,每个 Datanode 还拥有一个独立的 RocksDB 实例,用于记录其管理的所有容器的集合。该数据库在 WitnessedContainerDBDefinition.java 中定义,包含一个 ContainerCreateInfoTable 表,提供该 Datanode 上所承载容器的完整索引。

Recon: Ozone 的管理与监控工具 Recon 维护着自己的 RocksDB 数据库,用于存储聚合数据和历史数据以供分析。ReconDBDefinition.java 定义了以下表:

  • containerKeyTable:将容器映射到其包含的键。
  • namespaceSummaryTable:存储聚合的命名空间信息,便于快速生成报表。
  • replica_history:跟踪容器副本的历史位置,这对审计和诊断至关重要。
  • keyContainerTable:将键映射到其所在的容器。
  • containerKeyCountTable:存储每个容器中的键数量。
  • replica_history_v2:跟踪带有 BCSID 的容器副本历史位置,这对审计和诊断至关重要。
  • fileCountBySizeTable:存储按大小范围分组的文件数量统计信息。
  • globalStatsTable:存储 Recon 服务的全局统计信息。

3. RocksDB 的调优

对 RocksDB 进行有效调优可显著影响 Ozone 的性能。Ozone 暴露了若干配置属性用于调优 RocksDB 的行为。这些属性通常位于 ozone-default.xml 中,可在 ozone-site.xml 中被覆盖。

通用设置

Ozone 提供了一组通用的 RocksDB 配置,这些配置适用于所有服务(OM、SCM 和 Datanode),除非被更具体的设置覆盖。除 hdds.db.profile 和 ozone.metastore.rocksdb.cf.write.buffer.size 外,其余属性均定义在 RocksDBConfiguration.java 中。

属性默认值说明
hdds.db.profileDISK指定要使用的 RocksDB 配置档(profile),它决定默认的 DBOptions 和 ColumnFamilyOptions。可选值包括 SSD 和 DISK。例如,将其设置为 SSD 将应用针对 SSD 存储优化的调优参数。
ozone.metastore.rocksdb.statisticsOFFRocksDB 存储的统计级别。若设置为 org.rocksdb.StatsLevel 中的任意值(例如 ALL 或 EXCEPT_DETAILED_TIMERS),RocksDB 统计信息将通过 JMX 暴露。设置为 OFF 则禁用统计信息收集。注意:收集统计信息可能会带来 5–10% 的性能损耗。

写入选项(Write Options):

属性默认值说明
hadoop.hdds.db.rocksdb.writeoption.syncfalse若设置为 true,写入将同步到持久化存储,以牺牲性能为代价确保持久性;若为 false,写入将异步刷盘。
ozone.metastore.rocksdb.cf.write.buffer.size128MBRocksDB 存储中每个列族的写缓冲区(memtable)大小。

预写日志(Write-Ahead Log,WAL)管理:

属性默认值说明
hadoop.hdds.db.rocksdb.WAL_ttl_seconds1200WAL 文件的存活时间(TTL),单位为秒。
hadoop.hdds.db.rocksdb.WAL_size_limit_MB0WAL 文件的总大小上限,单位为兆字节。超过该上限时,最旧的 WAL 文件会被删除。取值 0 表示不限制。

日志记录:

属性默认值说明
hadoop.hdds.db.rocksdb.logging.enabledfalse启用或禁用 RocksDB 自身的日志功能。
hadoop.hdds.db.rocksdb.logging.levelINFORocksDB 的日志级别(INFO、DEBUG、WARN、ERROR、FATAL)。
hadoop.hdds.db.rocksdb.max.log.file.size100MB单个 RocksDB 日志文件的最大大小。
hadoop.hdds.db.rocksdb.keep.log.file.num10保留的 RocksDB 日志文件的最大数量。

Ozone Manager(OM)专用设置

这些设置定义在 ozone-default.xml 中,专门适用于 Ozone Manager。

属性默认值说明

ozone.om.db.max.open.files``-1(无限制)OM 中单个 RocksDB 可以打开的文件总数。

ozone.om.compaction.service.enabled``false启用或禁用一个后台作业,该作业会定期压缩被标记为需要压缩的 RocksDB 表。

ozone.om.compaction.service.run.interval``6hOM 压缩服务的运行间隔。

ozone.om.compaction.service.timeout``10mOM 压缩服务的超时时间。

ozone.om.compaction.service.columnfamilies``keyTable
fileTable
directoryTable
deletedTable
deletedDirectoryTable
multipartInfoTable由该服务进行压缩的列族列表,以逗号分隔。

Datanode 专用设置

这些设置定义在 DatanodeConfiguration.java 中,专门适用于 Datanode,并会在适用的情况下覆盖通用设置。

Datanode 的关键调优参数通常涉及:

内存使用: 配置块缓存、写缓冲区管理器以及其他与内存相关的设置。

属性默认值说明
hdds.datanode.metadata.rocksdb.cache.size1GB配置 Datanode 上 RocksDB 实例的块缓存大小。

压缩(Compaction)策略: 优化数据在磁盘上的合并与组织方式。

属性默认值说明
hdds.datanode.rocksdb.auto-compaction-small-sst-filetrue启用或禁用小 SST 文件的自动压缩。
hdds.datanode.rocksdb.auto-compaction-small-sst-file-size-threshold1MB触发自动压缩的小 SST 文件大小阈值。
hdds.datanode.rocksdb.auto-compaction-small-sst-file-num-threshold512触发自动压缩的小 SST 文件数量阈值。
hdds.datanode.rocksdb.auto-compaction-small-sst-file.interval.minutes120自动压缩小 SST 文件的时间间隔(分钟)。
hdds.datanode.rocksdb.auto-compaction-small-sst-file.threads1自动压缩小 SST 文件所使用的线程数。

预写日志(WAL)设置: 在持久性与写入性能之间取得平衡。

属性默认值说明
hdds.datanode.rocksdb.log.max-file-size32MBRocksDB 每个用户日志文件的最大大小。0 表示不设大小限制。
hdds.datanode.rocksdb.log.max-file-num64每个 RocksDB 实例保留的最大用户日志文件数量。

日志记录:

属性默认值说明
hdds.datanode.rocksdb.log.levelINFORocksDB 的用户日志级别(DEBUG/INFO/WARN/ERROR/FATAL)。

其他设置:

属性默认值说明
hdds.datanode.db.config.path空(未配置)指向 INI 配置文件的路径,用于在 Datanode 上对 RocksDB 进行高级调优。
hdds.datanode.container.schema.v3.enabledtrue启用容器 schema v3(每个磁盘一个 RocksDB)。
hdds.datanode.container.schema.v3.key.separator\schema v3 中容器 ID 与容器元数据键名之间的分隔符。
hdds.datanode.rocksdb.delete-obsolete-files-period1h删除过时文件的周期。
hdds.datanode.rocksdb.max-open-files1024RocksDB 可以打开的文件总数。

4. 与 RocksDB 相关的故障排查和修复工具

在 Ozone 中排查 RocksDB 问题通常涉及:

  • 分析 RocksDB 日志中的错误和警告。

  • 使用 RocksDB 内置工具检查数据库文件:

    • ldb:用于检查和操作 RocksDB 数据库内容的命令行工具。
    • sst_dump:用于检查 SST(静态表)文件内容的命令行工具,这些文件是 RocksDB 中存储数据的文件。
  • 了解常见的 RocksDB 错误码及其含义。

5. 版本兼容性

Ozone 2.2.0 使用 RocksDB 7.7.3。建议使用该版本的 RocksDB 工具,以确保兼容性并避免潜在问题。

6. 监控与指标

监控 RocksDB 的性能对于维护健康的 Ozone 集群至关重要。

  • RocksDB 统计信息: Ozone 可以暴露详细的 RocksDB 统计信息。为此,需在 ozone-site.xml 中将 ozone.metastore.rocksdb.statistics 设置为 ALL 或 EXCEPT_DETAILED_TIMERS。请注意,启用详细统计信息可能会带来性能损耗(5-10%)。
  • Grafana 仪表盘: Ozone 提供了可视化底层 RocksDB 统计信息的 Grafana 仪表盘。有关如何设置监控以及使用这些仪表盘的详细信息,请参阅 Ozone 监控文档。

7. 存储容量规划

为 RocksDB 实例合理规划存储容量,对于防止性能瓶颈和磁盘空间不足错误至关重要。各个 Ozone 组件的要求差异很大,强烈建议使用专用的高速存储(SSD)。

Ozone Manager(OM):

  • 基准值: OM 的 RocksDB 实例至少应预留 100 GB 空间。OM 存储着完整的命名空间元数据(卷、桶、键),因此它是集群中最关键的数据库。
  • 启用快照时: 启用 Ozone 快照会大幅增加存储需求。每个快照都会保留一份元数据视图,在快照被删除之前,底层的数据文件(SST)无法被压缩(compaction)删除。实际需求取决于保留的快照数量以及命名空间的变化率(创建/删除)。启用快照后请密切监控磁盘使用情况。更多详情请参阅 Ozone 快照文档。

存储容器管理器(SCM):

  • SCM 的元数据占用(管道、容器、DataNode 心跳)远小于 OM。其 RocksDB 实例的基准值通常为 20-50 GB 即可。

DataNode:

  • DataNode 的 RocksDB 存储所有容器及其块的元数据。其大小会随该 DataNode 上托管的容器和块的数量成比例增长。
  • 经验法则: 一个不错的起点是为 RocksDB 元数据预留数据磁盘总容量的 0.1% 到 0.5%。例如,拥有 100 TB 数据磁盘的 DataNode 应为其 RocksDB 元数据预留 100 GB 到 500 GB 的空间。
  • 包含大量小文件的工作负载会产生更多的块,需要的磁盘空间会偏向该范围的上限。

评论

登录后参与评论

正在加载评论…