在做短视频项目的时候,我总是有个疑问:用户上传的视频我要存储在哪里呢?作为开发小白,目前只知道要存放数据就到DB里面去,那我想“那我的视频文件也要存储到MySQL里面去嘛?”emm,这的确是一个大难题,不过在互联网技术发达的今天,感谢各大论坛的支持,让我了解到了视频、图像这类非结构化数据最好是对象存储。

在此,你一定有一些疑惑:

  • 为什么视频不用mysql这类数据库进行存储呢?
  • 对象存储是什么,使用它存储非结构化数据有什么好处呢?

为什么不用MySQL存储非结构化数据?

首先哈,mysql人家本来就是用来存储结构化数据的,视频文件是一种非结构化数据。


结构化数据/非结构化数据/半结构化数据

结构化数据: 结构化数据是以清晰、预定义格式存储的数据。它通常以表格、数据库或电子表格的形式存在,其中每一列都有明确的数据类型和定义,每一行代表一个记录。结构化数据非常适合使用关系型数据库管理系统(RDBMS)来存储和管理,因为数据的组织方式已经被预先定义好。例如,存储在数据库中的订单信息、员工工资表以及销售数据都属于结构化数据的示例。

非结构化数据: 非结构化数据则没有固定的格式,它可能包含不同类型的信息,如文本、图像、音频、视频等。这种数据类型通常不适合传统的关系型数据库,因为它们缺乏统一的结构。非结构化数据的处理相对更为复杂,需要使用特定的技术和工具,如自然语言处理(NLP)技术用于处理文本数据,计算机视觉技术用于处理图像数据等。社交媒体帖子、电子邮件内容、图像文件以及语音记录都属于非结构化数据的例子。

半结构化数据: 半结构化数据可能具有一定的格式,但不像完全结构化数据那样严格。常见的半结构化数据格式包括XML(可扩展标记语言)和JSON(JavaScript对象表示法)。这些数据通常具有一些层次结构,但字段可能不像传统数据库表中的列那样明确定义。


MySQL是一种关系型数据库管理系统,通常用于存储和管理结构化数据,如文本、数字、日期等。虽然MySQL可以存储二进制数据,但它并不是设计用来直接存储大量大文件(如视频文件)的最佳工具。

以下是为什么通常不使用MySQL存储视频文件的一些原因:

  • 性能问题:MySQL的查询引擎是设计用来处理字符串、数值和日期等类型的数据的,对于大文件的存储和检索并不是最有效的。当你存储大量大文件时,可能会导致数据库性能下降,尤其是当你需要从数据库中检索这些文件时。
  • 存储效率:数据库通常使用磁盘空间来存储数据,而文件系统(如NFS、HDFS等)则更高效地存储大文件。使用数据库来存储大文件可能会导致不必要的磁盘空间浪费。
  • 文件操作:视频文件通常需要进行一些文件级别的操作,如复制、移动、删除等。这些操作通常比数据级别的操作更消耗资源。如果这些操作在数据库中进行,可能会导致性能问题。
  • 扩展性:当你的视频库变得非常大时,你可能需要扩展你的存储系统。数据库的扩展性通常比文件系统要复杂得多。

因此,对于存储和管理视频文件,通常建议使用专门的文件存储系统,如NFS、HDFS、S3等。这些系统更高效地处理大文件,并且通常提供更好的扩展性和更好的性能。如果你需要从你的视频文件中检索信息,你可以将这些信息存储在关系型数据库中,并使用数据库的功能来查询和管理这些信息。

关于对象存储

对象存储是一种用于存储和管理大规模非结构化数据的存储架构。与传统的文件系统或块存储不同,对象存储将数据存储为"对象",每个对象都包含数据本身以及与之相关的元数据(如文件名、创建日期、数据类型等)。这些对象被分布式地存储在多个服务器上,并通过唯一的标识符进行访问。

