1 数据模型
Cassandra的数据模型与常见的关系型数据库的数据模型有很大的不同
1.1 列(Column)
列是Cassandra的基本数据结构单元,具有三个值:名称,值、时间戳
在Cassandra中不需要预先定义列(Column),只需要在KeySpace里定义列族,然后就可以开始写数据了。
1.2 列族(Column Family)
列族相当于关系数据库的表(Table),是包含了多行(Row)的容器。
ColumnFamily的结构举例,如图:
可以理解为Java结构 Map>,如图:
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种策略,内容如下:
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 数值类型
2.2 文本类型
CQL提供2种类型存放文本类型,text和varchar基本一致
2.3 时间类型
2.4 标识符类型
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 其他基本类型
2.7 用户自定义类型
如果内置的数据类型无法满足需求,可以使用自定义数据类型。