Cloud Storage
Created by : Mr Dk.
2022 / 05 / 08 00:24
Hangzhou, Zhejiang, China
云上几种常见的存储有什么区别?
- 块存储
- 文件存储
- 对象存储
部署一个数据库,需要从哪几个层面做准备?
- 存储层
- 文件系统层
- DB 层
Block Storage
块存储提供一个可根据地址寻址的块设备,比如老式的硬盘寻址使用柱面-磁头-扇区,新硬盘使用逻辑块编号。一个物理上的块设备可以切分出多个逻辑块设备(分区)。从操作系统的视角,可以识别出多个逻辑或物理设备:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 40G 0 disk
└─nvme0n1p1 259:1 0 40G 0 part /etc/hosts
nvme1n1 259:2 0 100G 0 disk
网络/分布式存储系统可以将一个或多个分布在不同机器上的逻辑块设备共同组织为一个逻辑块设备对外提供服务,这个逻辑块设备的使用者不会察觉到数据真正位于哪个块设备上。
块设备的使用者是文件系统,或部分直接使用块设备的数据库。用户一般很少直接使用块设备。
File Storage
文件存储对外提供了类似树形结构的目录,用于访问块设备上的空间。具体如何将块设备的空间进行组织、用什么结构记录目录和文件之间的关系、用什么记录保存文件的内容,是文件系统的事情。在块设备上格式化了一个文件系统以后,就只能根据这个文件系统的规则去解析块设备上的存储空间了;否则块设备上保存的数据没有任何意义。
以 ext2/ext3/ext4 文件系统为例,在一个块设备上创建了文件系统以后,块设备的第一个块可能就被组织为 super block,之后的部分会被组织为 inode 和 data 的 bitmap,最后是 inode 和 data 的数据 block。如果使用 NTFS 文件系统的规则解析一个被格式化为 ext4 文件系统后的块设备,将没有任何意义。
分布式文件系统可以将多个相同或不同机器上的逻辑块设备整合,对外提供树形目录的访问模式。使用者通过一个路径就可以对分布式文件系统进行访问,不必知道真正的文件以何种形式被组织,存储在何处。
文件存储的使用者主要是人。
Object Storage
与文件存储不同,对象存储不再具有层级结构,每个对象都被存在一个扁平地址空间的同一级别,对象之间没有从属关系。访问某个对象时,提供唯一标识该对象的 key 就可以了。对象存储系统可以根据标识直接找到相应对象,不再需要反复解析路径。对象存储的使用者主要是程序。
DBMS Deployment
最近在部署数据库时,对存储、文件系统、DBMS 三个层次的边界有一些疑惑。正好捋一捋从零开始部署 DBMS 需要做哪些准备,区分一下它们的边界。
首先是存储层。一个 DBMS 中的数据最终肯定会被存储在存储设备的物理介质上。从 OS 的角度来看,存储层就是一个或多个 device,也就是所谓的裸磁盘,是可以通过 OS 的设备驱动程序来进行操作的。部分 DB 的数据,比如 MySQL InnoDB 的共享表空间,可以直接存放在裸磁盘上(带来的问题是可能写坏整个磁盘?隔离型较差?)。一些存储系统可以通过网络的把一个物理块设备暴露为另一台机器上的虚拟设备,从而实现块设备的共享,比如 NBD 或 Ceph。
其次是文件系统层。一部分 DBMS 选择使用文件来存储数据,所以通常来说需要在一个裸磁盘上格式化出一个文件系统,这样 DBMS 才可以使用路径来读写文件。当然,不同 DBMS 有不同的架构设计。一部分 DBMS 使用了 shared-nothing 架构,这样每个 DBMS(单机或集群节点)只需要访问本机的文件系统即可;一部分 DBMS 被设计为 shared-storage 架构,集群中所有的 DBMS 节点能够以相同的视角访问一个文件系统上的文件,即:一个节点写入后,另一个节点能够成功读取。既然 DBMS 基于共享存储架构设计,其内部的功能(事务引擎、执行层等)也是基于共享存储的假设来设计。为了满足使所有节点以相同视角读写文件的假设,需要由特殊的分布式文件系统来支持。
最后是 DB 层。抛开前两层,DB 层的部署应该就是一个软件的编译安装了。安装完毕后,将数据保存在文件(不管是本地文件系统还是分布式文件系统)中的 DBMS 需要配置好数据在文件系统上的目录并启动,就可以通过文件系统将数据最终存储到物理介质上;直接操作裸设备的 DBMS 配置好存放数据的块设备以后启动,也可以将数据存储到物理介质上。