Cassandra CQL语法 以及功能介绍

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 内容摘要:一、Cassandra简单介绍 ·Cassandra的历史和基本架构二、Cassandra CQL介绍 ·如何使用CQL语言操作Cassandra

作者:玄陵



 

一、Cassandra简单介绍


Cassandra的历史


Cassandra = Dynamo(distributed architecture ) + Bigtable(data format)Cassandra最开始是Apache的顶级开源项目,他开源的数据库历史是来自于2篇论文:Dynamo(distributed architecture )07Amazon(亚马逊)发表,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语句,以及对 CQLBinary协议请求的实现。


CQL请求过来经过我们的网络层,网络层的Server把这个对应的请求转发到下面会有一个CQLParserCassandra内部的对SQL语言进行解析的模块,这个模块是把对应的SQLstring语言转换成对应的statement,转换成在Cassandra内部可进行请求编译的结果)。


还有meta的管理的模块,Cassandra所有的录入表信息以及我们的 scheme信息等管理的模块,底层 Commitlog/sstable/index等管理的模块,最下层是我们的一个文件系统。


Cassandra的架构,它底层是直接跟Linux、或者windows平台对应的底层的local file system进行交互的,在看网络层下面的Gossip,是让集群中的ABCDE5个节点相互的感知到彼此,路由信息都是由Gossip感知维护的,也能够各个节点的探活状态。再下层就是DHT环,在后面个replicationmanagement,是对副本的管理的策略。通过这两幅图,我们可以看到Cassandra在整体的分布式层面,以及在单节点层面,它请求的或者说组织的一个模块情况。


通过这两幅图,我们可以大概Cassandra架构有一定了解,它是分布式的数据库、区中心化的数据库,单节点是由lsm区域进行构成的引擎,每个节点它最上层是有一个网络层,然后下面会直接把所有的输入CQL进行编译成结果。

 


二、Cassandra CQL介绍


第二部分详细介绍CQL对应一些语法,通过了解到对应的语法之后,我们可以如何去使用Cassandra,进行简单的读和写、建表等基本操作有一个初步的认识。


3.png


Cassandra为了方便用户去操作或请求它自己所实现的类似于Query Language,自定义的一个轻的 native SQL的语言。


可以通过社区datastaxNetflix再或任何其他的以及开源的一个driver去访问我们的Cassandra,通过我们的CQL语言去访问Cassandra,原生支持:java/c++/python/nodejs/php/c#/go/ruby等多语言去访问Cassandra,同时也支持spark 访问。


通过HBase KV api VS CQL 写一条数据对比可以看的,缩短了代码行数,直接使用 SQL语言进行一个操作,比较方便。


CQL总体介绍


4.png


把这个分三块Data typeDDL/DML/ACLINDEX/MV/UDF/IDA


Data type包含:基础数据类型、集合数据类型、UDT(User-defined-Type)

DDL/DML/ACL包含:DDL: CREATE/DROPDML:SELECT/UPDATE/DELET/INSERTACL:ROLE/USER/PASSWORD/…。

INDEX/MV/UDF/IDA包含:Secondary index/SaSI IndexMaterialized ViewUDF/UDA

 

CQL几个概念


5.png


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


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


6.png


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


7.png


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


8.png


Collecion Type是一个集合数据类型,其中map, set,list,是别的数据库里面不常见的,但是是日常用的比较多的类型,Collecion Type可以基于自己的业务场景去操作的。


UDTUser Defined Type就是组合了多种类型成包括成一种新的类型,并支持:CREATE /ALTER /DROP语法。


CQL DDL


DDL的一些使用的方式CREATE KEYSPACEUSE KEYSPACE ALTER KEYSPACEDROP KEYSPACE DESCRIBE KEYSPACECREATE TABLE ALTER TABLE DROP TABLE DESCRIBE TABLE TRUNCATE 建表,键值空间、修改表、修改键值空间、删除表、删除键值空间、还有清空表。


定义KEYSPACE实际上会定义两个东西,第一个Replication,下面会有两个子项目,一个是classclass也分两种,一种是Simple strategyNetworkTopologyStrategy ,主要定义了的副本的摆放策略,就是在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概念,后面可以跟上DC2DC3DC4以及在各个DC下面的一个摆放的副本因子。


CQLDDLTable,在创建一个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的类型是textCK类型是textregularcn类型也是text

定义的主键是由PKCK组成的,这里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


