快好知 kuaihz

QingStor 对象存储架构设计及最佳实践(下)

作者:对象存储研发团队

5. 海量小文件优化实践

接下来谈谈 QingStor 对象存储对海量小文件场景的优化。

为什么需要对海量小文件进行优化呢?

海量小文件是很多存储产品中都是比较难以应对的问题,其难点主要体现在几个方面:

第一,小文件非常多的时候,会导致很多随机读写,相比于顺序读写,随机读写的性能会差很多。

第二,小文件在底层资源利用率比较低。如何理解?小文件最终存储时落到磁盘上,大多数时候底层都是采用文件系统存储,每一个小文件都会对应一个文件,文件系统会单独使用一个结构,也就是 inode,来记录每一个小文件的元信息,包括执行权限、用户组等信息,但是这些信息对用户来说往往是无意义的。

这导致在海量的场景下,可能出现一个情况:文件本身的数据不是那么多,但是不必要的元数据却非常多,占用大量存储空间,就会造成底层资源利用率较低。

针对这个问题,QingStor 对象存储做了一些优化,主要分为两方面:

在提升存储利用率方面,QingStor 对象存储把很多小文件合并成一个大文件。

如上图所示,这里有一个合并文件,里面包括很多小文件,包括x、a、b、c,它们都是单个 Object 小文件,都会写到同一个文件中。通过这种方式减少额外的元数据存储,提升资源利用率。

在使用这种方式时,如果需要删除前面的小文件,QingStor 对象存储只做一个标记,后台会有进程,实时、定期对合并文件进行压缩,将删除的资源进行释放。

在提升写入性能方面 ,QingStor 对象存储在写入一个小文件时,只把它向合并文件的尾部进行追加写入,不会在打开文件后对指定的 Offset 进行写入,也就是不做随机写,保证写入全是顺序写,大大提升写入性能。

此外,如果有并发的写入请求,比如 a、b、c三个都是小文件,有一个写入请求到了 Gateway,Gateway 会把这三个请求打包成一个,本来需要写三次,这里直接合并成一次。

把三次 I/O 减到一次 I/O,能做这样的合并是因为底层是采用合并方式的存储,并发 I/O 的合并进一步提升 QingStor 对象存储的写入性能。

在读取时,QingStor 对象存储通过合并文件的 Path 加上小文件中的 Offset,找到这个文件的数据进行读取。

举个例子,现在同时要读 x 和 a、b、c,在读完 x,打开文件句柄是可以重复利用的,不需要每一次读都打开文件,这种方式使得 QingStor 对象存储的小文件读取性能得到提升。

6. QingStor 对象存储重点功能介绍

QingStor 对象存储支持两种部署方式: 一种是标准部署,集群由网关节点和存储节点组成。

接入与索引与事件子系统会部署在网关节点上,存储节点只部署存储服务,把计算和存储分离,支持最小是六个节点规模的部署,这种方式比较适合数据量比较大,请求量也比较大的场景,网关节点与存储节点都可以进行独立扩容。

第二种是融合部署,集群由全能节点组成 ,把所有服务部署在全能节点上,这种方式是适合规模比较小,数据量比较小,访问量也不大的场景,如果数据量增长,可以非常方便以单个节点的方式进行存储与索引服务的扩容。

首先是生命周期管理功能,生命周期可以对存储的数据预设一些逻辑,过一段时间后自动对数据进行处理。

生命周期有一些典型的应用场景,例如对过期日志的处理,很多时候存储的日志是为了满足政策的要求,过几个月后就可以删除了。

生命周期管理可以设置自动规则,到期后自动删除过期的日志数据。此外,生命周期管理功能还能进行冷热数据分离,举个例子,业务只需要对近两个月的数据进行分析,更久远的数据就不需要。

但是为了合规需要,更久远的数据也需要保存,不能丢失,这时候生命周期管理功能可以做冷热数据的区分,自动设置数据经过一段时间后转移到更低成本的低频存储中。

QingStor 对象存储的生命周期功能是以存储桶为单位来进行,其核心是事件子系统进行消息的处理和分发。

用户写入一个对象后会产生一个事件,事件子系统会分析这个事件要怎么处理,比如经过一周、一个月进行删除,或者转移到低频,从而对数据进行相应的处理。

如果在开启生命周期功能管理之前,系统已经有一些历史数据,事件子系统会主动拉取这些历史数据,对它进行分析和处理。

QingStor 对象存储另一个重要的功能是跨区域复制,适用于数据的备份与容灾场景。

跨区域复制的应用场景主要包括:

备份和容灾: 为了保证数据安全性,在本地有一份之外,需要在另一个机房做备份,本地机房的数据丢失了,可以用远端的数据来恢复。

