存储技术
存储系统的特点
性能敏感
- 存储系统作为后端软件的底座和最后一道门槛,掌握着上下层交互的关键。在现代大型后端架构中,许多服务都离不开持久化数据的保存和交互。大量的用户带来的是庞大的数据访问量,存储系统必须拥有强大的性能,才能处理如此之大的数据并发。
简繁并具
- 一方面,存储系统对性能的要求及其苛刻,这就意味着在我们
IO
的过程中,任何过于复杂的操作都可能会对存取的性能造成巨大的影响,处理业务的代码必须简洁高效,此为"简" - 另一方面,在
IO
或非IO
的业务处理过程中,可能会出现各种各样的错误或异常情况,既然存储系统是一个软硬件集合,那么在设计存储系统时就应该考虑到软件和硬件都有可能出现问题。墓碑上的墓志铭尚且会因风吹日晒而导致磨损或腐蚀,更别提现代的高精度硬件。存储系统的设计必须能覆盖可能考虑到的所有异常情况,无论是多复杂的异常,此为"繁"
硬大于软
- 存储系统的软件架构容易受到硬件影响。无论如何,硬件是一切的基石。无论用户层的软件大厦多么辉煌靓丽,没有了硬件作为最基础的地基,一切都是空中楼阁,无稽之谈。当存储结构的硬件发生改变的时候,软件也必须进行相应的改变才能适配,当硬件改变过大时,甚至需要对整个软件架构进行重构,从零开始。
存储层级结构
单机存储栈
单机存储引擎就是Hash表、B树等数据结构在机械磁盘、SSD等持久化介质上的实现。
RAID技术
概述
RAID(redundant array of independent disks)技术,独立磁盘冗余阵列,是提高磁盘可靠性和可用性的一种技术。RAID技术出现的初衷是把多个小容量的硬盘组合起来,以获得更大的存储容量。当前我们所说的RAID技术更多则是与数据保护相关,换言之,当物理设备失效时,RAID能够用来防止数据的丢失。
优势
- 把多个硬盘组合成一个逻辑盘组,以提供更大容量的存储。
- 将数据分割成数据块,对多个硬盘并行进行写入/读出,提高硬盘访问速度。
- 通过提供镜像或奇偶校验来提供容错。
- 高性能,高性价比,高可靠性
数据库
关系型数据库 就是存储系统,但是在存储之外,又有其他能力
- 结构化数据友好
- 支持事务
- 支持复杂查询语言(SQL)
关系代数 对关系 SQL,一种DSL,方便人类阅读的关系代数表达形式
非关系型数据库 一般不要求严格的结构化 半结构化数据友好 可能支持复杂查询语言
数据库和经典存储的区别
-
数据库以表形式管理
-
事务能力
-
数据库支持事务的优越性
- A完整
- C一致
- I隔离
- D持久
- 复杂查询功能
- 数据库更为灵活简洁
主流产品剖析
单机存储
单个计算机节点上的存储软件系统 典型案例
本地存储系统
key-value存储
put(K,v)&get(k)
某种程度上牺牲读性能,追求写入性能
分布式存储
在单机存储基础上实现分布式协议,涉及大量网络协议
HDFS (文件系统)
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通X86服务器,性价比高
Ceph【万金油】
- 一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用crush算法(哈希,权重,随机抽签)
单机关系型数据库
关系型数据库:将数据存储在表中的数据库,以二维表为数据结构。表和字段类型之间的关系需要明确定义,以SQL语句为操作指令,也称为SQL数据库.
常见的关系型数据库:
SQLServer:微软公司开发的关系型数据库管理系统。
- 优点:不开源,它们针对不同的用户提供了具有不同特性的多个版本。拥有丰富的用户界面,可以处理大量数据。
缺点:传统数据库操作频繁容易中断,数据量大负载也大。
MySQL:1995年发布。
-
优点:开源,拥有很多文档和在线支持。
-
缺点:规模不大,数据量过操作过于频繁时容易中断。
PostgreSQL:1996年发布。
-
优点:开源,基于对象-关系模型的数据库,它不只是关系型数据库,用户可以自己拓展功能。
-
缺点:拓展功能的操作比较复杂,新手不易上手,不如直接使用非关系型数据库。内含文档不如MySQL多。
单机分非关系型数据库
非关系型数据库:不像关系数据库那样使用行和列的表格模式的数据库。相反,它的存储模型是针对它所存储的数据类型进行优化的。不只有使用SQL语句作为操作指令,可以使用其他类型的查询语言,也被称为NoSQL(Not only SQL)数据库, 不需要预先定义关键数据的模式,比SQL数据库更加灵活。
NoSQL数据库的常见类型:
面向文档的数据库(Document-oriented databases ):用于存储、管理、检索文档的信息。可以在海量的数据库中快速查询数据。例如MongoDB、CouchDB
键值存储数据库(Key-Value Stores): 这是一个使用不同键的数据库,其中每个键只与集合中的一个值相关联。把它当作一本字典。NoSQL最简单的数据库类型之一,例如Redis、Tokyo Cabint。
分布式数据库(Wide-Column Stores) : 使用表、行和列,但与关系数据库不同,列的名称和格式在同一表中的行与行之间可能不同,弥补了SQL数据库拓展性的缺陷。 图储存数据库(Graph Stores): 使用图结构进行具有节点、边和属性的语义查询,以表示和存储数据。
常见的非关系型数据库:
MongoDB:是一个文档存储数据库,也是目前使用中最流行的NoSQL数据库引擎。
-
优点:它使用类似json的文档来存储数据,并支持在多个服务器上运行。MongoDB允许自动分片,这是一种数据库分区,可以将非常大的数据库分割成更小、更快、更容易管理的部分,称为数据分片。容易设置和上手,专业支持也多。
-
缺点:是他们不允许连接用于根据两个或多个表之间的公共字段组合数据或行。MongoDB确实有一个LOOKUP函数,官方建议用户不要依赖它们。
Redis:远程字典服务器是一个键值存储。
-
优点:它支持不同种类的抽象数据结构,如字符串、列表、映射、集合、排序集合等等。它也是开源的。不仅支持多数据类型,而且易于安装。
-
缺点:同上,不允许连接用于根据两个或多个表之间的公共字段组合数据或行。并且需要掌握Lua编程语言(一种高级脚本语言)