Ozone 是 Hadoop 的分布式对象存储系统,具有易扩展和冗余存储的特点。Ozone 不仅能存储数十亿个不同大小的对象,还支持在容器化环境(比如 Kubernetes)中运行。Apache Spark、Hive 和 YARN 等应用无需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口,极大地方便了 Ozone 在不同应用场景下的使用。
HDFS面对大文件时,表现极佳,但是一直受到小文件的困扰。Ozone 是一种分布式key-value对象存储,可以同时管理大文件和小文件。Ozone 原生支持 S3 API,并提供与 Hadoop 兼容的文件系统接口。CDP Private Cloud Base中包含了Ozone组件,可以通过Cloudera Manager进行部署,管理和维护。
1.Ozone存储元素
当客户端写入key时,Ozone将数据以多个chunk的形式保存到DataNode上,称为block,一个Block包含多个Chunk,Chunk是客户端数据读写的基本单位。因此每个key都与一个或多个block相关联,在 DataNode 内,多个不相关的block可以驻留在storage container中。
2.Ozone的主要特性
Ozone 将命名空间和存储的管理分开,从而方便扩展。Ozone Manager (OM) 管理命名空间,而 Storage Container Manager (SCM) 管理容器。存储在 OM,SCM 和数据节点上的所有元数据都需要存储在 NVME 或 SSD 等低延迟磁盘中。下图是Ozone的基础架构组成:
1.Ozone Manager
Ozone Manager (OM) 是一个高可用的命名空间管理服务,它管理卷、存储桶和key的元数据,OM维护key与其对应的block ID之间的映射。当客户端应用程序请求key来执行读写操作时,OM 与 SCM 交互以获取相关的block信息,并将该信息反馈给客户端。OM 使用 Apache Ratis来复制 Ozone Manager状态。当 RocksDB(嵌入式存储引擎)保存元数据或键空间(keyspace)时,会将 Ratis 事务flush到本地磁盘以确保持久化。因此每个OM都需要配备NVME或者SSD低延迟的存储设备,同时可以确保最大吞吐,典型的Ozone集群一般都会部署三个OM节点。
2.DataNode
DataNode 存储客户端写入的数据块,这些块的集合称为一个storage container。对于一个block,客户端以一个固定的chunk文件大小(4MB)传输数据,这些chunk文件最终是被写入磁盘。DataNode以固定的时间间隔向SCM发送心跳,每次心跳时,DataNode 都会发送容器报告。DataNode 中的每个storage container都有自己的 RocksDB 实例,用于存储block和chunk文件的元数据。每个 DataNode 都可以是一个或多个活动管道的一部分,这个管道实际上是一个 Ratis 仲裁,包含选举出来的leader DataNode,以及follower的DataNodes(接受数据写入)。但来自客户端的读取直接进入 DataNode,而不用通过 Ratis。DataNode上也需要配备SSD高速磁盘来保存活动管道的 Ratis 日志并提高写入吞吐量。
3.Storage Container Manager
storage container是Ozone中的复制单元,而HDFS的复制单元则直接是block,Ozone是将block装在了container中,container的默认大小为5GB。SCM 管理 DataNode 管道以及管道上容器的放置,管道是基于复制因子的DataNode 的集合。假设默认复制因子为 3,则每个管道包含三个 DataNode。SCM 负责创建和管理发生块分配的 DataNode 的活动写入管道。
客户端直接将block写入DataNode上打开的container,SCM并不直接位于数据路径上,容器在关闭后是不可变的。 SCM 使用 RocksDB 来保存管道元数据和容器元数据,与 OM 管理的键空间(keyspace)相比,此元数据要小得多。
SCM是一个使用Apache Ratis 的高可用组件,建议在SCM节点上为Ratis WAL和RocksDB配置SSD高速磁盘,生产Ozone集群建议部署三个SCM节点。
Recon 是 Ozone 集群内的集中式监控和管理服务,如管理和维护OM和SCM的元数据信息。Recon 会拍摄 OM 和 SCM 元数据的快照,同时还接收来自 DataNode 的心跳。Recon 根据集群的繁忙程度以增量方式异步构建集群完整状态的快照,Recon 通常在更新 OM 元数据快照方面落后 OM 一些事务。建议使用SSD来维护快照信息,这样可以让Recon的快照信息尽量追上OM的事务更新。
5.Ozone File System Interfaces
Ozone 是一个多协议存储系统,支持以下接口:
6.S3 Gateway
S3 gateway一个无状态组件,可通过 HTTP 提供对 Ozone 的 REST 访问,并支持与 AWS 兼容的 s3 API。 S3网关支持分段上传和加密区域(encryption zone)。此外,S3 gateway将通过 HTTP 的 s3 API 调用转换为对其他 Ozone 组件的 rpc 调用。为了扩展S3访问,建议部署多个S3 gateway节点,并在之上部署负载均衡如haproxy。
container是Ozone 的基本复制单元,由SCM服务进行管理,container是大型的二进制单元,默认5GB,可以包含多个block。SCM并不管理block的本地信息,因此即使系统中创建了数十亿个小文件(即数十亿block),DataNode 也只会报告容器的状态。每当 Ozone Manager 向 SCM 请求新的block分配时,SCM 都会识别合适的容器并生成包含 ContainerId 和 LocalId 的block id。客户端连接到存储容器的DataNode,DataNode根据LocalId管理block。
Open vs closed containers
Open | Closed |
---|---|
mutable | immutable |
replicated with RAFT (Ratis) | Replicated with async container copy |
Write: Allowed only on Raft Leader | Write: No writes are allowed |
Read: On all replicas | Read: On all replicas |
Deletes: Not allowed | Deletes: allowed |
客户端请求与其想要读取的key相对应的block位置,如果客户端具有所需的读取权限,Ozone Manager (OM) 将返回block位置。
1.客户端向 OM 请求与要读取的key对应的block位置。
2.OM 检查 ACL 以确认客户端是否具有所需的权限,并返回允许客户端从 DataNode 读取数据的block位置和block token。
3.客户端连接到与返回的Block ID关联的DataNode并读取数据块。
客户端向 Ozone Manager (OM) 请求block来写入key,OM返回Block ID和对应的DataNode供客户端写入数据。
1.客户端向 OM 请求块来写入key,该请求包括key、管道类型和复制计数。
2.OM 找到与 SCM 请求匹配的block并将它们返回给客户端。
3.客户端连接到与返回的block信息关联的DataNode并写入数据。
4.写入数据后,客户端通过发送提交请求来更新OM上的block信息。
5.OM记录相关的key信息。在 OM 提交与key关联的block信息之前,Ozone 中的key不可见。 客户端通过提交请求在 DN 上写入block后,负责将key-block信息发送给 OM。
Ozone是一个一致性的对象存储,删除请求完成后,Ozone Manager 会从活动命名空间中删除该key,并将该文件标记为垃圾回收。Ozone也遵循异步删除的原理,在大多数文件系统中,垃圾回收和释放存储空间的机制是异步管理的,以确保删除操作不会与读取和写入操作冲突。
Ozone Manager 中标记为已删除的文件由container聚合,并向 SCM 发送删除block的请求。 然后SCM 将请求转发到 DataNode 以从磁盘释放实际空间。block删除仅发生在closed的container上,例如如果删除命名空间中的对象,则删除操作仅反映在closed容器中的相应block。对于状态不是 CLOSED 的容器中存在的block,仅在容器达到 CLOSED 状态后才会进行删除。