Cassandra 概述
Cassandra 是一个高度可扩展的分布式 NoSQL 数据库,专为处理海量数据和高并发场景设计。其核心特点包括:
-
弹性可扩展性
支持动态添加节点,通过水平扩展适应数据增长需求,满足大规模应用场景。 -
无单点故障架构
采用去中心化设计(P2P 架构),确保关键业务连续可用。 -
高性能读写
优化写入性能,在廉价硬件上支持数百 TB 数据存储,同时保持高效读取。
例如配置参数:concurrent_reads: 256 # 并发读取线程数 concurrent_writes: 192 # 并发写入线程数 -
灵活数据模型
支持结构化/半结构化/非结构化数据,动态适应数据结构变化。 -
跨数据中心复制
通过多数据中心数据复制实现灵活分发和容灾。
核心机制
1. Gossip 协议
- 节点每秒与至多 3 个邻居交换状态信息(含版本号)
- 新旧数据通过版本号自动覆盖,实现集群状态快速同步
- 种子节点(seed)仅用于引导新节点加入,非单点故障
2. 数据分布
- 分区策略:通过一致性哈希将数据分布到环状拓扑
- 复制策略:支持
SimpleStrategy(单数据中心)和NetworkTopologyStrategy(多数据中心)
典型应用场景
-
写入密集型场景
- 日志存储(如应用日志、审计日志)
- 时序数据(如物联网传感器数据)
CREATE TABLE sensor_data ( sensor_id UUID, timestamp TIMESTAMP, value FLOAT, PRIMARY KEY (sensor_id, timestamp) ) WITH CLUSTERING ORDER BY (timestamp DESC); -
主键查询场景
- 用户行为跟踪(通过用户 ID 快速检索)
- 实时分析(如广告点击流)
-
低更新频率场景
- 历史数据归档
- 只读型数据仓库
安装与配置
1. 环境准备
- JDK 8+(必需依赖)
- 下载地址:Apache Cassandra 3.9
- 解压命令:
tar -zxvf apache-cassandra-3.9-bin.tar.gz -C /usr/local/cassandra
2. 关键配置 (conf/cassandra.yaml)
cluster_name: MyCluster
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.1.10" # 种子节点IP
data_file_directories:
- /var/lib/cassandra/data # 数据存储路径
listen_address: node1_ip # 当前节点IP
rpc_address: 0.0.0.0 # 客户端连接地址
3. 启动服务
bin/cassandra -f # 前台启动(调试模式)
性能优化建议
- 内存配置
heap_newsize: 800M max_heap_size: 4096M - 并发控制
native_transport_max_threads: 4096 # 最大客户端线程数 - 压缩策略
compression: sstable_compression: LZ4Compressor
思维导图