1SELECT

• 支持获取指定列以及通配符操作;

• 支持LIMIT/PARTITION LIMIT/ ORDE BY /GOUP BY ;

• 支持native function 处理操作: countmaxminsumavg

• 支持JSON

• 其他多数丰富操作;


举例


11.png


如图所示SELECT*from这个表,包括countlimit some select等数据,大概是一些对应的操作以及select执行 select数据,以Jason的方式输出,这里都有对应的一些例子可以做参考。


2INSERT

• 支持常规写数据,primary key 必须指定数据

• 支持写入JSON数据;

• 支持cell 以及row TTL

• 保证线性一致性:IF NOT EXIST


3、UPDATE

• 需要指定primary key,主键列必须要指定

• 如果数据存在就更新,不存在则写入


4DELETE

• 支持行、列级别删除


举例


12.png


如图所示 UPDATE对应的数据列或者行数据,使用了一个TTLUPDATE ks. Tb USING TTL SET age= 20 WHERE name,这个nameprimary key;


对应的delete这一行数据,把WHERE name = xl行数据全删掉。


5BATCH

• 语法: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去登录,登录时创建了一个ROLECREATE ROLE JACK可以 log in,然后passwordsuper user,这是CREATE ROLE的语法里面需要定义的一些操作,第二次以jack用户去 log in的时候,执行了LISE ROLES ,可以看到CassandraJack两个用户对应的permission,执行了一些grantrevoke操作,通可以通过grantrevoke去操作,让 Jack对某个KEYSPACEselect的操作,对 Jack可以决定是否有效。


CQL INDEX

INDEX : Secondary Index/ SASI / Materialized View


1Secondary Index

Local Index,索引表数据和数据表数据共存;适用于基数适中的数据表列;

• 可以指定索引名,若不指定则自动生成;

Counter列不支持二级索引;

• 频繁删除以及update的列不推荐使用;

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


举例


15.png


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


2SASI : Sstable Attached Secondary Index

Local Index的一种,支持较多索引模式:prefixcontainssparse,支持轻搜索功能;

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

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

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

• 不支持collection类型;

• 实验功能,不推荐生产使用;


例一


16.png


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


例二

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


3Materialized View

• 全局索引表,数据基于数据表构建;

• 适用于数据表基数较高的数据列;

• 需要指定新的primary key


举例


16.png


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

目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
TiDB支持的SQL语法概述
【2月更文挑战第28天】本章将对TiDB所支持的SQL语法进行概述,涵盖其主要的语法特性和功能。我们将从基本的SQL语句到更复杂的查询和操作,逐步介绍TiDB的SQL语法,帮助读者更好地理解和使用TiDB进行数据库操作。
|
关系型数据库 Java MySQL
clickhouse的常用语法你知道吗
clickhouse数据库,总结了一些常用的语法
280 0
clickhouse的常用语法你知道吗
|
2月前
|
SQL 关系型数据库 MySQL
TiDB特有的SQL语法和特性
【2月更文挑战第28天】本章将深入探讨TiDB特有的SQL语法和特性,这些功能和优化是TiDB相较于传统关系型数据库所独有的。通过了解这些特性,读者将能更充分地利用TiDB的优势,优化数据库性能,提升业务处理效率。
|
2月前
|
SQL 关系型数据库 MySQL
Flink 提供了一种名为 Flink SQL 的查询语言,它支持多种数据库之间的 DDL 语句转换
【2月更文挑战第18天】Flink 提供了一种名为 Flink SQL 的查询语言,它支持多种数据库之间的 DDL 语句转换
174 2
|
5月前
|
SQL 存储 关系型数据库
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
118 0
|
5月前
|
Oracle 关系型数据库 MySQL
oceanbase在MySQL语法兼容模式下,在授权语法、行为方面 是否与 开源MySQL完全一致 ?
oceanbase在MySQL语法兼容模式下,在授权语法、行为方面 是否与 开源MySQL完全一致 ?
107 2
|
存储 SQL 监控
16PostgreSQL 本地分区表的用法和优化|学习笔记
快速学习16PostgreSQL 本地分区表的用法和优化
788 0
16PostgreSQL 本地分区表的用法和优化|学习笔记
|
NoSQL
|
关系型数据库 Java MySQL
clickhouse的几个进阶语法
包含如何实现分时统计,如何实现聚合某一列,如何更新操作
415 0
clickhouse的几个进阶语法