存储与数据库 | 豆包MarsCode AI刷题

97 阅读6分钟

01、存储系统

Q:什么是存储系统?

A:一个可以提供读写、控制类接口,能够安全有效的把数据持久化的软件。

存储系统参与方:

  • 用户
  • 存储介质
  • 内存:可能会读到内存做一些修改。
  • 网络:分布式存储系统,需要网络传输数据。

存储系统的特点

  • 作为后端软件的底座,性能敏感
  • 容易受硬件影响
  • 存储系统的代码,既“简单”,又“复杂”。 简单值得是操作存储系统的代码要简单,复杂指的是错误条件要考虑到,多做逻辑判断。

存储器层级结构

img

图片来源

数据怎么从应用到介质

image-20241117132850855.png

在这个过程中,缓存很重要,因为有些硬件仅支持一个字节一个字节的存储,这时候使用缓存可以节省磁盘IO。

拷贝也应该尽量减少,每次拷贝都会占用CPU时间,如果CPU都用来拷贝,那么这个系统的效率很低。

1.1、RAID 技术

RAID: Redundant Array of Inexpensive Disk

  • 单块大容量磁盘的价格 ==>==多个小的磁盘价格
  • 单块磁盘的写入性能 ==<==多块磁盘的写入性能
  • 单块磁盘的容错能力有限,不够安全。

==RAID 0==:

  • 多块磁盘简单组合
  • 数据条带化存储,提高磁盘带宽
  • 没有额外的容错设计
  • 缺点:没有容错

==RAID 1==:主打容错,写入磁盘后会额外复制到另一个磁盘中

  • 一块磁盘对应一块额外镜像盘
  • 真实利用率 50%
  • 容错能力强

==RAID 0 + 1==:

  • 结合 RAID 0 和 RAID 1
  • 真实空间利用率50%
  • 容错,提高磁盘带宽

1.2、数据库

数据库分为:关系型数据库、非关系型数据库。

关系模型:关系就是任意元素组成的若干有序偶对,反映了事物间的关系。

关系型数据库就是存储系统,但是在存储之外,又发展出其他能力:

  • 结构化数据友好
  • 支持事务
  • 支持复杂查询语言

非关系型数据库也是存储系统,但是一般不要求严格的结构化:

  • 半结构化数据友好
  • 可能支持事务
  • 可能支持复杂查询语言

数据库 VS 经典存储- 结构化数据管理

image-20241117133331569.png

数据库优。

数据库 VS 经典存储- 事务能力

  • Atomicity, 事务内的操作要么全做,要么不做。
  • Consistency:事务执行前后,数据状态是一致的。假设A账户里面有1000元,B账户里面没有,A向B转账500, 转账后正确的应该是各有500元,这时候数据状态是一样的,反之不一样。
  • Isolation:可以隔离多个并发事务。
  • Durability:事务一旦提交,数据保证持久性。这个意思是,事务一旦提交成功,就是成功了,不会在若干秒后再说自己失败了。

数据库优。

数据库 VS 经典存储- 复杂查询能力

例如:请查询出名字以xiao开头,且密码提示问题小于10个字的人,并按性别分组统计人数

image-20241117133422358.png

数据库更好。

02、主流产品剖析

2.1、单机存储

单机存储:单个计算机节点上的存储软件系统,一般不涉及网络交互:

  • 本地文件系统
  • key-value存储

本机文件系统

文件系统的管理单元:文件

文件系统接口:如Ext2/3/4等,都遵循VFS的统一抽象接口。

Linux文件系统的两大数据结构:Index Node & Directory Entry

Index Node: 记录文件元数据,如id,大小,权限,磁盘位置等,inode是一个文件的唯一标识,会被存储到磁盘上,inode的总数在格式化文件系统的时候就固定了。

Directory Entry:记录文件名,inode指针,层级关系。dentry内存结构,与inode的关系是N:1的(硬链接的实现)。

key-value存储

常见使用方式:put(k,v) & get(k)

常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能。

拳头产品:RocksDB

2.2、分布式存储

定义:在单机存储的基础上实现了==分布式协议==,设计大量的网络交互。

产品:

HDFS:堪称大数据时代的==基石==,多个便宜的硬件组合使用。

  • 支持海量存储数据
  • 高容错性
  • POSIX语义
  • 使用普通的X86服务器,性价比高

先在NameNode中找到数据节点的实际物理地址,然后再去寻找。

Ceph:开源分布式存储系统里的万金油。

特点:

  • 一套系统支持对象接口、块接口、文件接口,但是一切都是对象。
  • 数据写入采用主备复制。
  • 数据分布模型采用CRUSH算法。(数据分布:备份数据应该放在哪些服务器上)

2.3、单机关系型数据库

定义:单个计算机节点上的数据库系统,换句话说,事务在单机内执行,也可能通过网络交互实现分布式事务。

商业产品Oracle是主流,开源产品MysqlPostgreSQL比较好

关系型数据库通用组件:

组件用处
Query Engine负责解析Query,生成查询计划。
Txn Manager负责事务并发管理。
Lock Manager负责锁相关的策略
Storage Engine负责组织内存/磁盘数据结构
Replication负责主备同步

数据结构:

位置数据结构
内存B-树,B+树,LRU List
磁盘Page,WriteAheadLog (RedoLog 操作日志)

Redo Log: 我们修改数据库中一条数据时,会现在内存中找到对应节点,然后修改,这时候,要记录本次操作做了什么,记录的文件就是RedoLog

Temp Data:当内存不够用给的时候,用户操作产生的临时数据会存到Temp Data中,放到磁盘,当内存够用了,再从磁盘都进来重组。

image-20241117140944402.png

2.4、单机非关系型数据库

三大主流产品:MongoDB:文档存储、Redis:key-v、Elasticsearch:文档

  • ElasticSearch
    • 面向【文档】存储
    • 文档支持序列化成JSON,支持嵌套
    • 存在【index】,index=文档的集合
    • 存储和构建索引能力依赖Lucene引擎。
    • 实现了大量搜索数据结构 & 算法
    • 支持RESTFULL API,也支持弱SQL
  • mongoDB
    • 面向【文档】存储
    • 支持序列化成JSONBSON,支持嵌套
    • 存在【collection】, collection=文档的集合
    • 存储和构建索引能力依赖于wiredTiger引擎
    • 4.0后开始支持事务(多文档、跨分片多文档)
    • 常用Client/SDK交互,也可以通过插件转译支持弱SQL
    • C语言编写
  • Redis
    • 数据结构丰富
    • C语言实现,超高性能
    • 主要基于内存,但是支持AOF/RDB持久化
    • 常用Redis-cli/多语言SDK交互。

2.5、分布式数据库

.....待补充