存储与数据库——主流产品剖析|青训营

2023年 8月 28日 40.1k 0

3.1 单机存储

单机存储是指在单个计算机节点上运行的存储软件系统,它通常不涉及网络交互。其中单机存储的本地文件系统是Linux操作系统的经典哲学之一,即一切皆文件。文件系统的管理单元是文件,而文件系统接口有多种,例如Ext2/3/4、sysfs、rootfs等,但它们都遵循VFS(Virtual File System)的统一抽象接口。Linux文件系统的两大重要数据结构是Index Node(索引节点)和Directory Entry(目录项)。Index Node记录了文件的元数据,如文件ID、大小、权限、磁盘位置等,而Directory Entry则记录了文件名、对应的Index Node指针以及层级关系。

在单机存储中,所有的数据都可以被视为键值对,其中键是唯一标识符,值则是具体的数据内容。常见的操作方式包括put(key, value)和get(key),而常见的数据结构则有LSM-Tree(Log-Structured Merge Tree)。LSM-Tree在一定程度上牺牲了读取性能,以追求写入性能。它通过内存有序写入,将数据存储到Immutable Memtable中,然后再写入到SSTable(Sorted String Table)中。在单机存储领域,RocksDB是一个备受推崇的产品。

3.2 分布式存储

分布式存储在单机存储的基础上实现了分布式协议,并涉及大量的网络交互。其中两个主要的分布式存储系统是HDFS(Hadoop Distributed File System)和Ceph。

HDFS被视为大数据时代的基石,它支持海量数据的存储,并具有高容错性和弱POSIX语义。HDFS使用普通的x86服务器,具有较高的性价比。

Ceph是一种开源的分布式存储系统,也被称为"万金油"。Ceph可以支持对象接口、块接口和文件接口,因为它将一切数据都视为对象进行处理。Ceph采用主备复制模型进行数据写入,并使用CRUSH算法进行数据分布。CRUSH算法结合了哈希、权重和随机抽签等技术,使数据在集群中进行均衡分布。

3.3 单机关系型数据库

单机关系型数据库是指在单个计算机节点上运行的数据库系统,事务处理通常在单机内执行,但也可以通过网络交互实现分布式事务。商业产品中,Oracle是最为知名的关系型数据库,而在开源领域,MySQL和PostgreSQL则占据着主导地位。

关系型数据库的通用组件包括Query Engine(查询引擎)、Txn Manager(事务管理器)、Lock Manager(锁管理器)、Storage Engine(存储引擎)和Replication(主备同步)。关键的内存数据结构有B-Tree、B+-Tree和LRU List,而关键的磁盘数据结构则包括Write-Ahead Log(重做日志)和Page(页面)。

3.4 单机非关系型数据库

单机非关系型数据库包括MongoDB、Redis和Elasticsearch等三个主要产品。

在非关系型数据库中,每种数据库的交互方式都不相同,而且数据结构也千差万别。非关系型数据库相对于关系型数据库来说,具有更灵活的数据模型,因为它们不受关系约束。无论是关系型还是非关系型数据库,大多数都在尝试支持部分SQL语法和事务处理。

Elasticsearch是一种面向文档的存储系统,文档可以序列化成JSON格式,并且支持复杂的嵌套结构。在Elasticsearch中,存在多个索引,每个索引包含多个文档的集合。Elasticsearch依赖于Lucene引擎来实现存储和构建索引的能力,并且它实现了许多用于检索和搜索的数据结构和算法。Elasticsearch支持RESTful API和SQL交互。

MongoDB也是一种面向文档的存储系统,文档可以序列化成JSON或BSON格式。它将文档存储在集合中,而集合则是文档的集合。MongoDB的存储和构建索引能力依赖于WiredTiger引擎。从4.0版本开始,MongoDB开始支持多文档事务和跨分片多文档事务等功能。MongoDB可以通过客户端或各种语言的驱动程序进行交互,并且可以通过插件来支持SQL查询。

Redis是一种具有丰富数据结构(如哈希表、集合、列表等)的内存数据库。它是用C语言实现的,具有极高的性能。尽管Redis主要用于内存存储,但它也支持AOF(Append-Only File)和RDB(Redis Database)持久化机制。Redis常用于缓存等场景,并且有丰富的Redis客户端库和多语言交互接口。

3.5 分布式数据库

分布式数据库是为了解决单机数据库在容量、弹性和性价比等方面的问题而引入的分布式架构。分布式数据库可以分散数据存储和处理的负载,提高存储容量、弹性和性能。

分布式数据库需要解决的问题包括容量问题、弹性问题和性价比问题。通过节点池化和动态扩缩容等方式,可以解决单点容量有限的问题。而通过池化技术,可以实现弹性的扩容和缩容。此外,分布式数据库还需要优化多写功能、从磁盘弹性到内存弹性以及分布式事务算法等方面。

相关文章

猎豹浏览器怎么更改下载路径
Apache的URL缩短功能如何实现
Apache的点击劫持保护如何设置
Apache的HSTS功能是什么如何启用
Apache的X-Frame-Options如何配置以防止点击劫持
Apache的Content Security Policy如何设置

发布评论