存储系统从其与生俱来的使命来讲,就难以摆脱复杂系统的魔咒。不管是从单机时代的文件系统,仍是后来C/S或B/S结构下数据库这样的存储中间件兴起,仍是现在煊赫一时的云存储服务来讲,存储都很复杂,并且是愈来愈复杂。数据库
存储为何会复杂,要从什么是存储谈起。存储这个词很是平凡,存储 + 计算(操做)就构成了一个朴素的计算机模型。简单来讲,存储就是负责维持计算系统的状态的单元。从维持状态的角度,咱们会有最朴素的可靠性要求。好比单机时代的文件系统,机器断电、程序故障、系统重启等常规的异常,文件系统必须能够正确地应对,甚至对于磁盘扇区损坏,文件系统也须要考虑尽可能将损失降到最低。对于大部分的业务程序而言,你只须要重点关注业务的正常分支流程就行,对于出乎意料的状况,一般只需抛出一个错误,告诉用户你不应这么玩。可是对于存储系统,你须要花费绝大部分精力在各类异常状况的处理上,甚至你应该认为,这些庞杂的、多样的错误分支处理,才是存储系统的“正常业务逻辑”。服务器
到了互联网时代,有了C/S或B/S结构,存储系统又有了新指标:可用性。为了保证服务质量,那些用户看不见的服务器程序必须时时保持在线,最好作到逻辑上是不宕机的(可用性100%)。服务器程序怎么才能作到高可用性?答案是存储中间件。没有存储中间件,意味着全部的业务程序,都必须考虑每作一步就对状态进行持久化,以便本身挂掉后另外一台服务器(或者本身重启后),知道以前工做到哪里了,接下去应该作些什么。可是对状态进行持久化(也就是存储)会很是繁琐,若是每一个业务都本身实现,负担无疑很是沉重。但若是有了高可用的存储中间件,服务器端的业务程序就只需操做存储中间件来更新状态,经过同时启动多份业务程序的实例作互备和负载均衡,很容易实现业务逻辑上不宕机。架构
因此,数据库这样的存储中间件出现基本上是历史必然。尽管数据库很通用,但它决不会是惟一的存储中间件。好比业务中用到的富媒体(图片、音视频、Office文档等),咱们不多会去存储到数据库中,更多的时候咱们会把它们放在文件系统里。可是单机时代诞生的文件系统,真的是最适合存储这些富媒体数据的么?不,文件系统须要改变,由于:负载均衡
伸缩性。单机文件系统的第一个问题是单机容量有限,在存储规模超过一台机器可管理的时候,应该怎么办。分布式
性能瓶颈。一般,单机文件系统在文件数目达到临界点后,性能会快速降低。在4TB的大容量磁盘愈来愈普及的今天,这个临界点至关容易到达。oop
可靠性要求。单机文件系统一般只是单副本的方案,可是今天单副本的存储早已没法知足业务的可靠性要求。数据须要有冗余(比较经典的作法是3副本),而且在磁盘损坏时及早修复丢失的数据,以免全部的副本损坏形成数据丢失。性能
可用性要求。单机文件系统一般只是单副本的方案,在该机器宕机后,数据就不可读取,也不可写入。搜索引擎
在分布式存储系统出现前,有一些基于单机文件系统的改良版本被一些应用采纳。好比在单机文件系统上加 RAID5 作数据冗余,来解决单机文件系统的可靠性问题。假设 RAID5 的数据修复时间是1天(实际上每每作不到,尤为是业务系统自己压力比较大的状况下,留给 RAID 修复用的磁盘读写带宽颇有限),这种方案单机的可靠性大概是100年丢失一次数据(便可靠性是2个9)。看起来尚可?可是你得当心两种状况。一种是你的集群规模变大,你仍然沿用这个土方法,好比你如今有 100 台这样的机器,那么就会变成1年就丢失一次数据。另外一种状况是若是实际数据修复时间是 3 天,那么单机的可靠性就直降至4年丢失一次数据,100台就会是15天丢失一次数据。这个数字显然没法让人接受。spa
Google GFS 是不少人阅读的第一份分布式存储的论文,这篇论文奠基了 3 副本在分布式存储系统里的地位。随后 Hadoop 参考此论文实现了开源版的 GFS —— HDFS。但关于 Hadoop 的 HDFS 实际上业界有很多误区。GFS 的设计有很强的业务背景特征,自己是用来作搜索引擎的。HDFS 更适合作日志存储和日志分析(数据挖掘),而不是存储海量的富媒体文件。由于:设计
HDFS 的 block 大小为 64M,若是文件不足 64M 也会占用 64M。而富媒体文件大部分仍然很小,好比图片常规尺寸在 100K 左右。有人可能会说我能够调小 block 的尺寸来适应,但这是不正确的作法,HDFS 的架构是为大文件而设计的,不可能简单经过调整 block 大小就能够知足海量小文件存储的需求。
HDFS 是单 Master 结构,这决定了它可以存储的元数据条目数有限,伸缩性存在问题。固然做为大文件日志型存储,这个瓶颈会很是晚才遇到;可是若是做为海量小文件的存储,这个瓶颈很快就会碰上。
HDFS 仍然沿用文件系统的 API 形式,好比它有目录这样的概念。在分布式系统中维护文件系统的目录树结构,会遭遇诸多难题。因此 HDFS 想把 Master 扩展为分布式的元数据集群并不容易。
分布式存储最容易处理的问题域仍是单键值的存储,也就是所谓的 Key-Value 存储。只有一个 Key,就意味着咱们能够经过对 Key 作 Hash,或者对 Key 作分区,都可以让请求快速定位到特定某一台存储机器上,从而转化为单机问题。这也是为何在数据库以后,会冒出来那么多 NoSQL 数据库。由于数据库和文件系统同样,最先都是单机的,在伸缩性、性能瓶颈(在单机数据量太大时)、可靠性、可用性上遇到了相同的麻烦。NoSQL 数据库的名字其实并不恰当,他们更多的不是去 SQL,而是去关系(咱们知道数据库更完整的称呼是关系型数据库)。有关系意味着有多个索引,也就是有多个 Key,而这对数据库转为分布式存储系统来讲很是不利。