Cassandra分布式数据库

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

Cassandra 概述

Cassandra 是一个高度可扩展的分布式 NoSQL 数据库,专为处理海量数据和高并发场景设计。其核心特点包括:

  1. 弹性可扩展性
    支持动态添加节点,通过水平扩展适应数据增长需求,满足大规模应用场景。

  2. 无单点故障架构
    采用去中心化设计(P2P 架构),确保关键业务连续可用。

  3. 高性能读写
    优化写入性能,在廉价硬件上支持数百 TB 数据存储,同时保持高效读取。
    例如配置参数:

    concurrent_reads: 256     # 并发读取线程数
    concurrent_writes: 192    # 并发写入线程数
    
  4. 灵活数据模型
    支持结构化/半结构化/非结构化数据,动态适应数据结构变化。

  5. 跨数据中心复制
    通过多数据中心数据复制实现灵活分发和容灾。

核心机制

1. Gossip 协议
  • 节点每秒与至多 3 个邻居交换状态信息(含版本号)
  • 新旧数据通过版本号自动覆盖,实现集群状态快速同步
  • 种子节点(seed)仅用于引导新节点加入,非单点故障
2. 数据分布
  • 分区策略:通过一致性哈希将数据分布到环状拓扑
  • 复制策略:支持 SimpleStrategy(单数据中心)和 NetworkTopologyStrategy(多数据中心)

典型应用场景

  1. 写入密集型场景

    • 日志存储(如应用日志、审计日志)
    • 时序数据(如物联网传感器数据)
    CREATE TABLE sensor_data (
      sensor_id UUID,
      timestamp TIMESTAMP,
      value FLOAT,
      PRIMARY KEY (sensor_id, timestamp)
    ) WITH CLUSTERING ORDER BY (timestamp DESC);
    
  2. 主键查询场景

    • 用户行为跟踪(通过用户 ID 快速检索)
    • 实时分析(如广告点击流)
  3. 低更新频率场景

    • 历史数据归档
    • 只读型数据仓库

安装与配置

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  # 前台启动(调试模式)
性能优化建议
  1. 内存配置
    heap_newsize: 800M
    max_heap_size: 4096M
    
  2. 并发控制
    native_transport_max_threads: 4096  # 最大客户端线程数
    
  3. 压缩策略
    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. 写路径优化
  1. 写入提交日志(CommitLog)确保持久性
  2. 写入内存表(Memtable)
  3. Memtable 满后刷盘为 SSTable
  4. 后台压缩合并 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 秒选择 1-3 个节点通信
  2. 交换版本化状态信息(心跳、负载等)
  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 特点分析

优势
  1. 线性可扩展性
    添加节点时数据自动重分布(nodetool rebuild
  2. 高写入吞吐
    优化写入路径(顺序写 + 内存表)
  3. 多数据中心支持
    跨 DC 数据同步配置:
    # cassandra.yaml
    endpoint_snitch: GossipingPropertyFileSnitch
    
局限性
  1. 最终一致性
    需要权衡一致性级别与延迟
  2. 不支持复杂事务
    仅提供轻量级事务(Compare and Set)
  3. 反范式设计
    需根据查询模式设计数据模型

相关代码示例

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
思维导图

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值