作者:玄陵
一、Cassandra简单介绍
Cassandra的历史
Cassandra = Dynamo(distributed architecture ) + Bigtable(data format)。Cassandra最开始是Apache的顶级开源项目,他开源的数据库历史是来自于2篇论文:Dynamo(distributed architecture ),07年Amazon(亚马逊)发表,Cassandra吸取了Dynamo的分布式架构;Bigtable(data format),由Google(谷歌)发表,Cassandra吸取了Bigtable的部分数据组织格式,及表的多种组织格式。由这2篇论文衍生出开源Cassandra。
Cassandra的总体架构
分布式层面
Apache Cassandra的特性:
线性扩展:它有去中心化的架构;
高可用:它有多副本,副本读写策略能够保证可用性较高;
高性能:主要取决于它底层的LSM Tree Storage;
灵活应用:通过CQL语言去访问Cassandra,是wide column的宽表模型。
DHT环(图左):
在环上有5个节点,每个节点把环进行划分,在Cassandra设计里,每一个节点对应负责一部分的数据范围,它能保证所有数据映射到环上最小到最大的范围,每个节点将DHT环的范围进行均衡切分,切分后能保证每个节点负责范围相对均匀,任何一条数据来到这条环上,都可以做到相对均匀的选择它对应的节点。
单个节点是由LSM Tree的引擎构成,他有自己的Memtable,有自己的 WAL Commit Log有自己的一个SStable,可以保证它的写、读的性能比较好。
环外的Clients,输入一条SQL,选择任意一个Cassandra服务端的节点去进行连接,然后在对应的节点上可以基于你的CQL编译出来一个结果, 选择你的数据需要落在的副本节点上,是它一次在分布式层面的架构写入的流程。
Cassandra的初步认识
单节点层面
Cassandra在单个节点实际组成的模块,在图的左边有ABCDE5个节点,然后去分解B节点对应的组成模块,最上层是由网络层组成的,网络层主要的是实现了用户请求过来的CQL语句,以及对 CQL的Binary协议请求的实现。
当CQL请求过来经过我们的网络层,网络层的Server把这个对应的请求转发到下面会有一个CQL的Parser(Cassandra内部的对SQL语言进行解析的模块,这个模块是把对应的SQL类string语言转换成对应的statement,转换成在Cassandra内部可进行请求编译的结果)。
还有meta的管理的模块,Cassandra所有的录入表信息以及我们的 scheme信息等管理的模块,底层 Commitlog/sstable/index等管理的模块,最下层是我们的一个文件系统。
Cassandra的架构,它底层是直接跟Linux、或者windows平台对应的底层的local file system进行交互的,在看网络层下面的Gossip,是让集群中的ABCDE这5个节点相互的感知到彼此,路由信息都是由Gossip感知维护的,也能够各个节点的探活状态。再下层就是DHT环,在后面个replication的management,是对副本的管理的策略。通过这两幅图,我们可以看到Cassandra在整体的分布式层面,以及在单节点层面,它请求的或者说组织的一个模块情况。
通过这两幅图,我们可以大概Cassandra架构有一定了解,它是分布式的数据库、区中心化的数据库,单节点是由lsm区域进行构成的引擎,每个节点它最上层是有一个网络层,然后下面会直接把所有的输入CQL进行编译成结果。
二、Cassandra CQL介绍
第二部分详细介绍CQL对应一些语法,通过了解到对应的语法之后,我们可以如何去使用Cassandra,进行简单的读和写、建表等基本操作有一个初步的认识。
Cassandra为了方便用户去操作或请求它自己所实现的类似于Query Language,自定义的一个轻的 native的 SQL的语言。
可以通过社区datastax或Netflix再或任何其他的以及开源的一个driver去访问我们的Cassandra,通过我们的CQL语言去访问Cassandra,原生支持:java/c++/python/nodejs/php/c#/go/ruby等多语言去访问Cassandra,同时也支持spark 访问。
通过HBase KV api VS CQL 写一条数据对比可以看的,缩短了代码行数,直接使用 SQL语言进行一个操作,比较方便。
CQL总体介绍
把这个分三块Data type、DDL/DML/ACL、INDEX/MV/UDF/IDA:
Data type包含:基础数据类型、集合数据类型、UDT(User-defined-Type)。
DDL/DML/ACL包含:DDL: CREATE/DROP、DML:SELECT/UPDATE/DELET/INSERT、ACL:ROLE/USER/PASSWORD/…。
INDEX/MV/UDF/IDA包含:Secondary index/SaSI Index、Materialized View、UDF/UDA。
CQL几个概念
在介绍CQL语言之前,要先去了解几个比较基本的概念,Cassandra自己定义的意义和备注。
Partition key是Cassandra特有的,表示分区键,可以确定数据存放的节点。落在哪个节点上面去,数据它属于哪个节点或者哪几个副本都是它决定。
cql_type 是由 native_type | collections | udt | tuple |custom_type 类型组成的。数据结构丰富,便于业务直接使用,无需封装,eg:inet,用户使用ip直接使用无需转换。要强调的是Cassandra的Type还定义在别的数据库不常见的一些类型,比方说:Inet就是定义的 IP的数据类型,如果用户要存储某个IP类型,那么它就直接可以用Inet这个类型去存储。
所以我们的所有的类型是在建表的时候,通过定义某一个列的名字后,会根据跟上列的对应的类型。
Collecion Type是一个集合数据类型,其中map, set,list,是别的数据库里面不常见的,但是是日常用的比较多的类型,Collecion Type可以基于自己的业务场景去操作的。
UDT:User Defined Type就是组合了多种类型成包括成一种新的类型,并支持:CREATE /ALTER /DROP语法。
CQL DDL
DDL的一些使用的方式CREATE KEYSPACE、USE KEYSPACE 、ALTER KEYSPACE、DROP KEYSPACE、 DESCRIBE KEYSPACE;CREATE TABLE 、ALTER TABLE、 DROP TABLE、 DESCRIBE TABLE、 TRUNCATE ,建表,键值空间、修改表、修改键值空间、删除表、删除键值空间、还有清空表。
定义KEYSPACE实际上会定义两个东西,第一个Replication,下面会有两个子项目,一个是class,class也分两种,一种是Simple strategy和NetworkTopologyStrategy ,主要定义了的副本的摆放策略,就是在Cassandra执行里面,一行数据会放在多个副本上面,多个副本的摆放策略这里定义它是顺序的还是逆序的,还是说以某种方式摆放的;副本数Replication factor,会定义一行数据写进来,在分布式的节点上面有几个节点会放,副本因子是多少,
举例:
CREATE KEYSPACE KS1 WITH replicate application,它的class simple strategy它的摆放策略是1;
CREATE KEYSPACE KS2, class摆放策略是networkToplogyStrategy,因为使用的NetworkToplogy,这里需要定义一个对应的跟NetworkToplogy相关的叫DC的概念,如图可见定义的 dc1的副本数是1,如果用户有多DC概念,后面可以跟上DC2、DC3、DC4以及在各个DC下面的一个摆放的副本因子。
CQL的DDL对Table,在创建一个table的时候,必须要有一些对应的信息:
- Primary key : 必须定义,由partition key 和 cluster key组成
- Partition key :必须定义,确定数据的摆放物理位置
- Cluster key:可以不定义,确定数据在partition 下的摆放情况
- default_time_to_live: 表级别ttl;如果一个数据希望在所有表下面的数据都有TTL的话 ,就用此定义,单位是秒。
- Compaction策略:STCS/LCS/TWCS;
- Compression压缩策略:SNAPPY/LZ4;
举例:
CREATE对应TABLE,定义了一个 PK的类型是text,CK类型是text,regularcn类型也是text;
定义的主键是由PK和CK组成的,这里PK就是partition key,然后CK是 cluster key;
对应的参数,如default_time_to_live是 100秒;
Compaction策略是 SizeTieredCompactionStrategy,还有一些阈值;
Compression用定义的是lz4,如上图下面 tb是没有参数的,如果没有参数它会定义默认的设置一些参数。
CQL DML
DML : SELECT / INSERT / UPDATE/ DELETE /BATCH
1、SELECT
• 支持获取指定列以及通配符操作;
• 支持LIMIT/PARTITION LIMIT/ ORDE BY /GOUP BY ;
• 支持native function 处理操作: count、max、min、sum、avg等
• 支持JSON;
• 其他多数丰富操作;
举例
如图所示SELECT*from这个表,包括count、limit、 some select等数据,大概是一些对应的操作以及select执行 select数据,以Jason的方式输出,这里都有对应的一些例子可以做参考。
2、INSERT
• 支持常规写数据,primary key 必须指定数据
• 支持写入JSON数据;
• 支持cell 以及row TTL;
• 保证线性一致性:IF NOT EXIST
3、UPDATE
• 需要指定primary key,主键列必须要指定
• 如果数据存在就更新,不存在则写入
4、DELETE
• 支持行、列级别删除
举例
如图所示 UPDATE对应的数据列或者行数据,使用了一个TTL,UPDATE ks. Tb USING TTL SET age= 20 WHERE name,这个nameprimary key;
对应的delete这一行数据,把WHERE name = xl行数据全删掉。
5、BATCH
• 语法:BEIGIN BATCH开始,以 APPLY BATCH 结束,中间可包含多条INSERT/UPDATE/DELETE;
• 支持LOGGED/UNLOGGED BATCH 2种模式。LOGGED BATCH 保证batch数据最终全被写入
• 提高写入吞吐;
举例
如图所示分了两条INSERT一条update以及一条delete,最后以看到select数据是符合需求的。
CQL ACL
• Role级别操作,支持账户密码,role资源操作;
• 各种资源级别的鉴权;
• 常见grant 以及revoke操作(role资源和permissions);
举例
如图所示,首先是以Cassandra用户user去登录,登录时创建了一个ROLE,CREATE ROLE JACK可以 log in,然后password是super user,这是CREATE ROLE的语法里面需要定义的一些操作,第二次以jack用户去 log in的时候,执行了LISE ROLES ,可以看到Cassandra和Jack两个用户对应的permission,执行了一些grant和revoke操作,通可以通过grant、revoke去操作,让 Jack对某个KEYSPACE或select的操作,对 Jack可以决定是否有效。
CQL INDEX
INDEX : Secondary Index/ SASI / Materialized View
1、Secondary Index
• Local Index,索引表数据和数据表数据共存;适用于基数适中的数据表列;
• 可以指定索引名,若不指定则自动生成;
• Counter列不支持二级索引;
• 频繁删除以及update的列不推荐使用;
• 支持多重索引查询,支持集合数据类型上构建索引;
举例
如图所示可以看到例子里面建了对这个表上面两个列对应的进行了构建索引,查询的时候也基于对应的列去查询,以空间换时间的一个方式。
2、SASI : Sstable Attached Secondary Index
• Local Index的一种,支持较多索引模式:prefix,contains,sparse,支持轻搜索功能;
• 对字符串支持的prefix 和 contains功能支持,轻模糊匹配,like ’%key‘, like ‘%key%’
• 使用analyzer可以对某个列的文本数据做词干分析;
• 丰富的索引构建选项:大小写敏感,索引模式,是否使用anlyzer;
• 不支持collection类型;
• 实验功能,不推荐生产使用;
例一
如图所示,这个例子也对应地构建了一个对应的索引,使用了一个SASI的索引,支持一些对应的操作,可以看到是用like一个模糊匹配匹配出对应的一些数据。
例二
如图所示,在构建索引的时候指定对应的anlyzer,可以通过anlyzer去做一些数据的分词,但允许的数据量不是特别大,如果真正需要单个类的数据量比较大的情况,还是建议用一些搜索引擎。
3、Materialized View
• 全局索引表,数据基于数据表构建;
• 适用于数据表基数较高的数据列;
• 需要指定新的primary key;
举例
如图所示CREATE Materialized View,新Materialized View是select所有的数据,把所有的数据都当放到Materialized View里面,类似于全一种新的一个表。