对象存储的主要特点包括:

  1. 扩展性: 对象存储设计用于应对海量数据的存储需求,可以轻松地扩展以适应不断增长的数据量,而无需大规模的基础架构变更。
  2. 分布式架构: 对象存储系统将数据分布在多个服务器上,提高了数据的可靠性和冗余性。即使某个服务器出现故障,数据仍然可以从其他服务器中恢复。
  3. 元数据: 每个对象都有丰富的元数据,这些元数据描述了对象的各种属性,包括文件名、大小、创建日期、数据类型等。这些元数据使得数据管理更加灵活和智能。
  4. 适应非结构化数据: 对象存储适用于存储各种类型的非结构化数据,如图像、音频、视频、日志文件、备份等。它不强制要求数据遵循特定的结构,因此非常适用于大多数现代应用生成的多样化数据。
  5. 数据访问和检索: 对象存储通常提供强大的数据访问和检索功能。您可以使用对象标识符进行数据检索,而不需要像传统文件系统那样的层次化文件路径。
  6. 云集成: 许多云平台提供对象存储服务,使得在云环境中存储和管理数据变得更加简单和经济。

三种存储形态

块存储(Block Storage)

块存储将数据分割成固定大小的块,通常以扇区(一般为512字节或更大)为单位。这些块可以被单独管理,读取和写入。块存储通常在底层使用了虚拟化技术,将块映射到物理存储设备上。块存储适用于需要随机读写的应用,如操作系统的磁盘,数据库,虚拟机镜像等。

主要特点:

  • 低延迟的读写操作。
  • 支持随机读写访问。
  • 通常用于需要高性能、低延迟和数据管理控制的应用。

文件存储(File Storage)

文件存储模式以文件为单位进行存储和管理。文件存储模式通常使用网络协议(如NFS或SMB)提供共享文件系统,使多台计算机能够共享相同的文件。这种模式适用于需要多台计算机访问相同文件的应用,如共享文件夹、办公文档、媒体文件等。

主要特点:

  • 以文件为单位进行管理和访问。
  • 适用于多台计算机之间的文件共享和协作。
  • 不适合大规模、高并发的访问。

对象存储(Object Storage)

对象存储是一种将数据以对象形式进行存储的方法。每个对象都包含数据本身、元数据(如文件名、创建日期等)以及一个唯一的标识符。对象存储通常在分布式环境中工作,可以自动扩展以适应大规模的数据。它适用于大规模的非结构化数据,如图像、音频、视频文件,以及需要长期保留和高可用性的数据。

主要特点:

  • 以对象为单位存储,每个对象都有唯一的标识符。
  • 可以存储海量非结构化数据。
  • 高可扩展性和可用性。
  • 适合数据归档、备份和云存储等场景。

区别

  • 块存储以固定大小的块为单位进行读写,适用于随机读写的应用;

    文件存储以文件为单位共享,适用于多台计算机之间的文件共享和协作;

    对象存储以对象为单位存储,适用于海量非结构化数据的存储。

  • 块存储和文件存储通常在操作系统级别进行管理,而对象存储在应用程序级别进行管理。

  • 对象存储通常具有更高的可扩展性和冗余性,适合大规模和长期数据存储。

  • 块存储和文件存储在访问控制和数据管理方面更加灵活,而对象存储强调数据的元数据和可扩展性。

常见的云平台的对象对象服务

  • 腾讯云:对象存储 COS
  • 阿里云:对象存储 OSS
  • 火山引擎:对象存储TOS
  • Azure:Azure Blob 存储

国内的各大云厂商的对象存储服务文档对他们的产品都介绍的挺详细的,我看了火山引擎TOS和Azure的存储服务,Azure的冗余服务在TOS中叫做多AZ冗余服务,大同小异,没有实际自己用过。国内云厂商对于学生的支持感觉还是不够,想要用还是得要自己掏钱,希望未来各大厂商还是能支持以下学生发展,积累一些企业口碑。