储存&数据库
1 存储系统
1.1系统概要
-
什么是 存储系统
- 一个提供了 读写控制类接口 ,能够 安全把数据持久化 的软件,可以称为存储系统。
-
一般包括四个方面
- User:系统是给用户使用的
- Medium:数据持久化存储到介质上
- Memory:设计 性能高效 的操作数据结构
- Network:分布式存储系统
1.2 系统特点
- 性能敏感
- 代码既简单,有复杂
- 简单:I/O路径上要比较简单,不能复杂,否则会拖慢系统性能
- 复杂:在非I/O路径上,一些错误处理的分支上要很复杂吗,考虑多种异常情况。
- 软件架构容易受硬件影响
- 如果硬件发生了变革,则软件则也要重新编写
1.3 存储器的层级结构
- 从上到下:**速度 **越来越慢,**存储容量 **越来越大
1.4 数据如何从应用到数据介质
- 缓存:贯穿整个存储体系
- 原因:硬件的读写速率与软件读写速率不匹配
- 拷贝:很昂贵,很消耗CPU,尽量减少
- 抽象统一的接入层:硬件设备五花八门,需要统一起来。
1.5 RAID技术
Q:单机存储系统如何做到高性能/高性价比/高可靠?
A:Redundant Array Inexpensive Disk
-
出现背景
- 单块大容量磁盘 价格 > 多块小容量磁盘
- 单块磁盘 写入性能 < 多块磁盘写入 并发性能
- 单块磁盘的容错能力有限
-
RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 将用户数据切割,分别并发存储到不同磁盘中
- 没有额外容错
-
RAID 1
- 一块磁盘对应一块额外镜像盘
- 真实的空间利用率紧50%
- 容错能力强
-
RAID 0+1
- 结合RAID 0 和 RAID 1
- 比如6块磁盘,每两块进行RAND 1 组合形成一组,三组形成RAID 0 组合。
- 真实空间利用仅50%
- 容错空间强,写入带宽好
- 结合RAID 0 和 RAID 1
2 数据库
2.1 关系型数据库
毫无疑问,关系数据库是存储系统,但是在存储之外,又发展出其他能力
- 结构化数据友好
- 支持事物(ACID)
- 支持复杂的查询语言
2.2非关系型数据库
毫无疑问,非关系数据库是存储系统,但一般不要求严格的结构化
- 半结构化数据友好
- 可能支持事物(ACID)
- 可能支持复杂的查询语言
2.3数据库 🆚 经典存储系统
2.3.1 结构化数据管理
一条用户数据:
{
"user_name" : "xiaoming",
"password" : "helloword",
"password_hint" : "coding"
}
- 写入关系型数据库,以表格式管理
- 写入文件,自行定义结构,管理结构
2.3.2事务能力
- Atomicity(原子性) : 事务内的操作要么全做,要么不做
- Consistency(一致性) : 事务执行的前后,数据状态是一致的
- Isolation(隔离性) : 可以隔离多个并发的事务,避免影响
- Durability(持久性) : 事务一旦提交成功,数据保持持久性
2.3.3复杂查询能力
Q:写入数据后,想做很复杂的查询怎么办?
Example:请查询出名字以xiao开头,且密码提示小于10个字的人,并按性别分组统计
- 用SQL查询:简洁,灵活
Select gender,count(*)
From user
Where user_name like 'xiao%' and len(password_hint) < 10
Group by gender
经典程序查询:僵化,复杂
for each data{
if(user_name ...... && password_hint ......){
mark in list
}
}
for each in marked_list{
if(gender == ....){}
}
2.3 数据库的使用方法
Everything is Domain Specific Language (领域专用语言) ==> SQL
- 操作数据:
- Insert
- Update
- Select
- Delete
- Where子句
- GroupBy
- OrderBy
- 数据定义修改:
- Create user
- Create database
- Create table
- Alter tabel
- ......
主流产品剖析
1 单机存储
1.1 概要
单机存储系统 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
1.2 本地文件系统 —— Linux哲学 :一切皆文件
- 文件系统的管理单元:文件
- 文件系统接口:文件系统繁多,如Ext2/3/4.sysfs,rootfs等,但都遵守VFS的统一抽象接口
- 两大数据结构:Index Node & Directory Entry
- Index Node
- 记录文件元数据:id,大小,权限,磁盘位置
- inode是文件的 唯一标识 ,会被存储在磁盘上
- inode的文件总数在格式化文件系统时就被固定
- DIrectory Entry
- 记录文件名,inode指针,层级关系(parent)等
- dentry(目录项)是内存结构,与inode的关系是N:1(hardlink的实现)
- Index Node
1.3 Key-value存储——世间一切皆 key-value
- 常见使用方式:put(k,v) & get(k)
2 分布式存储系统
2.1 概要
分布式存储系统 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
2.2 分布式文件系统
时代背景:专用的高级硬件 很贵,同时数据存量 很大,要求超高 吞吐
- HDFS:堪称大数据时代的基石
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通的x86服务器,超 高性价比
2.3 分布式对象系统
- Ceph:开源分布式存储系统里的「万金油」
- 一套系统支持对象接口,块接口,文件接口,但 一切皆对象
- 数据写入采用 主备复制模型
- 写入数据会先写到主节点,然后主节点再作链状的多副本冗余复制
- 数据分布模型采用CRUSH算法
- 什么是数据分布模型:一份用户数据通常要有多个副本作冗余存储,那这几个副本要存储在哪几个服务器就需要数据分布模型决定
3 单机数据库
3.1 概要
单机数据库 = 单个计算机节点上的数据库系统
3.2 关系型数据库
-
商业产品Oracle称王,开源MySQL & PostgreSQL
-
关系型数据库的通用组件
-
Query Engine —— 负责解析query ,生成查询计划
-
Txn Manager —— 负责事务并发管理
-
Lock Manager —— 负责锁相关的策略
-
Storage Engine —— 负责组织内存/磁盘数据结构
-
Replication —— 负责主备同步
-
关键内存数据结构
- B Tree
- B+Tree
- LRU List等
-
关键磁盘数据结构
- WriteAheadLog (RedoLog) ,Page
3.3 非关系型数据库
-
MongoDB,Redis,Elasticsearch三足鼎立
-
关系型直接用SQL交互,非关系型交互方式 各不相同
-
非关系型数据结构千奇百怪
-
尝试支持SQL(子集)和“事务”
-
-
Elasticsearch特点
- 面向「文档」存储
- 文件可序列化为JSON,支持嵌套
- 存在「index」,index = 文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现大量搜索数据结构&算法
- 支持RESTFUL API ,也支持弱SQL交互
-
mongoDB
- 面向「文档」存储
- 文件可序列化为JSON,支持嵌套
- 存在「collection」,collection = 文档集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事物(多文档,跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
-
Redis
- 数据结构丰富(hash表,set,set,list)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cli/多语言SDK交互
4 分布式数据库
4.1 单机到分布式数据库
- 单机数据库遇到了问题&挑战,需要引入 分布式架构 解决
- 容量
- 弹性
- 性价比
4.2 分布式数据库——解决容量问题
- 传统单机数据库,Database通过Filesystem的接口对磁盘进行读写
- 单点容量有限,受下面挂在磁盘限制
- 分布式数据库,改进:使用存储池化技术
- 把Disks改造成一个存储池,可以动态扩容
- 通过网络连接与数据库交互,数据库不需要关注存储池的容量够不够
4.3 分布式数据库——弹性问题,性价比问题
- 传统单机数据库,硬件规格与服务器绑定,不能很好做到动态调整,容易造成CPU,磁盘的资源浪费或瓶颈。
- 分布式数据库,使用存储池化技术,服务器不用关注磁盘大小,只需关注CPU瓶颈,具有性价比。
4.4 分布式数据库——More to Do
- 多个人同时写入,提高系统整体吞吐
- 从磁盘弹性到内存弹性,让内存池化
- 分布式事务算法