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

73 阅读4分钟

存储与数据库

我们考虑一个问题:一条数据从产生,到流动,到最后持久化全生命周期都干了什么?

数据的流动

假设小明在手机上操作,产生了一条用户数据 be like

{
  "user_name" : "小明",
  "password" : "helloworld",
  "password_hint" : "coding"
}

发送到后端服务器,再发送到数据库持久化下来,在数据库之后其实还有一些其他系统,我们不讨论。

那么我们已经在数据了,怎么持久化呢?

  • 校验数据的合法性
  • 修改内存 (用高效的数据结构z
  • 写入存储介质 (以寿命 & 性能友好的方式写入硬件)

数据库的一些问题

数据库怎么保证数据不丢

数据库怎么处理多人同时修改问题?

为什么用数据库,除了数据库还能存到别的存储系统吗?

数据库只能处理结构化数据吗?

有哪些操作数据库的方式,要用什么编程语言

存储系统

提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。

Persistent Memory 就是一种提供一种兼顾持久化介质与内存介质特点的。

  • 一个极端的例子:机械硬盘的扇区对齐问题

机械硬盘(HDD)的设计中,数据必须以扇区(通常是 512 字节或 4096 字节)为单位写入。如果用户层发起了一个 10 字节的数据写入操作,而没有缓冲机制,操作系统将不得不执行以下步骤:

  1. 读取整个扇区(假设是 512 字节)。
  2. 将用户提供的 10 字节插入到正确位置。
  3. 将整个扇区重新写回硬盘。

这种操作对硬盘的性能是灾难性的,因为每次小块数据的写入会触发完整扇区的读写操作。此外,频繁的 I/O 请求会导致硬盘磁头频繁移动(机械运动),进一步拖慢速度。

  • 缓冲机制如何优化:
  1. stdio buffer(用户层缓冲区) :收集多个小型写入请求,将其暂存并批量发送给内核。
  2. buffer cache(内核缓冲区) :进一步缓冲批量的写入请求,以最小化硬件 I/O 操作的次数。
  3. 延迟写(Lazy Write) :数据不会立即写入硬盘,而是等待缓冲区填满或超时后再进行写操作
  • 我们发现 「拷贝」很昂贵,硬件尽量减少
  • 硬件设备五花八门,需要有抽象统一的接入层

RAID技术

Q :单机存储怎么做到不可能三角(高性能 / 高性价比 / 高可靠性)?

A:R(edundant)A(rray)I(nexpensive)D(isks) 独立磁盘冗余阵列

考虑现在有这些问题:

大容量磁盘价格较高:比起买一块超大容量磁盘,用多块小磁盘组合更划算。

单块磁盘性能有限:多块磁盘可以并行读写,性能远高于单盘。

单盘可靠性不足:磁盘易出故障,多盘冗余设计可以提升数据安全性。

  • RAID 0(条带化存储,提升性能):

    • 机制:将数据分成多个小块并分别写入多块磁盘(数据条带化)。

    • 优点

      • 数据读写并行,极大提升性能(带宽提高)。
      • 容量最大化利用,没有任何空间浪费。
    • 缺点

      • 没有冗余设计,一块磁盘坏掉,所有数据丢失。
    • 适用场景:对性能要求高,但对数据安全性要求低的场景(如临时数据存储)

  • RAID 1(镜像存储,提升可靠性):

    • 机制:将每一块磁盘的数据完全复制到另一块磁盘(镜像)。

    • 优点

      • 数据安全性高,一块磁盘损坏仍有备份。
      • 读性能提升(数据可以从任一磁盘读取)。
    • 缺点

      • 实际可用空间仅为总容量的 50%(浪费空间)。
      • 写性能较差(每次写入操作需要同时写两块磁盘)。
    • 适用场景:需要高可靠性的数据存储(如数据库系统)

  • RAID 0+1

    • 高性能:条带化存储实现数据读写并行,带宽较高。
    • 高可靠性:镜像存储提供冗余,允许部分磁盘损坏而不丢失数据。
    • 适用场景:对性能和数据安全性都有较高要求的场景,比如数据库、高性能服务器等。

关系型数据库特点

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

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

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

  • 半结构化数据友好
  • 可能支持事务
  • 可能支持复杂查询语言
ACID ?
  • A(tomicity) 事务内的操作要么全做,要么不做
  • C(onsistency)事务执行前后,数据状态是一致的
  • I(solation)可以隔离多个并发事务,避免影响,当然取决于隔离级别
  • D(urablility)事务一旦提交成功,数据保证持久化
复杂查询

like group by ...