1、分布式存储概念:
分布式存储系统是大量普通PC服务器通过Internet互联,对外作为一个整体提供存储服务;
2、分布式存储特性:
(1) 可扩展
(2) 低成本
(3) 高性能
(4) 易用
3、分布式存储系统挑战:
数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性;
4、分布式存储分类:
(1) 非结构化数据(办公文档、文本、图片等)
(2) 结构化数据
(3) 半结构化数据(HTML文档)
5、数据库保证持久化方式:
磁盘上记录数据库变化的日志
6、单机存储引擎
(1) 哈希存储引擎: 基于哈希结构的键值存储引擎,只支持追加操作,不修改老数据, 删除数据时只是对数据值进行标记而不删除,每个文件大小固定,到达指定大小时, 新建文件
1、数据结构
CRC -- 时间戳 -- 主键长度 -- value长度 -- 主键 -- value
2、定期合并:定期删除垃圾数据,合并文件
3、快速重建:读取索引文件(内存中哈希索引表转存储到磁盘后的结果文件,其 中存储的是哈希索引信息,与数据文件不同的是,索引文件只存储value的位置)提高服务器断电重启后建立索引速度
(2) B树存储索引: 基于B+树的存储引擎;
缓冲区管理:
1、LRU(最近最少使用)
大部分情况下LRU表现不错,但是做一次全表扫描,导致缓冲池大量页面被替换,从而污染缓冲池
2、LIRS:
将缓冲池分为两个级,数据首先进入第一级,如果数据在较短时间内被访问两次或以上,成为热点数据进入第二级,每一级内部还是使用LRU
(3) LSM树(Log Structured Merage Tree)存储:
1、思想:就是将数据的修改增量的保存在内存中,到达制定限制后将这些修改批 量写入磁盘,读取时需要合并磁盘中的历史数据和内存中最近修改的数据
7、数据模型
(1) 文件模型
(2) 关系模型
(3) 键值模型
8、事物与并发控制
(1) 事物性质(ACID)
① 原子性
② 一致性
③ 隔离性
④ 持久性
(2) 事物隔离级别
① Read UnCommited
② Read Commited
③ Repeatable Read
④ Serializable
(3) 事物类型
① 读事物
② 写事物
③ 读写混合事物
(4) 锁类型
① 读锁
② 写锁
注:允许对同一个元素加多个读锁,但是只能加一个写锁
(5) 解决多事物并发引发的死锁:
① 为每个事物设置超时时间
② 死锁检测,检测到死锁后,可以通过回滚某些事物来消除循环依赖
(6) 故障恢复:数据库以及其他分布式系统采用操作日志技术实现故障恢复
① 回滚日志
② 重做日志
1) 修改内存前先修改相关操作日志并刷到磁盘中
a. 优化
a) 成组提交:日志区数据超过一定数据量或者距离上次刷入磁盘超过一定时间提交一次
b) 检查点:将内存中的数据定期转储(Dump)到磁盘
③ UNDO/REDO日志
(7) 数据压缩
① 压缩算法
1) Gzip (混合使用了LZ77以及Huffman编码)
2) LZW (LZ77优化)
3) LZO (LZ77优化)
(8) 分布式存储系统三态
① 成功
② 失败
③ 超时
(9) 一致性(A、B、C为独立的客户端)
① 强一致性:A写入值到存储系统,存储系统保证后续A、B、C都可以读取最新值
② 弱一致性:A写入值到存储系统,存储系统不保证后续A、B、C都可以读取最新值
③ 最终一致性:A写入值到存储系统,存储系统保证后续A、B、C最终可以读取到最新值,不过最终一致性有一个“不一致性窗口”,它指A写入值到A、B、C读取到最新值的这段时间(不一致性窗口原因:交互延迟、系统的负载、复制协议要求同步的副本数)
④ 读写一致性:A写入值到存储系统,存储系统保证后续A都可以读取最新值,B、C可能要过一会才能看到
⑤ 会话一致性:要求客户端和存储系统在交互的整个会话期间保证读写一致性
⑥ 单调读一致性:客户端A读取对象的某个值,那么后续操作将不会读取到更早的值
⑦ 单调写一致性:对于同一个客户端的操作,存储系统的多个副本按照客户端相同的顺序完成
⑧ 副本一致性:存储系统的多个副本的数据是否一致,不一致时间窗口等
⑨ 更新顺序一致性:存储系统多个副本是否按照相同的顺序执行更新操作;
(10) 分布式存储系统衡量指标
① 性能:系统吞吐量、系统响应时间
② 可用性:系统面对各种异常可以提供正常服务的能力
③ 一致性:越是强的一致性模型,用户用起来越简单
④ 可扩展性
(11) 数据分布
① 哈希分布
1) 一致性哈希
2) 虚拟节点(见博客)
② 顺序分布:一般做法是将大表顺序划分为连续的范围,每个范围称为一个子表,总控服务器负责将这些子表按一定策略分配到存储节点
③ 负载均衡:分布式存储系统中每个集群一般有一个总控节点,其他节点为工作节点,由总控节点根据负责全局负载信息进行整体调度。工作节点刚上线时,总控节点需要将数据迁移到改节点。另外,系统运行过程中需要不断地执行迁移任务,将数据从负载较高的工作节点迁移到负载较低的工作节点(工作节点通过心跳包定时将节点负载相关信息发送到总控节点)
(12) 故障检测
① 心跳包
② 租约机制:如果机器A需要检测机器B是否发生故障,机器A可以向机器B发放租约,只有在租约有效期内,机器B才允许提供服务,机器B在租约快要过期的时候,可以向A重新申请租约;