一 序言
在前面的文章中,我简单地讲述了一下在windows平台上cassandra的安装与启动,并以自底向上的视角来讲述了cassandra的基本数据模型。在我学习一个新的事物之前,我认为最好的方法就是先在宏观上了解一下这个事物,然后再从细节上着手。本篇文章就从自顶向下的视角来分析cassandra的数据模型。
二 集群的概念
Cassandra在设计之初就考虑到了跨越多台主机共同工作,对用户呈现一个整体的分布式系统架构的需求。所以,应此需求而生的就是Cassandra的最外层结构是集群(Cluster),也可以称之为环(Ring),因为Cassandra将集群中的所有节点组成一个环,并依此来分配数据到集群中的节点上。
谈到集群,我们就会想到数据的同步。Cassandra的集群没有主从的概念,所有的节点都是对等的,并且它们以P2P协议在各个节点之间进行数据同步。
三 Keyspace
集群是keyspace的容器,而且一个集群通常只有一个keyspace。keyspace是cassandra中数据的最外层容器,因此可以将其类比成关系型DB中的数据库实例。在Cassandra的设计中,keyspace有如下几个基本属性:
1 副本因子(Replication factor)
副本因子的作用是控制数据在集群中有多少个副本。从本质上说,副本因子决定了要为CAP理论中的C付出多少性能代价。
2 副本放置策略(Replica placement strategy)
是指数据如何分布到环上,此策略直接影响到数据的键值映射到环上节点的方式。
3 列族(Column family)
在cassandra中,keyspace是一个或多个列族的容器,就类似于关系型DB中的表,是集合了多行数据的容器。
四 列族(Column family)
列族是容纳一组有序的行的容器,每行都包含一组有序的列。这里从几个方面讲述列族与关系型DB中的表的区别:
1 Cassandra被认为是无Schema的,因为可以随意在在列族中添加任意的列。而不像关系型DB中,一但定义了表的属性后就确定了列。
2 列族除了和关系型DB中的表都拥有一个名称以外,还有一个称之为比较器(comparator)的属性。它决定了在查询数据时返回的列的排序方式,可以根据long,byte,UTF8或者其他方式排序。
3 在关系型DB中,数据在磁盘上的组织方式是对用户透明的。但是在cassandra中,每个列族都存储为不同的文件,所以从查询性能上来讲,把相关的列放到同一个列族中十分重要。
这里需要明确的是,列族是行的容器,而行则是许多列的容器。行与列一样,都是局部唯一标识它们的Name值。
五 列(column)
列是cassandra中最基本的数据结构了。它是一个由名称(Name),值(Value)和时间戳组成的三元组,如下图所示:
列的结构很简单,说白了就是name-value对。 需要注意的是它与关系型DB中的列的区别:首先,在关系型DB中需要预告定义所有列的名字和属性来定义表的结构,然后才能按照定义好的属性提供值,而在Cassandra中可以由应用根据需要随时写入列,在极大地提高了灵活性,也允许数据随着时间的推移而循序渐进地改变;其次,在关系型DB中一旦列的名称定义好后就不建议再修改,而且所有行的数据都按照对应列来解析。在Cassandra中,列的定义完全由应用决定,也就是说一个列中的name和value可以存储用户任何想存储的数据,name在某种意义上也是一种数据;最后,被认为是cassandra中列与关系型DB中列的最大区别就是,Cassandra中列在各行中数目不定,根据应用的需求变化,而在关系型DB中各行的列都是不变的。
六 小结
这篇文章从自顶向下的视角分析一下Cassandra的数据模型,并简单的讲述了一下与关系型DB的一些区别。Cassandra与关系型DB的最大区别就是在设计数据库的架构时不再以数据为中心,而是以查询为中心。需要为特定的查询设计特别的数据架构以便获取最高的查询性能。
如有错误之处,敬请留言!