在WEB 2.0的“三高”需求面前
1) 对数据库高并发读写的需求
2) 对海量数据的高效率存储和访问的需求
3) 对数据库的高可扩展性和高可用性的需求
传统的关系数据库遇到了难以克服的困难,为了解决这些问题,非关系行数据库应运而生。
1.相关理论基础
1.1 CAP理论
CAP理论: 就是对于一个分布式系统,一致性(Consistency)、可用性(Availablity)和分区容忍性(Partition tolerance)三个特点最多只能三选二。
一致性意味着系统在执行了某些操作后仍处在一个一致的状态,简言之,就是所有的结点在同一时刻有相同的数据。
可用性指对数据的所有操作都应有成功的返回。高可用性则是在系统升级(软件或硬件)或在网络系统中的某些结点发生故障的时候,仍可以正常返回。简言之,就是任何请求不管成功或失败都有响应。
分区容忍性这一概念的前提是在网络发生故障的时候。在网络连接上,一些结点出现故障,使得原本连通的网络变成了一块一块的分区,若允许系统继续工作,那么就是分区可容忍的。
注意:对于分布式系统,一般P是必不可少的,所以会有CP,AP两种情况。
1.2 BASE
由于CAP理论的存在,为了提高性能,出现了ACID的一种变种BASE(这四个字母分别是Basically Available, Soft—state, Eventual consistency的开头字母,是一个弱一致性的理论,只要求最终一致性):
- Basically Available:基本可用。
- Soft state:软状态,可以理解为“无连接”的,而与之相对应的Hard state就是“面向连接”的。
- Eventual consistency:最终一致性,最终整个系统(时间和系统的要求有关)看到的数据是一致的。
在BASE中,强调可用性的同时,引入了最终一致性这个概念,不像ACID,其并不需要每个事务都是一致的,只需要整个系统经过一定时间后最终达到一致。
1.3 分区
当数据量不断增加时,单一的计算机系统存储已不够用,首要的解决方案就是进行分区存储。
分区的主要方法如下:
1)内存缓存:缓存技术可以看成一种分区。
2)集群:数据库服务集群在为用户提供服务时的透明性(用户感觉像是在一个地方)。是另外一种对数据分区的方法。。然而,这种方法虽然能在某种程度上扩展系统数据持久层,可是集群本身的特性却仅仅应用在了数据库管理系统的顶层,而并未在分布式最初的设计中得到应用。
3)读写分离:指定一台或多台主服务器,所有或部分的写操作被送至此,同时再设一定数量的副本服务器用以满足读请求。这种模型(主/从模型)在读写率很高的时候工作得很好。
(4)范围分割技术/分片(sharding):指对数据按照如下方式进行分区操作,即对数据的请求和更新在同一个结点上,并且对于分布在不同服务器上的数据存储和下载的量大致相同。从可靠性和负载平衡的观点看,数据的碎片也是需要被复制的,并且允许它们被写入主服务器的副本中和所有需要维护数据分区的副本服务器中。而为了做到这一点,需要在分区和存储结点之间做一个映射。这个映射是动态还是静态取决于用户的应用、主服务器的“映射服务/组件”以及网络中用户应用于网络结点之间的基础结构。在分区场景中,关键在于如何将数据库中的对象映射到服务器上。通常的方法是哈希散列法。
1.4 存储分布
存储布局是确定了如何访问磁盘,以及如何直接影响性能,主要分为基于行的存储布局、列存储布局、带有局部性群组的列存储布局、LSM-Tree四种。
LSM-Tree (Log Structured Merge Trees,日志结构合并树)描述的是为了满足高效、高性能、安全地读写的要求,如何有效地利用内存和磁盘存储。LSM-Tree 的观点是由 PatrickO'Neil在1996年率先提出的。LSM-Tree算法思想主要用于解决日志记录索引的问题,这种应用的特点是数据量大、写速率高(2000条/秒),又要建立有效的索引来查找日志中的特定条目。Patrick O'Neil的做法是,在内存里维护一个相同的B树,当内存中的B树达到阈值时,批量进行滚动合并。