Apache Ozone 中的 RocksDB
本页介绍高级主题。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.profile | DISK | 指定要使用的 RocksDB 配置档(profile),它决定默认的 DBOptions 和 ColumnFamilyOptions。可选值包括 SSD 和 DISK。例如,将其设置为 SSD 将应用针对 SSD 存储优化的调优参数。 |
ozone.metastore.rocksdb.statistics | OFF | RocksDB 存储的统计级别。若设置为 org.rocksdb.StatsLevel 中的任意值(例如 ALL 或 EXCEPT_DETAILED_TIMERS),RocksDB 统计信息将通过 JMX 暴露。设置为 OFF 则禁用统计信息收集。注意:收集统计信息可能会带来 5–10% 的性能损耗。 |
写入选项(Write Options):
| 属性 | 默认值 | 说明 |
|---|---|---|
hadoop.hdds.db.rocksdb.writeoption.sync | false | 若设置为 true,写入将同步到持久化存储,以牺牲性能为代价确保持久性;若为 false,写入将异步刷盘。 |
ozone.metastore.rocksdb.cf.write.buffer.size | 128MB | RocksDB 存储中每个列族的写缓冲区(memtable)大小。 |
预写日志(Write-Ahead Log,WAL)管理:
| 属性 | 默认值 | 说明 |
|---|---|---|
hadoop.hdds.db.rocksdb.WAL_ttl_seconds | 1200 | WAL 文件的存活时间(TTL),单位为秒。 |
hadoop.hdds.db.rocksdb.WAL_size_limit_MB | 0 | WAL 文件的总大小上限,单位为兆字节。超过该上限时,最旧的 WAL 文件会被删除。取值 0 表示不限制。 |
日志记录:
| 属性 | 默认值 | 说明 |
|---|---|---|
hadoop.hdds.db.rocksdb.logging.enabled | false | 启用或禁用 RocksDB 自身的日志功能。 |
hadoop.hdds.db.rocksdb.logging.level | INFO | RocksDB 的日志级别(INFO、DEBUG、WARN、ERROR、FATAL)。 |
hadoop.hdds.db.rocksdb.max.log.file.size | 100MB | 单个 RocksDB 日志文件的最大大小。 |
hadoop.hdds.db.rocksdb.keep.log.file.num | 10 | 保留的 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``keyTablefileTabledirectoryTabledeletedTabledeletedDirectoryTablemultipartInfoTable由该服务进行压缩的列族列表,以逗号分隔。
Datanode 专用设置
这些设置定义在 DatanodeConfiguration.java 中,专门适用于 Datanode,并会在适用的情况下覆盖通用设置。
Datanode 的关键调优参数通常涉及:
内存使用: 配置块缓存、写缓冲区管理器以及其他与内存相关的设置。
| 属性 | 默认值 | 说明 |
|---|---|---|
hdds.datanode.metadata.rocksdb.cache.size | 1GB | 配置 Datanode 上 RocksDB 实例的块缓存大小。 |
压缩(Compaction)策略: 优化数据在磁盘上的合并与组织方式。
| 属性 | 默认值 | 说明 |
|---|---|---|
hdds.datanode.rocksdb.auto-compaction-small-sst-file | true | 启用或禁用小 SST 文件的自动压缩。 |
hdds.datanode.rocksdb.auto-compaction-small-sst-file-size-threshold | 1MB | 触发自动压缩的小 SST 文件大小阈值。 |
hdds.datanode.rocksdb.auto-compaction-small-sst-file-num-threshold | 512 | 触发自动压缩的小 SST 文件数量阈值。 |
hdds.datanode.rocksdb.auto-compaction-small-sst-file.interval.minutes | 120 | 自动压缩小 SST 文件的时间间隔(分钟)。 |
hdds.datanode.rocksdb.auto-compaction-small-sst-file.threads | 1 | 自动压缩小 SST 文件所使用的线程数。 |
预写日志(WAL)设置: 在持久性与写入性能之间取得平衡。
| 属性 | 默认值 | 说明 |
|---|---|---|
hdds.datanode.rocksdb.log.max-file-size | 32MB | RocksDB 每个用户日志文件的最大大小。0 表示不设大小限制。 |
hdds.datanode.rocksdb.log.max-file-num | 64 | 每个 RocksDB 实例保留的最大用户日志文件数量。 |
日志记录:
| 属性 | 默认值 | 说明 |
|---|---|---|
hdds.datanode.rocksdb.log.level | INFO | RocksDB 的用户日志级别(DEBUG/INFO/WARN/ERROR/FATAL)。 |
其他设置:
| 属性 | 默认值 | 说明 | |
|---|---|---|---|
hdds.datanode.db.config.path | 空(未配置) | 指向 INI 配置文件的路径,用于在 Datanode 上对 RocksDB 进行高级调优。 | |
hdds.datanode.container.schema.v3.enabled | true | 启用容器 schema v3(每个磁盘一个 RocksDB)。 | |
hdds.datanode.container.schema.v3.key.separator | \ | schema v3 中容器 ID 与容器元数据键名之间的分隔符。 | |
hdds.datanode.rocksdb.delete-obsolete-files-period | 1h | 删除过时文件的周期。 | |
hdds.datanode.rocksdb.max-open-files | 1024 | RocksDB 可以打开的文件总数。 |
4. 与 RocksDB 相关的故障排查和修复工具
在 Ozone 中排查 RocksDB 问题通常涉及:
分析 RocksDB 日志中的错误和警告。
使用 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 的空间。
- 包含大量小文件的工作负载会产生更多的块,需要的磁盘空间会偏向该范围的上限。
评论
登录后参与评论
KnowForge