Cassandra安装与使用
什么是 Cassandra ?
Apache Cassandra 是一个开源的分布式 NoSQL(Not Only SQL)数据库管理系统,专为处理大规模数据量和高写入频率的工作负载而设计。它最初由 Facebook 开发,后来贡献给了 Apache 软件基金会,成为了 Apache 的一个顶级项目。
Cassandra 结合了 Google Bigtable 的数据模型和 Amazon Dynamo 的完全分布式架构,提供了以下关键特性:
高可用性:Cassandra 是一个无单点故障的系统,它通过数据复制和一致性级别选择,确保即使在节点失败的情况下数据仍然可访问。
水平可扩展性:Cassandra 能够通过添加更多节点到集群中轻松扩展,无需停机,这使得它能够处理不断增长的数据量和用户负载。
分布式数据存储:数据在集群中的多个节点上分布存储,每个节点都是平等的,没有主从之分,这有助于提高性能和可靠性。
最终一致性:Cassandra 允许开发者选择数据的一致性和可用性之间的权衡,通过可配置的一致性级别,可以在强一致性和高可用性之间找到合适的平衡点。
数据模型:Cassandra 使用列族(column-family)的数据模型,允许以宽列的方式存储数据,非常适合存储半结构化或非结构化数据。
数据压缩和索引:Cassandra 支持数据压缩和创建二级索引,以提高存储效率和查询性能。
多数据中心复制:Cassandra 支持跨多个地理区域的数据中心复制,以实现数据的地理分布和灾难恢复。
Cassandra 被广泛应用于需要处理大量数据和高写入负载的场景,例如社交网络、物联网(IoT)、实时数据分析和推荐系统等。由于其强大的可扩展性和高可用性,Cassandra 成为了许多大型企业如 Netflix、Digg、Twitter 等的选择。
Cassandra安装
拉取镜像
执行如下命令,开始拉取 cassandra 最新的镜像。
docker pull cassandra:latest
拉取成功后,可执行 docker images 命令查看本地已下载的镜像,确认一下 cassandra 是否下载成功。
准备挂载的文件夹
在 E:/docker 路径下,创建一个 /cassandra 文件夹,用于等会启动容器时,将需要持久化的数据挂载到宿主机中,防止容器重启时数据丢失。
运行容器
前置工作完成后,执行如下命令,运行一个 cassandra 容器:
docker run --name cassandra -d -p 9042:9042 -v E:\docker\cassandra\data:/var/lib/cassandra cassandra:latest
各参数含义:
docker run: 这是 Docker 用来启动一个新的容器的命令。--name cassandra: 这个选项指定了容器的名称为 “cassandra”。给容器命名可以帮助你在将来更容易地识别和管理它。-d: 这个标志表示在后台(守护进程模式)运行容器,不会阻塞你的终端会话。-p 9042:9042: 这个选项进行了端口映射,将宿主机的 9042 端口映射到容器内的 9042 端口。这意味着你可以在宿主机上通过 9042 端口访问 Cassandra 容器提供的服务。Cassandra 默认使用 9042 端口作为 CQL shell 的接入点。-v E:\docker\cassandra\data:/var/lib/cassandra: 这是一个卷(volume)映射,将宿主机上的目录E:\docker\cassandra\data挂载到容器内的/var/lib/cassandra目录。这个目录是 Cassandra 用来存储数据和日志的地方。通过这种方式,即使容器被删除,数据也会保留在宿主机上,因为数据存储在持久化的卷中。cassandra:latest: 这指定了要使用的 Docker 镜像。在这里,镜像是 Cassandra 的官方镜像,并且使用了 latest 标签,意味着拉取 Cassandra 的最新版本镜像。
执行完毕后,执行 docker ps 命令,可查看本地正在运行中的 Docker 容器,确认一下 cassandra 是否启动成功了。

Cassandra使用
- 打开cqlsh命令行
cassandra 容器运行成功后,执行如下命令,可进入到容器中:
docker exec -it cassandra /bin/sh
接着,执行如下命令,可打开 cqlsh 命令行工具:
1 | |
什么是 cqlsh ?
cqlsh 是 Cassandra Query Language Shell 的缩写,它是一个命令行工具,允许你向 Cassandra 数据库发送查询、创建表、插入数据、检索数据等。
若如下图所示,提示 Connected to Test Cluster at 127.0.0.1:9042 , 则说明已经成功连接上了 cassandra。

