1. Cassandra 简介
Apache Cassandra 是一个开源的 分布式 NoSQL 数据库,设计用于处理大规模数据,具有高可用性、线性可扩展性和无单点故障的特点。它最初由 Facebook 开发,后成为 Apache 顶级项目。
核心特点
- 分布式架构:数据自动分片(partitioning)和复制(replication)。
- 高可用性:无单点故障,支持多数据中心部署。
- 线性可扩展:可通过增加节点提升吞吐量和存储容量。
- 最终一致性 & 可调一致性:支持
QUORUM
、ONE
、ALL
等一致性级别。 - 灵活的数据模型:基于列族(Column Family)的宽列存储(Wide-Column Store)。
- 高性能写入:LSM 树(Log-Structured Merge-Tree)存储引擎,适合高写入负载。
2. Cassandra 数据模型
Cassandra 的数据模型不同于传统关系型数据库,它采用 键值 + 列族(Column Family) 的方式存储数据。
核心概念
概念 | 说明 |
---|---|
Keyspace | 类似关系数据库的 “database”,定义数据复制策略和一致性级别。 |
Table (Column Family) | 存储数据的表,由 Partition Key 和 Clustering Columns 组织。 |
Partition Key | 决定数据在集群中的分布(分区),相同 Partition Key 的数据存储在同一个节点。 |
Clustering Columns | 决定数据在分区内的排序(如时间戳)。 |
Primary Key | 由 Partition Key + Clustering Columns 组成,唯一标识一行。 |
示例:创建 Keyspace 和 Table
-- 创建 Keyspace,设置复制策略
CREATE KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
};
-- 创建表,定义主键(user_id 是 Partition Key, created_at 是 Clustering Column)
CREATE TABLE my_keyspace.users (
user_id UUID,
name TEXT,
email TEXT,
created_at TIMESTAMP,
PRIMARY KEY (user_id, created_at)
) WITH CLUSTERING ORDER BY (created_at DESC);
3. Cassandra 架构
3.1 分布式设计
- Peer-to-Peer 架构:无主节点,所有节点平等(避免单点故障)。
- Gossip 协议:节点间通信,交换状态信息。
- 一致性哈希:数据分布到不同节点,避免热点问题。
3.2 数据复制
- Replication Factor (RF):副本数量(如
RF=3
表示数据存 3 份)。 - Replication Strategy:
SimpleStrategy
:单数据中心复制(适合测试)。NetworkTopologyStrategy
:多数据中心复制(生产推荐)。
3.3 写入与读取流程
写入流程
- 客户端向任意节点(Coordinator)发送写入请求。
- Coordinator 根据
Partition Key
计算目标节点。 - 数据写入目标节点的 MemTable(内存)和 CommitLog(持久化日志)。
- MemTable 满后刷入 SSTable(磁盘存储)。
读取流程
- 客户端向 Coordinator 发送查询请求。
- Coordinator 根据一致性级别(如
QUORUM
)从多个副本读取数据。 - 合并多个副本的数据,返回最新版本(基于时间戳)。
4. Cassandra 查询语言(CQL)
CQL(Cassandra Query Language)类似 SQL,但不支持 JOIN 和复杂事务。
常见操作
-- 插入数据
INSERT INTO my_keyspace.users (user_id, name, email, created_at)
VALUES (uuid(), 'Alice', 'alice@example.com', toTimestamp(now()));
-- 查询数据(必须指定 Partition Key)
SELECT * FROM my_keyspace.users WHERE user_id = ?;
-- 范围查询(需 Clustering Column)
SELECT * FROM my_keyspace.users
WHERE user_id = ? AND created_at > '2023-01-01';
-- 更新数据(需指定 Primary Key)
UPDATE my_keyspace.users SET email = 'new@example.com'
WHERE user_id = ? AND created_at = ?;
-- 删除数据
DELETE FROM my_keyspace.users
WHERE user_id = ? AND created_at = ?;
限制
- 不支持 JOIN:需反规范化(Denormalization)或应用层处理。
- 不支持复杂事务:仅支持单行原子操作。
- 二级索引有限:适合低基数数据,高基数查询用 Materialized View 或自定义索引。
5. Cassandra 一致性级别
Cassandra 允许在读写时指定一致性级别(Consistency Level):
级别 | 说明 |
---|---|
ONE | 只需 1 个副本确认 |
QUORUM | 多数副本确认(RF=3 时需 2 个) |
ALL | 所有副本确认(强一致,但高延迟) |
LOCAL_QUORUM | 本地数据中心的多数副本确认 |
示例:设置一致性级别
-- 设置写入一致性
CONSISTENCY QUORUM;
-- 查询时指定一致性
SELECT * FROM users WHERE user_id = ? USING CONSISTENCY ONE;
6. Cassandra 适用场景
适合场景
✅ 高写入负载(如日志、IoT 数据)
✅ 低延迟读取(如用户画像、实时分析)
✅ 全球分布式部署(多数据中心支持)
✅ 高可用需求(无单点故障)
不适合场景
❌ 复杂事务(如银行交易)
❌ 多表 JOIN 查询
❌ 强一致性要求极高的场景(如金融核心系统)
7. Cassandra vs. 其他数据库
特性 | Cassandra | MongoDB | HBase | DynamoDB |
---|---|---|---|---|
数据模型 | 宽列存储 | 文档存储 | 宽列存储 | 键值 + 文档 |
一致性 | 可调一致性 | 可调 | 强一致 | 可调 |
扩展性 | 线性扩展 | 分片集群 | 依赖 HDFS | 自动扩展 |
适用场景 | 高写入、分布式 | 灵活查询 | Hadoop 生态 | AWS 云服务 |
8. 总结
- Cassandra 是分布式、高可用的 NoSQL 数据库,适合海量数据和高写入场景。
- 数据模型基于 Partition Key + Clustering Columns,查询需考虑分区策略。
- 可调一致性 允许在可用性和一致性之间权衡。
- 适用场景:IoT、日志分析、实时推荐、消息存储等。
学习资源
- 官方文档:https://cassandra.apache.org/
- 《Cassandra: The Definitive Guide》(O’Reilly)
如果有具体使用场景或问题,可以进一步探讨! 🚀