存储的本质 | 青训营笔记

144 阅读8分钟

这是我参与「第五届青训营 」笔记创作活动的第15天

1 存储 & 数据库简介

1.1 存储系统概览

存储系统是指能高效存储,持久化用户数据的一系列系统软件。在众多的存储系统中,以下是三类比较主流的存储产品及其特点分析:

1.1.1 块存储

底层语义,基于 block 编程;

接口朴素:在 Linux 的 IO 软件栈中,要直接使用块存储的话就要基于 LBA 编程,因此接口较为简单朴素,再加上块存储本身处于整个存储软件栈的底层,这导致块存储使用起来并不十分友好;

追求低时延、高吞吐:研发一个块存储系统,在设计目标上我们往往会追求超高的性能,体现在超低的时延和超高的吞吐。但考虑到块存储的接口确实过于朴素,往往只有一些追求超高性能的系统才会直接基于块存储构建,然后自建应用层 cache。

1.1.2 对象存储

公有云上的王牌存储产品:在 IT 时代,“Everything is data”的趋势迅速催化了对象存储系统。尤其对于字节跳动的业务而言,使用对象存储系统来处理视频、图片、音频等非结构化的数据,语义最为自然;

非结构化数据,提供 immutable 语义:一旦图片或视频等非结构化数据上传至对象存储系统成功,则无法对其进行原地修改,只能通过删除旧数据,重新上传新数据的方式完成“修改”逻辑;

成本优先:一般不苛求单次操作的时延,但是非常注重系统吞吐 & 存储成本。

1.1.3 文件系统

  • 接口语义丰富,普适性强:遵循 POSIX/弱 POSIX 语义,诸如 Open、Write、Read 等许多操作数据的接口都能在文件系统中被找到。
  • 拥有较多开源的分布式实现,生态良好。
  • 一般也不苛求时延,注重系统吞吐 & 存储成本。

1.2 数据库系统概览

数据库系统(Database System, DBS)是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。

数据库的使用是十分广泛的。常见的应用场景如:企业日常信息,银行和金融,大学,航空公司,和通信等。这些企业和机构需要利用数据库来存储和检索大量的数据信息。数据库已成为当今每个企业必不可少的组成部分。

20世纪90年代,网络的快速发展,大量的在线服务和应用被人们广泛的使用,这些应用的数据几乎都是存在数据库系统中。虽然应用接口隐藏了访问数据库的细节,大部分人在使用网络应用时没有意识到自己在操作数据库,实际上,访问数据库已成为每个人生活中不可缺少的一部分。

2 主流产品剖析

2.1 单机存储产品

作为应用程序开发者,我们不需要直接操作硬盘,而是通过操作系统,以文件的方式对硬盘上的数据进行读写访问。文件系统将硬盘空间以块为单位进行划分,每个文件占据若干个块,然后再通过一个文件控制块FCB(File Controll Block)记录每个文件占据的硬盘数据块。

这个文件控制块在Linux操作系统中就是inode,要想访问文件,就必须获得文件的inode 信息,在inode中查找文件数据块索引表,根据索引中记录的硬盘地址信息访问硬盘,读写数据。

inode中记录着文件权限、所有者、修改时间和文件大小等文件属性信息,以及文件数据块硬盘地址索引。inode是固定结构的,能够记录的硬盘地址索引数也是固定的,只有15个索引。其中前12个索引直接记录数据块地址,第13个索引记录索引地址,也就是说,索引块指向的硬盘数据块并不直接记录文件数据,而是记录文件数据块的索引表,每个索引表可以记录 256个索引;第14个索引记录二级索引地址,第15个索引记录三级索引地址。

2.2 分布式存储产品

2.2.1 HDFS

分布式文件系统的思路其实和RAID 是一脉相承的,就是将数据分成很多片,同时向N台服务器上进行数据写入。针对一片数据丢失就导致整个文件损坏的情况,分布式文件系统也是采用数据备份的方式,将多个备份数据片写入多个服务器,以保证文件的可用性。当然,也可以采用RAID 5的方式通过计算校验数据片的方式提高文件可用性。

以Hadoop分布式文件系统HDFS为例,看下分布式文件系统的具体架构设计。

image.png

HDFS的关键组件有两个,一个是DataNode,一个是NameNode。

DataNode负责文件数据的存储和读写操作,HDFS将文件数据分割成若干数据块(Block),每个DataNode存储一部分数据块,这样文件就分布存储在整个HDFS服务器集群中。应用程序客户端(Client)可以并行对这些数据块进行访问,从而使得HDFS可以在服务器集群规模上实现数据并行访问,极大地提高了访问速度。在实践中,HDFS集群的DataNode服务器会有很多台,一般在几百台到几千台这样的规模,每台服务器配有数块硬盘,整个集群的存储容量大概在几PB到数百PB。

NameNode负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、访问权限、数据块的ID以及存储位置等信息,相当于Linux系统中inode的角色,要以使用主从的容灾方式(一主一备,互为热备)。HDFS为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为3份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有硬盘损坏,或者某个DataNode服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。

2.2.2 Ceph

ceph是⼀种分布式存储系统,可以将多台服务器组成⼀个超⼤集群,把这些机器中的磁盘资源整合到⼀块⼉,形成⼀个⼤的资源池(⽀持PB级别,大厂用得多),然后按需分配给客户端应⽤使⽤。由于ceph源码代码量较大。

优势:

1、⽀持三种存储接口: 对象存储、块存储、⽂件存储,称之为统⼀存储

2、采⽤CRUSH算法,数据分布均衡,并⾏度⾼,不需要维护固定的元数据结构。CRUSH需要集群的映射,并使⽤

3、CRUSH映射在OSDs中伪随机存储和检索数据,数据在集群中均匀分布

4、数据具有强⼀致性,确保所有副本写⼊完成后才返回确认,适合读多写少的场景

5、去中⼼化,没有固定的中⼼节点,集群扩展灵活

ceph缺陷

1、去中⼼化的分布式解决⽅案,需要提前做好组件和节点部署规划设计

2、ceph扩容时,由于其数据分布均衡的特性,会导致整个存储系统性能下降

2.3 单机数据库产品

2.3.1 关系型数据库

关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。

优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

2.3.2 非关系型数据库

非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。