CQL基本命令
Cassandra 基本概念
在学习 CQL 命令之前,先理解一下 Cassandra 中几个基本概念:
节点(Node):Cassandra 集群中的每个服务器称为一个节点。每个节点都存储数据,并且相互之间没有主从关系,所有节点都是对等的。
集群(Cluster):由多个节点组成的分布式系统称为集群。集群中的节点共同工作,处理读写请求并存储数据。
数据中心(Data Center):集群中的节点可以分布在多个数据中心,每个数据中心包含若干个节点。数据中心的划分有助于实现跨地域的高可用性。
键空间(Keyspace):键空间是一个逻辑容器,用于管理多个表,可以理解为 MySQL 中的库。另外,键空间定义了数据复制的策略。
表(Table):表是数据存储的基本单位,由行和列组成。每张表都有一个唯一的名称和定义。主键(Primary Key):每行数据都有一个唯一的主键。主键由分区键和可选的列组成,用于唯一标识数据行。
分区键(Partition Key):Cassandra 使用分区键的哈希值将数据分布到不同的节点上,从而实现负载均衡和数据的水平扩展。分区键可以是单个列或多列的组合(复合分区键)。
- 键空间(Keyspace)
打开 cqlsh 命令行,执行下面语句,来创建一个 Keyspace。
1 | |
CREATE KEYSPACE IF NOT EXISTS: 这是创建 keyspace 的命令,IF NOT EXISTS是一个条件语句,确保只有当 keyspace 还未创建时才执行创建操作。这样可以防止重复创建 keyspace 导致的错误。test: 这是即将创建的 keyspace 的名称。keyspace 类似于传统关系型数据库中的“数据库”,是 Cassandra 中数据的最高层级容器。WITH replication: 这里指定了 keyspace 的复制策略和配置。复制策略决定了数据如何在集群中复制和分布。'class': 'SimpleStrategy': 这里指定了复制策略的类型为SimpleStrategy。SimpleStrategy是一种基本的复制策略,适用于单数据中心的部署。它将数据均匀地分布到集群中的节点上。'replication_factor': 1: 这是复制因子,表示每个数据分区的副本数量。在这个例子中,replication_factor设置为 1,意味着每个数据分区只有一个副本,这通常用于测试或开发环境,但在生产环境中可能不是最佳实践,因为缺乏冗余会导致数据丢失的风险增加。
- 键空间创建完成后,执行如下命令,可查看所有的
Keyspace。
DESCRIBE KEYSPACES;

- 如果想删除某个键空间,以及其中的所有数据,可执行如下语句。
DROP KEYSPACE IF EXISTS test;
- 键空间创建完成后,可通过 USE 命令,选择该 Keyspace ,以便后续操作它。
USE test;
- 执行如下语句,创建一张
note_content笔记内容表。这里注意,由于我们是拿 Cassandra 充当 K-V 键值存储数据库,所以表中只包含两个字段(实际可以支持多字段),id主键充当Key, 笔记内容content充当Value:
1 | |
CREATE TABLE: 这是 Cassandra 中创建新表的命令。note_content: 表的名称。(和):这些括号包含了表的列定义和主键定义。id UUID PRIMARY KEY: 这里定义了表中的一个列id,其数据类型是UUID(通用唯一标识符)。PRIMARY KEY指示 id 列是表的主键。在 Cassandra 中,主键用于唯一标识表中的每一行,同时也是数据在集群中分区的依据。content TEXT: 这里定义了另一个列 content,其数据类型是 TEXT。TEXT 类型用于存储文本字符串。
为什么这里要用 UUID? 而不是笔记本身的 ID?
UUID 生成的值具有较高的随机性,因此在集群中可以提供良好的数据分布,避免热点问题。

- 执行如下语句,查询
note_content表中所有数据。
SELECT * FROM note_content;

- 笔记内容表创建完成后,执行如下语句,插入一条数据。
INSERT INTO note_content (id, content) VALUES (uuid(), '这是一条测试笔记');
- 执行如下语句,以 id 为条件来更新对应笔记内容。
UPDATE note_content SET content = '更新后的评论内容' WHERE id = 7e1c4af6-9b12-4f89-a5d1-0e05f8a627c7;

- 执行如下语句,将 id 为 7e1c4af6-9b12-4f89-a5d1-0e05f8a627c7 的记录删除掉。
DELETE FROM note_content WHERE id = 7e1c4af6-9b12-4f89-a5d1-0e05f8a627c7;
