1 数据模型

Cassandra的数据模型与常见的关系型数据库的数据模型有很大的不同

1.1 列(Column)

列是Cassandra的基本数据结构单元,具有三个值:名称,值、时间戳

Cassandra基本概念_数据类型

在Cassandra中不需要预先定义列(Column),只需要在KeySpace里定义列族,然后就可以开始写数据了。

1.2 列族(Column Family)

列族相当于关系数据库的表(Table),是包含了多行(Row)的容器。

ColumnFamily的结构举例,如图:

Cassandra基本概念_数据_02

可以理解为Java结构 Map>,如图:

Cassandra基本概念_Cassandra_03

1.2.1 ColumnFamily 的2种类型
  • 静态column family(static column family)

静态的column family,字段名是固定的,比较适合对于这些column都有预定义的元数据

  • 动态column family(dynamic column family)

动态的column family,字段名是应用程序计算出来并且提供的,所以column family只能定义这些字段的类型,无法不可以指定这些字段的名字和值,这些名字和值是由应用程序插入某字段才得出的。

1.2.2 Row key

ColumnFamily 中的每一行都用Row Key(行键)来标识,这个相当于关系数据库表中的主键,并且总是被索引的。

1.2.3 主键

Cassandra可以使用PRIMARY KEY 关键字创建主键,主键分为2种

  • Single column Primary Key

如果 Primary Key 由一列组成,那么称为 Single column Primary Key

  • Composite Primary Key

如果 Primary Key 由多列组成,那么这种情况称为 Compound Primary Key 或 Composite Primary Key

列族具有以下属性:

  • keys_cached - 它表示每个SSTable保持缓存的位置数。
  • rows_cached - 它表示其整个内容将在内存中缓存的行数。
  • preload_row_cache -它指定是否要预先填充行缓存。

1.3 键空间(KeySpace)

Cassandra的键空间(KeySpace)相当于数据库,我们创建一个键空间就是创建了一个数据库。

键空间包含一个或多个列族(Column Family)

注意:一般将有关联的数据放到同一个 KeySpace 下面

键空间(KeySpace)创建的时候可以指定一些属性:副本因子,副本策略,Durable_writes(是否启用 CommitLog 机制)

1.3.1 副本因子(Replication Factor)

副本因子决定数据有几份副本。例如:

副本因子为1表示每一行只有一个副,。副本因子为2表示每一行有两个副本,每个副本位于不同的节点上。在实际应用中为了避免单点故障,会配置为3以上。

注意:所有的副本都同样重要,没有主从之分。可以为每个数据中心定义副本因子。副本策略设置应大于1,但是不能超过集群中的节点数。

1.3.2 副本放置策略(Replica placement strategy)

描述的是副本放在集群中的策略

目前有2种策略,内容如下:

Cassandra基本概念_Cassandra_04

1.3.3 Durable_writes

否对当前KeySpace的更新使用commitlog,默认为true

1.4 副本(Replication)

副本就是把数据存储到多个节点,来提高容错性

1.5 节点(Node)

存储数据的机器

1.6 数据中心(DateCenter)

1.7 集群(Cluster)

Cassandra数据库是为跨越多条主机共同工作,对用户呈现为一个整体的分布式系统设计的。Cassandra最外层容器被称为群集。Cassandra将集群中的节点组织成一个环(ring),然后把数据分配到集群中的节点(Node)上。

1.8 超级列

超级列是一个特殊列,因此,它也是一个键值对。但是超级列存储了子列的地图。

通常列族被存储在磁盘上的单个文件中。因此,为了优化性能,重要的是保持您可能在同一列族中一起查询的列,并且超级列在此可以有所帮助。下面是超级列的结构。

2 数据类型

CQL提供了一组丰富的内置数据类型,用户还可以创建自己的自定义数据类型。 CQL是Cassandra提供的一套查询语言

2.1 数值类型

Cassandra基本概念_数据_05

2.2 文本类型

CQL提供2种类型存放文本类型,text和varchar基本一致

Cassandra基本概念_数据类型_06

2.3 时间类型

Cassandra基本概念_Cassandra_07

2.4 标识符类型

Cassandra基本概念_Cassandra_08

2.5 集合类型

2.5.1 set

集合数据类型,set 里面的元素存储是无序的。

set 里面可以存储前面介绍的数据类型,也可以是用户自定义数据类型,甚至是其他集合类型。

2.5.2 list

list 包含了有序的列表数据,默认情况下,数据是按照插入顺序保存的。

2.5.3 map

map 数据类型包含了 key/value 键值对。key 和 value 可以是任何类型,除了 counter 类型

使用集合类型要注意: 1、集合的每一项最大是64K。 2、保持集合内的数据不要太大,免得Cassandra 查询延时过长,Cassandra 查询时会读出整个集合内的数据,集合在内部不会进行分页,集合的目的是存储小量数据。 3、不要向集合插入大于64K的数据,否则只有查询到前64K数据,其它部分会丢失。

2.6 其他基本类型

Cassandra基本概念_数据_09

2.7 用户自定义类型

如果内置的数据类型无法满足需求,可以使用自定义数据类型。