这里所说的云存储技术并非特指某项技术,而是一大类技术的统称,一般来自只要是具有以下特征的数据库都可以被看作是云存储技术。首先是几乎无限的扩展能力,可以支撑几百TB直至PB级的数据;然后是采用了并行计算模式,从而获得海量运算能力。简而言之,就是当计算能力不足,无论是存储还是运算,对于需求提出方而言,就是简单的增加机器即可实现。更进一步的特征便是高可用性,也就是说,在任何时候都能够保证系统正常使用,即便有机器发生故障。目前常见的符合这样特征的系统,有Google的GFS以及BigTable,Apache基金会的Hadoop(HDFS和HBase),最初来自于Amazon现在也属于Apache基金会的Cassandra,此外还有MongoDB、CouchDB、Hypertable、Redis等等。
作为可扩展性是指系统架构可以让系统提供更多的服务而不降低使用性能的特性。通过现有的机器增加硬件的容量、内存进行垂直扩展,是最简单的达到可扩展性的手段,但这有个限度。而水平扩展则需要增加更多机器,每台机器提供全部或部分数据,这样所有主机都不必负担全部业务请求。但软件自己需要有内部机制来保证集群中节点间的数据同步。而云存储技术所带来的可扩展性几乎是无限的,并且对于投资者而言投入(硬件投资)与产出(提供更多的服务)几乎是线性的。水平扩展说到底就是使用更多的主机来承担运算。假设一台主机在运行一年的时间里发生故障的概率是n,那么20台主机在运行一年的时间里发生故障的概率则为20×n,由此看出当某个集群中主机的数量达到一定程度,在一年中发生故障的概率将会非常大,甚至每天有机器发生故障也不是危言耸听。许多云存储技术都将此作为基本的设计前提,因此云存储技术天生具有良好的高可用性与容错。
怎么样?是否很诱人。这么好还不如把现在的这些企业应用都替换了。先别着急,享受这些好处也是有代价的。说到这里就不得不提EricBrewer的CAP理论(2002年被理论证明)。依据这个理论,对于一个大规模分布式数据库系统,有以下三个需求:
一致性(Consistency):对于所有的数据库客户端使用同样的查询都可以得到同样的结果,即使是有并发更新的时候也是如此。
可用性(Availability):所有的数据库客户端总是可以读写数据。
分区耐受性(Partition Tolerance):数据库可以分散到多台机器上,即使发生网路故障,被分成多个分区,依然可以提供服务。
CAP理论指出,同时只能具有这三个特性中的两个。传统的关系型数据库所强调的是一致性(C)与可用性(A),而在分区耐受性(P)的方面的支持十分有限,这一点从本质上揭示了上述关系型数据库的问题。再来看云存储技术,都特别强调了分区耐受性(P)从而弥补关系型数据库在此方面的不足,接下来的区别就是选择可用性(A)还是一致性(C)了,反正是不能都选。对于CP系统,放弃的是可用性(A),你的数据将保持一致性,但如果有节点发生故障,仍然会有部分数据无法访问;而对于AP系统,放弃的则是一致性(C),那么你的系统就有可能返回不太精确的数据。