1.5 NoSQL
NoSQL这个术语用于非关系型的现代数据库。起初,NoSQL指的是“不支持SQL”,因为这些数据库不支持SQL。而现在,它指的是“不止SQL”,因为其中一些数据库支持SQL命令的一个子集。相对RDBMS数据库来说,NoSQL数据库有不同的设计目标。一个关系数据库保证了ACID(原子性、一致性、独立性和持久性)。而NoSQL数据库则权衡ACID对线性扩展性、性能、高可用性、灵活的模式和其他特性的兼容性。
本节讨论一些广泛使用的NoSQL数据库。
1.5.1 Cassandra
Cassandra是一个分布式、可扩展、容错的NoSQL数据库,用于存储大数据集。它是一个分块的、可调节一致性的行存储。其关键特性是动态模式,每一行可以存储不同的列,而不像关系数据库那样每行有完全相同的列。另外,Cassandra对写操作做了优化,所以插入操作是高性能的。
Cassandra是一个无主的分布式架构。因此,它没有单点故障的问题。另外,它实现了各行在集群中的自动分布。读写数据的客户端应用可以连接Cassandra集群中的任意节点。
Cassandra通过内部对数据复制的支持来提供高可用性。保存的副本数量可以配置,每个副本在集群中不同的节点上存储。如果复制因子是3,即使一或两个节点宕机,整个集群依然可用。
Cassandra中数据通过键空间(keyspace)、表、行和列形成的层级结构来建模。键空间在概念上类似于RDBMS中的数据库或模式。它是表的逻辑集合,代表一个命名空间,用来控制一组表的数据复制。表(也称为“列族”)在概念上类似于RDBMS中的表。一个列族由分块的行的集合构成。每一行由分块的键和一组列构成。特别要注意的是,尽管Cassandra中的键空间、表、行和列看起来分别和关系型数据库中的模式、表、行和列很类似,但是它们的实现和物理存储是不同的。
在Cassandra中查询模式驱动数据模型。Cassandra中的一个列族或一个表基本上就是一个物化视图。不像关系数据库那样,Cassandra不支持连接(join),这意味着相同的数据可能需要在多个列族中复制。
1.5.2 HBase
HBase也是一个分布式、可扩展、容错的NoSQL数据存储,用于存储大数据集。它运行在HDFS之上。它和Cassandra有相似的特点,二者均受启发于Bigtable(一个由Google发明的数据存储系统)。
Bigtable是一个由Google创造的分布式存储系统,用来处理跨越上千台商用服务器中拍字节级别的结构化数据。它不支持关系数据模型;相反,它提供了一种简单的数据模型,赋予客户端应用对数据存储的动态控制权。
HBase把数据存在表中。表由行组成,行由列族组成,列族由列组成。然而,HBase中的表和列与关系数据库中的表和列有很大不同。一个HBase表本质上是一个稀疏的、分布式、持久化、多维且有序的Map。
Map是一个被大多数编程语言所支持的数据结构。这是一个用于存储键值对的容器。对于通过键查找值来说,它是一种非常高效的数据结构。一般来说,键的顺序是未定义的,应用也不关心键的顺序:它提供一个键给Map,然后获取这个键所对应的值。注意,不要把Map数据结构和Hadoop MapReduce中的map函数弄混了。map函数是一个函数式编程语言的概念,用于转换数据。
Map数据结构在不同的编程语言中有不同的名字。比如,在PHP中叫作关联数组,在Python中叫作字典,在Ruby中它称为哈希,而在Java和Scala中则为映射。
HBase表是一个有序的多维或多层级的Map。第一层键是行键,它使应用能快速从数以亿计的行中读取其中一行。第二层键是列族。第三层键是列名,也称为列标识符。第四层键是时间戳。行键、列族、列名和时间戳组合起来,就唯一标识了一个单元(cell),其中包含值。值是一个未解析的字节数组。
HBase表中的行是稀疏的。不像关系数据库中的行,HBase中的每一行不必须有同样的列。每一行有同样的列族集,但一行中的某些列族可能没有存储任何内容。一个空单元不占用任何存储空间。