这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
系统特点: 性能敏感,易受硬件影响
设计思路: 要把缓存贯穿整个存储系统;尽量减少拷贝操作;对不同的底层存储要有抽象统一的接入层;
RAID 技术背景:
- 单块大容量磁盘价格大于多块小容量磁盘
- 单块磁盘写入性能小于多块磁盘并发写入性能
- 单块磁盘容错能力有限
RAID 0:多块磁盘简单组合,条带化存储提高磁盘带宽,没有额外容错设计
RAID 1:每块磁盘对应一个额外磁盘,容错较强,但是只能利用一半间
RAID 0+1:两者结合
数据库相对传统存储的主要优势:事务能力(ACID)、复杂查询能力
-
单机存储-本地文件系统
以 Linux 为例,底层的文件系统有 Ext2/3/4、sysfs等,但都遵循 VFS 统一抽象接口
Linux 文件系统两大数据结构:
Index Node(INode):记录为文件元数据,如id、大小、权限、磁盘位置,是文件的唯一标识 Directory Entry:记录文件名、inode指针、层级关系,Directory Entry和inode是多对一关系
-
单机存储-KV存储
常见数据结构 LSM-Tree,牺牲读性能,追求写入性能,产品有 RocksDB
-
分布式存储系统
HDFS:支持海量数据存储、高容错、弱 POSIX 语义、性价比高 Csph:采用对象思想、写入采用主备复制模型、分布模型采用 CRUSH 算法
-
单机关系型数据库
MySQL、PostgreSQL
-
单机非关系型数据库
Redis
Elasticsearch:
- 面向「文档」存储
- 文档可序列化成JSON,支持嵌套
- 存在「index], index=文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构&算法
- 支持RESTFUL API,也支持弱SQL交互
MongoDB:
- 面向「文档」存储
- 文档可序列化成JSON/BSON,支持嵌套
- 存在「collection] , collection=文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事务((多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
-
分布式数据库
目的是解决容量问题、弹性问题(扩容/缩容)、性价比问题
发展趋势:Bypass OS kernel ,避免 syscall 带来的性能损耗