这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
一、经典案例
首先,一条数据由客户端产生,然后经过网络将其发送给后端服务器,经过整理最后将其保存到数据库进行持久化。如图所示:
其中需要考虑的问题:
- 需要保证数据库的数据不丢失
- 数据库被多人同时修改数据需要保持一致性
- 怎样适配另外的存储系统
- 怎样存储非结构化的数据
- 需要怎样去操作数据库
二、存储与数据库简介
1.存储系统
1.存储系统的概念
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。
-
存储系统
- 作为后端底座,需要性能敏感
- 存储系统软件架构,容易受硬件影响
- 存储系统代码,既“简单”又“复杂"
2.存储器层级结构
层级金字塔顶端的存储系统有更小的容量,速度更快,价格更高。层级越往下,存储系统容量更大,速度更慢,价格更低。
3.数据从应用到存储介质
4.RAID 技术
是让单机存储系统做到高性能、高性价比、高可靠性的一类技术,展开就是:
R(edundant) A(rray) of l(nexpenswe) D(isks)
2.数据库
关系型数据库和非关系型数据库都是存储系统,但关系型数据库一般有严格的结构化,非关系型数据库便没有这个限制
相对于经典存储,数据库能够进行结构化的数据管理,具有处理事务的能力,并且具有复杂的查询能力。
数据库的使用方式一般是通过 DSL(领域特定语言)去操作,比如 SQL 就是比较通用的 DSL。
三、主流产品
1.单机存储
单机存储就是单个计算机节点上的存储软件系统,一般不涉及网络交互。
1.本地文件系统
形如 Linux 文件系统。
文件系统的管理单元是文件,文件系统的接口繁多,如 Ext2/3/4,sysfs,rootfs 等,都遵循 VFS 的统一抽象接口,Linux 文件系统有两大数据结构:Index Node 和 Directory Entry。Index Node 用来记录文件元数据,如 id、大小、权限、磁盘位置等,inode 是一个文件的唯一标识,会被存储到磁盘上 inode 的总数在格式化文件系统时就固定了。Directory Entry 用来记录文件名、inode 指针,层级关系 (parent) 等,dentry 是内存结构,与 inode 的关系是 N:1( hardlink 的实现 )。
2.key-value 存储
常见使用方式为:put(k, v), get(k)。
拳头产品:RocksDB。
2.分布式存储
分布式存储就是在单机存储基础上实现了分布式协议,涉及大量网络交互。
代表产品有:HDFS、Ceph。
3.单机关系型数据库
商业产品 Oracle 称王,开源产品 MySQL & PostgreSQL 称霸。
-
关系型数据库的通用组件:
- Query Engine:负责解析 query,生成查词计划
- Txn Manager:负责事务并发管理
- Lock Manager:负责锁相关的策略
- Storage Engine:负责组织内存和磁盘数据结构
- Replication:负责主备同步
-
关键内存数据结构:B-Trees、B+ -Tree、LRU List 等
-
关键磁盘数据结构 : WriteAheadLog (RedoLog)、Page
4.单机非关系型数据库
MongoDB、Redis 、EIasticsearch 三足鼎立。
关系型数据库一般直接使用 SQL 交互,而非关系型数据库交互方式各不相同,非关系型数据库的数据结构千奇百怪,没有关系约束后,schema 相对灵活不管是否关系型数据库,大家都在尝试支持 SQL( 子集 )和“事务"。
1.EIasticsearch
- 面向文档存储
- 文档可序列化成 JSON,支持嵌套
- 存在 index,index 相当于文档的集合
- 存储和构建索引能力依赖 Lucene 引擎
- 实现了大量搜索数据结构 & 算法
- 支持 RESTFUL API,也支持弱 SQL 交互
2.MongoDB
- 面向文档存储
- 文档可序列化成 JSON 或者 BSON,支持嵌套
- 存在 collection,collection 是文档的集合
- 存储和构建索引能力依赖 wiredTiger 引擎
- 4.0 后开始支持事务( 多文档 、 跨分片多文档等)
- 常用 cIient / SDK 交互,可通过插件转译支持弱 SQL
3.Redis
- 数据结构丰富(hash 表、set、zset、list)
- c 语言实现,超高性能
- 主要基于内存,但支持 AOF / RDB 持久化
- 常用 redis-cli 多语言 SDK 交互
5.分布式数据库
相对于上面的数据库,分布式数据库需要以下问题:
1.解决容量问题
单点的容量有限,受硬件限制,可以将存储节点池化,进行动态的扩缩容。
2.解决弹性问题
动态的扩缩容。
3.解决性价比问题
有些单点的存储和处理能力不平衡,资源利用率低。
四、新技术
1.软件架构变更:Bypass OS kernel 绕过操作系统内核
- SPDK
2.Al 增强:智能存储格式转换
3.新硬件:存储介质、计算单元、网络硬件的变更
- 高性能硬件
主要介绍了存储系统的知识,从数据怎样去存储到单机的结构化数据,再到分布式的非结构化数据,层层深入和演化,最后对能够提高存储系统性能的新技术的进行了展望。从宏观层面拓宽了我对所用数据库的理解。