当前位置:主页 > 查看内容

Cassandra CQL语法 以及功能介绍

发布时间:2021-05-17 00:00| 位朋友查看

简介:作者 玄陵 ? 一、Cassandra简单介绍 Cassandra的历史 Cassandra Dynamo(distributed architecture ) Bigtable(data format)。Cassandra最开始是Apache的顶级开源项目 他开源的数据库历史是来自于2篇论文 Dynamo(distributed architecture ) 07年Amazon 亚马……

作者 玄陵



?

一、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的总体架构


分布式层面

1.png


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的初步认识

2.png

单节点层面


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 进行简单的读和写、建表等基本操作有一个初步的认识。


3.png


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总体介绍


4.png


把这个分三块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几个概念


5.png


在介绍CQL语言之前 要先去了解几个比较基本的概念 Cassandra自己定义的意义和备注。


Partition key是Cassandra特有的 表示分区键 可以确定数据存放的节点。落在哪个节点上面去 数据它属于哪个节点或者哪几个副本都是它决定。


6.png


cql_type 是由 native_type | collections | udt | tuple |custom_type 类型组成的。数据结构丰富 便于业务直接使用 无需封装 eg inet 用户使用ip直接使用无需转换。要强调的是Cassandra的Type还定义在别的数据库不常见的一些类型 比方说 Inet就是定义的 IP的数据类型 如果用户要存储某个IP类型 那么它就直接可以用Inet这个类型去存储。


7.png


所以我们的所有的类型是在建表的时候 通过定义某一个列的名字后 会根据跟上列的对应的类型。


8.png


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


9.png


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 还有一些阈值


10.png


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

? 其他多数丰富操作


举例


11.png


如图所示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

? 支持行、列级别删除


举例


12.png


如图所示 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数据最终全被写入

? 提高写入吞吐


举例


13.png


如图所示分了两条INSERT一条update以及一条delete 最后以看到select数据是符合需求的。


CQL ACL

? Role级别操作 支持账户密码 role资源操作

? 各种资源级别的鉴权

? 常见grant 以及revoke操作 role资源和permissions


举例


14.png


如图所示 首先是以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的列不推荐使用

? 支持多重索引查询 支持集合数据类型上构建索引


举例


15.png


如图所示可以看到例子里面建了对这个表上面两个列对应的进行了构建索引 查询的时候也基于对应的列去查询 以空间换时间的一个方式。


2、SASI : Sstable Attached Secondary Index

? Local Index的一种 支持较多索引模式 prefix contains sparse,支持轻搜索功能

? 对字符串支持的prefix 和 contains功能支持 轻模糊匹配 like ’%key‘, like ‘%key%’

? 使用analyzer可以对某个列的文本数据做词干分析

? 丰富的索引构建选项 大小写敏感 索引模式 是否使用anlyzer

? 不支持collection类型

? 实验功能 不推荐生产使用


例一


16.png


如图所示 这个例子也对应地构建了一个对应的索引 使用了一个SASI的索引 支持一些对应的操作 可以看到是用like一个模糊匹配匹配出对应的一些数据。


例二

如图所示 在构建索引的时候指定对应的anlyzer 可以通过anlyzer去做一些数据的分词 但允许的数据量不是特别大 如果真正需要单个类的数据量比较大的情况 还是建议用一些搜索引擎。


3、Materialized View

? 全局索引表 数据基于数据表构建

? 适用于数据表基数较高的数据列

? 需要指定新的primary key


举例


16.png


如图所示CREATE Materialized View 新Materialized View是select所有的数据 把所有的数据都当放到Materialized View里面 类似于全一种新的一个表。


本文转自网络,原文链接:https://developer.aliyun.com/article/784100
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