Cassandra 核心原理详解
1. 分布式架构
Cassandra 采用完全去中心化的 P2P 架构,所有节点地位平等(对等节点)。通过一致性哈希算法将数据分区存储在环状拓扑中,每个节点负责特定范围的 token 值。数据自动分区公式:
Token
=
Partitioner
(
Partition Key
)
m
o
d
2
127
\text{Token} = \text{Partitioner}( \text{Partition Key} ) \mod 2^{127}
Token=Partitioner(Partition Key)mod2127
例如使用 Murmur3Partitioner 时,分区键 “user123” 的 token 计算为:
long token = Murmur3Partitioner.instance.getToken(ByteBuffer.wrap("user123".getBytes())).getTokenValue();
2. 数据复制机制
通过副本因子(Replication Factor)实现高可用性:
- 简单策略:
SimpleStrategy(单数据中心) - 网络拓扑策略:
NetworkTopologyStrategy(多数据中心)
CREATE KEYSPACE my_keyspace
WITH REPLICATION = {
'class': 'NetworkTopologyStrategy',
'DC1': 3, // 数据中心1复制3份
'DC2': 2 // 数据中心2复制2份
};
3. 一致性模型
提供可调节的一致性级别(Tunable Consistency):
- 写一致性:
ANY|ONE|QUORUM|ALL - 读一致性:
ONE|QUORUM|ALL
满足公式:
R + W > N ( 强一致性保证 ) R + W > N \quad (\text{强一致性保证}) R+W>N(强一致性保证)
其中 R R R=读副本数, W W W=写副本数, N N N=副本因子
4. 写路径优化
- 写入提交日志(CommitLog)确保持久性
- 写入内存表(Memtable)
- Memtable 满后刷盘为 SSTable
- 后台压缩合并 SSTable
// 源码片段:写操作入口(StorageProxy.java)
public static void mutate(Collection<Mutation> mutations, ConsistencyLevel consistency_level) {
// 确定协调节点
// 发送写请求到副本节点
// 等待满足一致性级别
}
Cassandra 源码结构介绍
主要源码模块(基于 3.x 版本):
src/
├── java/org/apache/cassandra/
│ ├── config/ # 配置管理(YAML/属性文件)
│ ├── db/ # 核心存储引擎(Memtable/SSTable)
│ ├── dht/ # 分布式哈希表(分区器实现)
│ ├── gms/ # Gossip协议实现
│ ├── locator/ # 副本放置策略
│ ├── net/ # 节点通信(MessagingService)
│ ├── service/ # 存储服务(StorageService)
│ ├── utils/ # 工具类(BloomFilter等)
│ └── cql3/ # CQL解析与执行
主要组件及其功能
1. 存储引擎(Storage Engine)
- Memtable:内存中的写缓存,使用跳表(SkipList)实现
- SSTable:不可变的磁盘存储文件
- CommitLog:崩溃恢复的预写日志
// Memtable 写入示例(Memtable.java)
public void put(PartitionUpdate update) {
ColumnFamily cfa = get(update);
if (cfa == null)
cfa = create(update);
cfa.addAll(update);
}
2. Gossip 协议
节点间状态同步协议:
- 每 1 秒选择 1-3 个节点通信
- 交换版本化状态信息(心跳、负载等)
- 基于版本号解决冲突
// Gossiper.java 核心循环
while (!shutdown) {
// 选择目标节点
List<GossipPartner> partners = selectPartner();
// 交换状态信息
for (GossipPartner partner : partners) {
sendGossip(partner.endpoint, state);
}
Thread.sleep(interval);
}
3. 压缩组件(Compaction)
合并 SSTable 减少读取放大:
- SizeTieredCompactionStrategy (STCS)
- LeveledCompactionStrategy (LCS)
// CompactionManager.java
public void submitBackground(ColumnFamilyStore cfs) {
if (!cfs.isCompactionDisabled())
executor.submit(new BackgroundCompaction(cfs));
}
4. CQL 引擎
将 CQL 查询转换为存储操作:
SELECT * FROM users WHERE id = '123'
→ 转换为分区键 token 计算
→ 定位数据节点
Cassandra 特点分析
优势
- 线性可扩展性
添加节点时数据自动重分布(nodetool rebuild) - 高写入吞吐
优化写入路径(顺序写 + 内存表) - 多数据中心支持
跨 DC 数据同步配置:# cassandra.yaml endpoint_snitch: GossipingPropertyFileSnitch
局限性
- 最终一致性
需要权衡一致性级别与延迟 - 不支持复杂事务
仅提供轻量级事务(Compare and Set) - 反范式设计
需根据查询模式设计数据模型
相关代码示例
1. 数据模型设计
-- 时间序列数据建模
CREATE TABLE sensor_readings (
sensor_id uuid,
bucket int, -- 时间桶(按天分区)
timestamp timestamp,
value float,
PRIMARY KEY ((sensor_id, bucket), timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);
2. Java 驱动操作
Cluster cluster = Cluster.builder()
.addContactPoint("node1_ip")
.withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.QUORUM))
.build();
Session session = cluster.connect("my_keyspace");
// 插入数据
PreparedStatement ps = session.prepare(
"INSERT INTO users (id, name, email) VALUES (?, ?, ?)");
BoundStatement bs = ps.bind(UUID.randomUUID(), "Alice", "alice@example.com");
session.execute(bs);
3. 批量写入优化
BatchStatement batch = new BatchStatement();
for (int i = 0; i < 100; i++) {
batch.add(ps.bind(...));
}
session.execute(batch); // 单次RPC发送批量操作
4. SSTable 工具使用
# 查看SSTable元数据
sstablemetadata /var/lib/cassandra/data/keyspace/table-xxx/sstable-file
# 导出SSTable数据
sstabledump /path/to/sstable
思维导图

Cassandra分布式数据库核心原理与应用
1187

被折叠的 条评论
为什么被折叠?



