分布式储存系统的特性:
1.可扩展性:可按集群规模增长,系统性能线性增长;
2.低成本:系统自动容错,自动负载均衡,运维方便
3.高性能:
4.易用性:对外提供接口
数据类型:
非结构化数据:文档,文本图片等
结构化数据:存关系数据库,结构化数据的模式(Schema,包括属性、数据类型以及数据之间联系),内容模式要定义
半结构数据:如HTML,模式结构与内容混合,无需事先定义结构
分布式存储系统
分布式文件系统:常存Blob(Binary Large Object 二进制大对象)对象,非结构化数据,定长块,大文件
分布式键值系统:存储关系简单的半结构化数据,只提供CRUD功能
分布式表格系统:用于储存较为复杂的半结构数据,支持CRUD,支持扫描某个主键范围,一表格为单位组织数据,每个表格包含多行,通过主键标识一行,支持CRUD 及范围查找。
分布式数据库:用于存储结构化数据,采用二维表格组织数据 。
常见硬件参数:
存储介质对比:
储存系统性能主要包括两个维度:吞吐量以及访问延迟,磁盘与SSD访问延迟相差大,带宽相差不大(对于SATA接口的ssd来说),磁盘适合大块顺序访问的存储系统,访问不频繁的冷数据,SSD适合随机访问较多或者对延时比较敏感的关键系统,访问频繁的热数据。
单机存储引擎:
哈希存储引擎,利用哈希表的持久化实现,支持CRUD 不支持顺序扫描,存储系统键值存储系统;B树存储引擎利用B树持久化实现,支持CRUD和顺序扫描对应存储系统是关系数据库,LSM(Log-Structured Merge Tree),支持CRUD 顺序查找,通过批量转储技术规避磁盘随机写入
哈希存储引擎:
Bitcask 为例,仅支持追加,不修改老数据,系统中文件大小有限制,到一定大小会参数新文件,老文件只读,在任意时刻只有一个文件可写,该文件为活跃数据文件,老文件为老数据文件(older data file)
1.数据结构:
每条记录包含主键,value内容,主键长度,value长度,时间戳,crc校验。数据删除操作将value设为一个特殊值做标识
内存中是基于哈希表的索引结构,通过主键定位到value位置,哈希表结构中每一项包含三个用于定位数据的信息,分别为文件编号(file id),value在文件中的位置(value_pos),value长度(value_sz) 通过读取file_id对应文件value_pos开始的value_sz个字节 得到value,写入是1先在Key_value记录追加到活跃数据文件尾部,再更新内存哈希表,每次写要进行一次顺序磁盘写入和内存操作。
如果value平均长度为1k,每条记录在内存中索引信息为32字节,磁盘内存比为32:1
定期合并:
定期执行合并操作,将所有老数据文件中数据扫描,对同一个key的多个操作只保留最新一个
3,快速恢复
指断电后内存hash表数据消失,要扫描数据重建hash表,bitcask通过索引文件(hint file)提高重建哈希表速度。
索引文件将内存中的哈希索引表转存到磁盘生成结果文件,主要在合并操作的时候生成索引文件
B树存储引擎
以Mysql InnoDB中,有一个称为聚集索引的特殊索引,行数据存于其中组成B+树
1.
MySQL InnoDB按照页面页面(Page)来组织,每个页面对应B+树的一个节点,叶子节点保存每行完整数据,非叶子节点保持索引信息。数据中每个节点有序存储,数据库查询从根节点开始二分查找到叶子节点,每次读取一个节点,对应页面不在内存,要从磁盘中读取并缓存起来 ,B+树根节点常驻内存,B+树一次最多要h-1次读取磁盘,复杂度
O
(
h
)
=
O
(
l
o
g
d
N
)
O(h)=O(logd^{N})
O(h)=O(logdN)(N元素个数, d每个节点度,h为B+树高度)修改时 先提交日志,再修改内存B+树,内存中修改超一定比例,会将页面再磁盘中修改
2.缓冲区管理
缓冲区管理中替换策略:
LRU
维护一个链表,维护最近访问的数据的顺序,并淘汰链表最后的数据。
LIRS
LRU算法,对于查询要进行全表扫描,导致LRU链表被污染情况,将缓冲区分为两部分,第一部分被访问数据,被访问两次以上数据,进入第二部分,第二部分淘汰用LRU
LSM树存储引擎
LSM树(Log Structured Merge Tree) 对数据的修改增量保持在内存中,达到指定大小限制后将修改批量写入硬盘。读取时合并磁盘中历史数据和内存中修改操作。优势,规避磁盘随机写入,读取可能要访问较多磁盘文件;
存储结构:
LevelDB存储引擎:内存中MemTable和不可变的MemTable(Immutable Memtable,冻结MemTable)磁盘上文件:当前文件Crurrent ,清单文件(Manifest),操作日志(Commit Log)文件,SSTable文件,操作先写入日志,在修正操作到MemTable。Memtable到达内存上限后,将内存数据转储到外存文件中,将MemTable转储不可变,后台将不可变MemTable数据排序转储到磁盘,形成SSTable, Compaction操作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)