Cassandra是一种非关系型(NoSQL)开源大规模分布式数据库,具有水平可扩展性、分布式架构及表结构灵活定义等突出特性。
具体而言,其特性表现在以下几方面:
-
弹性可扩展性与写入效率:Cassandra设计本身是线性可扩展性的,通过增加集群中的节点数量增加你的吞吐量,从而保持快速响应,这也意味着通过添加更多的硬件就可以适应更多的客户和更多的数据存储要求;Cassandra被设计为在相对廉价的硬件体系上运行,支持快速写入与存储数百TB的数据而不牺牲读取效率。
-
数据存储灵活性:可以适应各种可能的数据格式,包括存储结构化、半结构化及非结构化等多种类型海量数据。
-
便捷的数据分发:其分布式架构支持多个数据中心之间的数据复制,灵活地在需要时进行数据分发。
-
基于架构的高可靠性:Cassandra具有自成体系(不依赖外部组件)的相对轻量级的架构设计,集群设计上各节点之间采用对等分布式系统,而且数据分布在集群中的所有节点之间(对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取),整体上无中心节点,无单点故障,从而有效支持业务连续性要求极高的关键业务应用系统,可以进行不停服升级及多地域容灾。
Cassandra发端于Facebook, 并于2008年7月开源,2009年3月被纳入Apache组织孵化器(Incubator),2010年2月便提升为Apache的一个顶级项目,并逐渐演化和丰富,目前的主要发布的在支持版本如下:
| 版本号 | 发布日期 |
| 4.0.1 | 2021-09-07 |
| 3.11.11 | 2021-07-28 |
Cassandra一直位列全球数据库排行榜列存储(Wide Column stores)数据库榜首的位置(HBase紧随其后),在数据库综合排名中也名列前茅((如下图2022年1月排名)。
Cassandra已广泛应用于各行业领先公司的业务系统中,如国外的Netflix,Hulu,Instagram,eBay,Apple和Spotify,国内阿里淘宝、京东、华为、奇虎360等,也都在大规模使用Cassandra,中国气象局MICAPS4军民融合项目中的后端数据存储服务器也就是使用Cassandra存储数据的。
2. Cassandra技术特性 2.1 架构要素如前所述,Apache Cassandra是一种开源的分布式NoSQL数据库,它呈现的是一种分区宽列及最终一致性(Eventual Consistency )的存储模式。
从底层上,Facebook设计时采用了SEDA(staged event-driven architecture)架构,结合了Amazon Dynamo的分布式存储与复制分发(replica)技术及Google Bigtable的数据存储引擎模式,具有一定的后发优势。
Cassandra设计目标主要概括如下:
-
完全的多主数据库复制 Full multi-master database replication
-
低延迟全局可用性 Global availability at low latency
-
基于常用硬件的可扩展性 Scaling out on commidity hardware
-
吞吐量随着节点数量增加线性增长 Linear throughput increase with each additional processor
-
在线负载均衡与集群扩展 Online load balancing and cluster growth
-
分区的面向键值的查询 Partitioned key-oriented queries
-
灵活的库表结构 Flexible schema
作为一种NoSQL类型的数据库,Cassandra提供了类似SQL的语言CQL(Cassandra Query Languag), 进行数据库表的相关操作。Cassnadra核心概念有以下几个:
-
键空间 Keyspace
键空间类似传统数据库的概念,它包含多个表Table。它会定义大数据集在每个数据中心是如何复制replicated的(即每个集群复制多少份)。
-
表 Table
Cassandra的表定义了分区集合的结构类型,表包含一系列分区,分区又包含了行与列。 Cassandra允许不停机状态下灵活地向表中添加新的列。
-
分区 Partition
Cassandra分区由分区键所标识,分区键是所有行主键的必备部分,以标识该行在集群中所存储的节点,同一分区键的数据都会被Cassandra存储在同一节点上。 所有高性能查询都可通过分区键来进行。
-
行 Row
与关系数据库类似,每行有多列组成,行由唯一主键Primary Key所标识定义,该主键包含分区键Partition Key及可选的聚簇键Clustering Key(Cassandra中Clustering Key决定了分区内数据的排序)。
-
列 Column
与传统数据库相类,是归属于各行的不同类型的数据单元。
Cassandra提供与SQL类似的查询语言CQL(Cassandra Query Language), 支持一系列对分区数据集的高级特性 ,主要包括:
-
轻量级事务支持
-
用户定义的数据类型、函数和聚合(aggregates)
-
集合类型支持(集合、映射和列表 sets, maps, lists)
-
本地2级索引
-
物化视图Materialized View (实验完善中)
Cassandra 明确选择不实现需要跨分区协调的操作,以提升效率及全局高可用性。例如,Cassandra不支持以下操作:
-
跨分区事务
-
分布式join
-
外键或者引用完整性(一译参照完整性,referential integrity)
Cassandra的默认配置文件是cassandra.yaml, 其中有近400个各类参数(4.0.1版本合计378个),用于对Cassandra进行调节管理,其中一些参数及时生效,一些参数需要重启方能生效。
Cassandra可通过nodetool进行集群管理并在运行时调节cassandra.yaml中的很多参数设置。nodetool的命令格式为:
nodetool [(-h
nodetool详细命令可以参见:
Untitled | Apache Cassandra Documentation
共计约140个左右,相当丰富。
常见的如:
nodetool help 列出所有支持的命令选项及简要说明
nodetool help
nodetool status 列示cassandra集群节点、负载状态等信息
nodetool info 列出节点的uptime、load等信息
nodetool clientstats 列出客户端链接情况
Cassandra 4.0提供了另外两个命令行工具。 auditlogviewer 用于查看审计日志,fqltool 用于查看、回放和比较完整的查询日志。
此外,Cassandra 支持开箱即用的原子快照功能atomic snapshot,该功能提供 Cassandra 数据的即时快照,以便与许多备份工具轻松集成,它 还支持增量备份,其中数据可以在写入时进行备份。 这些配置均可以在cassandra.yaml中进行调整设定。
2.2.2 数据库表管理交互如前所述,cqlsh作为cassandra数据库表管理的命令行工具,可以进行各种数据库表的操作。 cqlsh实际上是一个python程序,需要python 2.7或python 3.6版本以上环境的支持。
Cassandra商业化公司DataStax对cqlsh进行了较为详尽的介绍,可以进一步参考:
cqlsh commands
下面将对cqlsh的常见用法进行简要介绍。
cqlsh启动的命令行如下:
cqlsh [options] [host [port]]
options的选项如下:
| 选项 | 说明 |
| -C 或 --color | 彩色方式输出 |
| --nocolor | 禁止彩色方式输出 |
| --browser | 采用哪种浏览器展示cqlsh帮助文件,支持多种类型的浏览器,常见的浏览器名称包括: firefox, chrome, opera, Windows-Default, safari等, 具体可参见:(20.1. webbrowser — Convenient Web-browser controller — Python 2.7.18 documentation 或 webbrowser — Convenient web-browser controller — Python 3.10.4 documentation) 或者浏览器执行文件路径名+‘ s%' ,例如:/usr/bin/google-chrome-stable %s |
| --ssl | 通过SSL连接cassandra |
| -u 或 --user -p 或 --password | 连接采用的用户名和密码鉴权 |
| -k 或 --keyspace | 授权访问的keyspace, 如与用户授权相关,需与-u一起使用 |
| -f 或 --file | 执行文件中的cql命令并退出 |
| --debug | 输出更多的调试信息 |
| --encoding | 输出信息的编码格式(默认是utf-8格式) |
| --cqlshrc | cqlsh资源文件cqlshrc的位置 (默认是 ~.cassandra/cqlshrc) |
| -e 或 --execute | 执行相应的cql语句并退出 |
| --connect-timeout | 连接超时秒数(默认2秒) |
| --request-timeout | 执行语句请求超时秒数(默认10秒) |
| --python | 指定所采用的python全路径名(当系统中安装多个python版本时尤其有用,可以替代系统默认版本号) |
cqlsh通过CQL语句可以进行数据库表的各种DDL、DML操作,CQL相关事项,可以参见官方文档,暂不作进一步展开:
The Cassandra Query Language (CQL) | Apache Cassandra Documentation
cqlsh除了支持CQL语句外,同时支持其它一些数据库运行相关的一些特性,主要包括:
| 操作命令 | 说明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CONSISTENCY | 用于设置后续数据库运行的一致性级别,用于平衡Cassandra分布式运行的可用性及准确性,可以对读写分别设置,具体包括: ANY、ONE、TWO、THREE、QUORUM、EACH_QUORUM、ALL、LOCAL_QUORUM、LOCAL_ONE、SERIAL、LOCAL_SERIAL、SERIAL CONSISTEN等。 具体是指确认一个读写操作所成功完成所需要的最少节点数。 具体细节及控制粒度可参见: How is the consistency level configured? 其中对读写控制级别有非常详细的介绍,控制相当灵活及细粒度。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SERIAL CONSISTENCY | 该类级别包括: SERIAL、LOCAL_SERIAL。 主要用于读操作时,如果有更新操作在进行,可以作为预commit的记录来读取。 LOCAL_SERIAL则限于单个数据中心。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SHOW VERSION | 显示cqsh、Cassandra、CSQL规范及native protocol本地协议的版本号 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SHOW HOST | 显示csqlsh链接的节点IP地址和端口号 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SHOW SESSION | 显示特定session会话信息 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SOURCE | 从文件中读取并执行每行的cql语句及csqlsh支持的语句,如: cqlsh> SOURCE '/home/calvinhobbs/commands.cql' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CAPTURE | 将执行的操作结果输出到指定文件中(不回显),如: CAPTURE ' CAPTURE OFF; CAPTURE; 其中CAPTURE表示目前CAPTURE的设置状态。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| HELP HELP | 显示cqlsh相关的命令信息帮助 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PAGING | 便于设置分页查询。对于查询大量记录时尤为有用。 PAGING ON; PAGING OFF; PAGING | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| EXPAND | 将查询输出的行以垂直列元素形式显示(即横向显示转为纵向显示),对于列数较多或者单列内容较长时,都非常有用。 EXPAND ON EXPAND OFF | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| LOGIN | 当前会话切换到另外一个用户 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DESCRIBE 或 DESC | 获取Cassandra集群、数据库表等相关的概要信息。主要包括: DESCRIBE CLUSTER DESCRIBE SCHEMA DESCRIBE KEYSPACES DESCRIBE KEYSPACE DESCRIBE TABLES DESCRIBE TABLE
|



