存储和数据库 | 青训营笔记

90 阅读6分钟

存储和数据库

事务的四大特性

ACID:原子性,一致性,隔离性,持久性

Atomicity:事务内的操作要么全做,要么不做

Consistency:事务执行前后,数据的状态是一致的

Isolation:可以隔离多个并发事务,避免影响

Durability:事务一旦提交成功,数据保证持久性

单机存储

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

e.g. 本地文件系统、key/value存储

本地文件系统

Linux哲学:一切皆文件。所有种类的文件系统都遵循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(一定程度上牺牲读性能,追求写性能,append写入)

分布式存储系统

分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互

e.g. HDFS,Ceph

HDFS

大数据时代的基石!!!

核心特点:

  • 支持海量数据存储
  • 高容错性
  • 弱POSIX语义,POSIX:可移植操作系统接口
  • 使用普通x86服务器,性价比高

Management Node:管控面,通过此访问数据

Storage Node:存储数据

NameNode:名称主节点,保存整个文件系统的目录信息,文件信息,分块信息。

Secondary NameNode:如果主节点失效,则切换到此从节点

DataNode:数据节点,分布在廉价的计算机上,用于存储Block块文件

注: 在此HDFS的基础上,有了Hadoop体系,其核心思想:计算和数据更加接近,把计算推到DataNode上,避免数据通过网络四处移动。

Ceph

核心特点:

  • 一套系统支持对象接口、块接口、文件接口。但是一切皆对象
  • 数据写入采用主备复制模型
  • 数据分布模型采用CRUSH算法

单机数据库

单机数据库 = 单个计算机节点上的数据库系统

事务在单机内执行,也可能通过网络交互实现分布式事务

关系型数据库

通用组件:

Query Engine:解析query,生成查询计划

Txn Manager:事务并发管理

Lock Manager:锁相关的策略

Storage Engine:组织内存/磁盘数据结构,进行读写和淘汰等

Replication:负责主备同步

关键的内存数据结构:B-Tree,B+-Tree,LRU List等

关键的磁盘数据结构:WriteAheadLog(RedoLog)、Page

B树:按键所对应的值有序地存储记录集合。B-tree 是一种特殊的高度平衡树, n-ary, n > 2,所有叶子节点必须在统一层上。

实体(Entries[*])和搜索信息(如 key)可存储在 B-tree 的内部节点和叶子节点。

B+树:所有的实体 entries 都在叶子节点上,内部节点只包含有序的搜索信息(key values)和子节点指针。entries 是 (key , data) 对,按 key 值排序。

MySQL采用的存储方式就是B+树,其一个节点占有一页,这样只把搜索信息放进固定大小的一页(16K)中显然会有更多的子节点,减小了树的高度,更能有效搜素数据。

RedoLog

MySQL的数据以页为单位存储,涉及查询操作时,会先从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。后续的查询更新等都是先从Buffer Pool中找,没有命中再去硬盘加载,减少硬盘IO开销,提升性能。

在进行以上操作时,会把在数据页中所做的操作记录都记录到Redo Log buffer中,后续刷盘到redo log文件中。

注:redo logInnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

非关系型数据库

关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同

非关系型数据库的数据结构各有不同,没有关系约束后,schema相对灵活。(schema,模式,即数据库的组织和结构)

e.g. MongoDB、Redis、Elasticsearch

Elasticsearch

  • 面向文档存储
  • 文档可json序列化,支持嵌套
  • 无表,通过index管理,index=文档集合
  • 存储和构建索引能力依赖Lucene引擎
  • 实现了大量搜索数据结构和算法
  • 支持RESTFUL API和类SQL的交互

MongoDB

  • 面向文档存储,数据存储非常灵活,任意类型
  • 文档可以序列JSONBSON,支持嵌套
  • 无表,通过collection管理,collection=文档集合
  • 存储和构建索引能力依赖wireTiger引擎,纯C打造
  • 4.0后开始支持事务
  • client/SDK进行交互,目前可以通过插件转译支持弱SQL

Redis

  • 数据结构丰富(hash,set,zset,list,string)
  • 纯C打造,超高性能
  • 基于内存,支持AOF和RDB持久化
  • 常用redis-cli/多语言SDK交互,不支持SQL

注:Redis提供了持久化,即把数据保存到磁盘。

RDB,就是把内存数据以快照的形式保存到磁盘上。是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。dump.rdb

AOF(append only file) 持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。

分布式数据库

容量问题

单点数据库容量有限,受到硬件限制。

解决方案:存储节点池化,动态扩缩容量。

弹性问题

单机CPU资源紧张,扩容获取新的数据库,迁移耗费大。一旦遇到缩容操作,无法解决。

解决方案:池化节点

性价比问题

数据存储量巨大,但是CPU利用率不高

解决方案:池化节点,可以单一扩充容量或者CPU的方式

我觉得池化技术正是分布式数据库可以搭建起来的重要依托~

学习感想

本次学习中,我更多的学习了存储与数据库的分类,以及在不同的场景下,何种数据库能更优的解决存储问题。对于以往很多分散的数据库方向的知识有了统合。