就近访问: 如果业务的用户分布在不同的区域,每个用户在访问其图片、视频资源时,希望更快地获取数据。

QingStor 对象存储可以按照地域来存储数据,北京一份,上海一份,数据可以写入到北京,跨区域复制到上海,满足就近访问的需求。

提升计算效率: 如果有多个机器学习、数据挖掘的应用程序或业务程序要访问同一份数据,这些业务程序可能部署在不同的地方。为了保证计算效率,QingStor 对象存储可以通过跨区域复制,就近复制一份数据。

跨区域复制的功能核心仍然是事件子系统,用户写入一个对象后,就会产生一个事件,事件子系统会处理这个事件,将数据复制到远端指定目标的存储桶里。

如果在配置这个功能之前系统已经有一些历史数据,在配置之后,事件子系统会主动拉取这些数据,将它复制到远端的位置。

接下来重点介绍QingStor 对象存储的数据处理功能。

用户要对存储在对象存储中的数据进行处理,包括视频转码、缩略图、图片加水印等,可以将要做的动作打包成一个任务进行提交,通过 Gateway 服务进入事件子系统,事件子系统将按照指定的动作将数据读出来,进行处理与写入目标位置。

做数据处理的前提是数据存放在对象存储存储桶中,这是数据处理的流程,其核心依然是QingStor 对象存储的事件子系统。

下面从用户的角度来看 QingStor 对象存储是否够方便,是否容易上手。

QingStor 对象存储的所有功能 API 都是开放的,可以进行调取和访问, 同时提供8 种主流的SDK ,涵盖主流的编程语言,这些 SDK 代码都是开源的,都在 GitHub 上,大家可以直接拿来使用。

此外,QingStor 对象存储提供两个高级命令行工具:

第一种是 qsctl,提供强大的类 Unix 命令,用于管理本地数据资源以及 QingStor 对象存储中远程的数据资源,可以非常方便地对数据进行操作,包括 RM、CP 等操作,提供一键同步,将你本地的数据与对象存储中的数据进行同步。

第二种命令行工具是 qscamel,用于在不同对象存储系统间进行高效的数据迁移,比如现在有数据在阿里云的 OSS 里,你想把它迁移到 QingStor 中,可以使用这个工具来完成。这个工具目前支持主流的对象存储,包括 QingStor、AliyunOSS、AWS S3 以及 GoogleCloud Storage 等,可以在这些系统之间进行数据的迁移。

S3 是亚马逊对象存储服务访问接口的标准,QingStor 对象存储是对 S3 兼容得非常好,很多已经基于 S3 开发的应用程序、SDK 和第三方服务,都可以在不修改代码的前提下非常容易地接入 QingStor 对象存储,包括 Hadoop、Spark、ElasticSearch 以及 Docker 等。

7. 交通行业最佳实践

最后我们从智能交通平台这个场景出发,看看如何在业务中使用 QingStor对象存储。智能交通平台的主要应用是高速公路上的视频监控,以及在收费站进行拍照、收费、车牌识别等业务。

这是一个典型的高并发访问场景,高速摄像头非常多,收费站也是非常多的。每一个摄像头、每一个收费站都会产生海量图片、视频资源,要发送 QingStor 对象存储中。

数据是非常重要的,高速公路上的每一段视频,事后可能要用于查看当时发生的情况,数据一定要做可靠的存储

另一方面,要求存储系统可以与第三方业务应用无缝对接,例如在收费站拍了车辆照片,需要识别其车牌号,查询从哪里开过来,这就要求 QingStor对象存储与其他业务系统进行对接。

QingStor 对象存储的接入服务可以通过扩展的方式支持高并发场景,采用多副本提供可靠的强一致存储

数据写入后,QingStor 对象存储会产生事件,这个事件会到事件子系统,按照预设的逻辑进行数据处理,用户可以自定义第三方接口。比如做一个车牌识别,或者做扣费逻辑,都可以通过自定义接口与业务系统进行关联。

此外,QingStor 对象存储的数据沉淀,后期可以支持业务的大数据分析和决策。

最后做个总结,QingStor 对象存储是一款面向海量非结构化数据的企业级通用数据存储平台,具备无限扩容与跨地域的服务能力,可完美支撑各类互联网应用、大数据分析、音视频影像、备份系统等企业级应用场景下的存储需求,帮您构建面向未来、赋能业务的数据存储平台。

本站资源来自互联网,仅供学习,如有侵权,请通知删除,敬请谅解!
搜索建议:架构  架构词条  QingStor  QingStor词条  对象  对象词条  存储  存储词条  实践  实践词条