Cassandra复制策略 #
一、复制概述 #
1.1 什么是复制 #
复制是将数据存储到多个节点的过程,确保高可用性和容错能力。
text
数据复制示意:
┌─────────────────────────────────────────────────────────┐
│ 数据复制 │
├─────────────────────────────────────────────────────────┤
│ │
│ 写入请求 │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Node A │ ──复制──► ┌─────────┐ │
│ │ (副本1) │ │ Node B │ │
│ └─────────┘ │ (副本2) │ │
│ └─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Node C │ │
│ │ (副本3) │ │
│ └─────────┘ │
│ │
│ 复制因子 RF=3:数据存储在3个节点 │
└─────────────────────────────────────────────────────────┘
1.2 复制因子 #
复制因子(Replication Factor, RF)决定数据存储的副本数量。
| RF | 描述 | 容错能力 |
|---|---|---|
| 1 | 单副本 | 无容错 |
| 2 | 双副本 | 可容忍1节点故障 |
| 3 | 三副本 | 可容忍1节点故障(QUORUM)或2节点故障(ONE) |
| 5 | 五副本 | 可容忍2节点故障(QUORUM) |
1.3 复制策略类型 #
| 策略 | 描述 | 适用场景 |
|---|---|---|
| SimpleStrategy | 单数据中心简单复制 | 开发测试 |
| NetworkTopologyStrategy | 多数据中心感知复制 | 生产环境 |
二、SimpleStrategy #
2.1 工作原理 #
SimpleStrategy按顺时针方向在Token环上放置副本。
text
SimpleStrategy复制(RF=3):
Token环
│
┌────────────┼────────────┐
│ │ │
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node A │ │ Node B │ │ Node C │
│ Token:0 │ │Token:25 │ │Token:50 │
└─────────┘ └─────────┘ └─────────┘
│ │ │
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ 副本1 │ │ 副本2 │ │ 副本3 │
│ 数据X │ │ 数据X │ │ 数据X │
└─────────┘ └─────────┘ └─────────┘
数据X的Token落在Node A范围:
→ 副本1: Node A
→ 副本2: Node B (顺时针下一个)
→ 副本3: Node C (顺时针下下个)
2.2 创建键空间 #
sql
-- 使用SimpleStrategy创建键空间
CREATE KEYSPACE my_app
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
};
-- 修改复制因子
ALTER KEYSPACE my_app
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 2
};
2.3 限制 #
text
SimpleStrategy限制:
1. 不感知机架和数据中心
└── 副本可能分布在同一机架
2. 不适合生产环境
└── 无法保证跨数据中心分布
3. 简单但不够智能
└── 仅按Token顺序放置副本
三、NetworkTopologyStrategy #
3.1 工作原理 #
NetworkTopologyStrategy根据数据中心和机架拓扑放置副本。
text
NetworkTopologyStrategy复制:
┌─────────────────────────────────────────────────────────┐
│ 集群拓扑 │
├───────────────────────┬─────────────────────────────────┤
│ DC1 (北京) │ DC2 (上海) │
├───────────────────────┼─────────────────────────────────┤
│ RAC1 │ RAC1 │
│ ├── Node1 (副本1) │ ├── Node4 (副本4) │
│ └── Node2 (副本2) │ └── Node5 (副本5) │
├───────────────────────┼─────────────────────────────────┤
│ RAC2 │ RAC2 │
│ └── Node3 (副本3) │ └── Node6 (副本6) │
└───────────────────────┴─────────────────────────────────┘
配置:{'class': 'NetworkTopologyStrategy', 'DC1': 3, 'DC2': 3}
→ DC1: 3个副本,分布在不同机架
→ DC2: 3个副本,分布在不同机架
3.2 创建键空间 #
sql
-- 单数据中心
CREATE KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'datacenter1': 3
};
-- 多数据中心
CREATE KEYSPACE my_app_multi
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3,
'DC2': 2,
'DC3': 2
};
-- 修改复制因子
ALTER KEYSPACE my_app_multi
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 4,
'DC2': 3
};
3.3 副本放置规则 #
text
NetworkTopologyStrategy副本放置:
规则1:副本均匀分布到不同机架
├── 第1个副本:机架1
├── 第2个副本:机架2
└── 第3个副本:机架1(如果只有2个机架)
规则2:每个数据中心的副本数量独立控制
├── DC1: 3副本
└── DC2: 2副本
规则3:机架感知
└── 使用Snitch获取机架信息
3.4 配置Snitch #
yaml
# cassandra.yaml
# 使用GossipingPropertyFileSnitch
endpoint_snitch: GossipingPropertyFileSnitch
properties
# cassandra-rackdc.properties
# 节点拓扑配置
dc=DC1
rack=RAC1
四、复制策略选择 #
4.1 选择指南 #
| 场景 | 推荐策略 | 配置 |
|---|---|---|
| 开发/测试 | SimpleStrategy | RF=1或2 |
| 单数据中心生产 | NetworkTopologyStrategy | DC1=3 |
| 多数据中心生产 | NetworkTopologyStrategy | 每DC=3 |
| 跨地域部署 | NetworkTopologyStrategy | 每DC=3 |
4.2 复制因子建议 #
text
复制因子建议:
单数据中心:
├── 开发环境: RF=1
├── 测试环境: RF=2
└── 生产环境: RF=3
多数据中心:
├── 主数据中心: RF=3
├── 备份数据中心: RF=3
└── 分析数据中心: RF=2
一致性级别配合:
├── RF=3, QUORUM读写: 强一致性,容忍1节点故障
├── RF=3, ONE读写: 最终一致性,容忍2节点故障
└── RF=5, QUORUM读写: 强一致性,容忍2节点故障
五、复制因子变更 #
5.1 增加复制因子 #
sql
-- 1. 修改键空间复制因子
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 4
};
-- 2. 在每个节点执行repair
nodetool repair my_app
-- 3. 验证数据分布
nodetool netstats
nodetool info
5.2 减少复制因子 #
sql
-- 1. 修改键空间复制因子
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 2
};
-- 2. 在每个节点执行cleanup
nodetool cleanup my_app
-- 3. 验证数据清理
nodetool tablestats my_app
5.3 变更注意事项 #
text
复制因子变更注意事项:
增加RF:
├── 先ALTER KEYSPACE
├── 再运行nodetool repair
└── 数据会自动复制到新节点
减少RF:
├── 先ALTER KEYSPACE
├── 再运行nodetool cleanup
└── 多余副本会被删除
重要:
├── repair是必须的(增加RF)
├── cleanup是必须的(减少RF)
└── 建议在低峰期执行
六、跨数据中心复制 #
6.1 多数据中心架构 #
text
多数据中心架构:
┌─────────────────────────────────────────────────────────┐
│ 全局应用 │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ DC1 (北京) │ │ DC2 (上海) │
├─────────────────────┤ ├─────────────────────┤
│ ┌─────┐ ┌─────┐ │ │ ┌─────┐ ┌─────┐ │
│ │N1 │ │N2 │ │ │ │N4 │ │N5 │ │
│ │副本1│ │副本2│ │ │ │副本4│ │副本5│ │
│ └─────┘ └─────┘ │ │ └─────┘ └─────┘ │
│ ┌─────┐ │ │ ┌─────┐ │
│ │N3 │ │ │ │N6 │ │
│ │副本3│ │ │ │副本6│ │
│ └─────┘ │ │ └─────┘ │
└─────────────────────┘ └─────────────────────┘
本地读写:
├── 北京用户 → DC1读写
└── 上海用户 → DC2读写
6.2 配置示例 #
sql
-- 多数据中心键空间
CREATE KEYSPACE global_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'beijing': 3,
'shanghai': 3
}
AND durable_writes = true;
-- 本地优先一致性级别
-- 使用LOCAL_QUORUM确保本地数据中心一致性
CONSISTENCY LOCAL_QUORUM;
6.3 一致性级别选择 #
sql
-- 本地强一致性
CONSISTENCY LOCAL_QUORUM;
-- 全局强一致性(性能较低)
CONSISTENCY QUORUM;
-- 本地快速读取
CONSISTENCY LOCAL_ONE;
-- 全局快速读取
CONSISTENCY ONE;
七、复制监控 #
7.1 监控命令 #
bash
# 查看键空间复制策略
DESCRIBE KEYSPACE my_app;
# 查看集群状态
nodetool status
# 查看数据分布
nodetool ring
# 查看复制进度
nodetool netstats
# 查看修复状态
nodetool repair -pr my_app
7.2 复制延迟监控 #
bash
# 查看节点间延迟
nodetool gossipinfo
# 查看数据流
nodetool streaminfo
# 查看表统计
nodetool tablestats my_app.my_table
八、最佳实践 #
8.1 生产环境配置 #
sql
-- 生产环境推荐配置
CREATE KEYSPACE production_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 3,
'dc2': 3
}
AND durable_writes = true;
-- 表配置
CREATE TABLE production_app.users (
user_id UUID PRIMARY KEY,
name TEXT,
email TEXT
) WITH
gc_grace_seconds = 864000 AND
compaction = {'class': 'SizeTieredCompactionStrategy'} AND
compression = {'sstable_compression': 'LZ4Compressor'};
8.2 复制策略决策树 #
text
是否多数据中心?
├── 是
│ └── NetworkTopologyStrategy
│ └── 每个数据中心配置独立RF
│
└── 否
├── 生产环境
│ └── NetworkTopologyStrategy
│ └── RF=3
│
└── 开发/测试
└── SimpleStrategy
└── RF=1或2
8.3 常见问题 #
text
问题1:副本分布不均匀
原因:Snitch配置错误
解决:检查cassandra-rackdc.properties
问题2:跨数据中心延迟高
原因:使用QUORUM而非LOCAL_QUORUM
解决:使用LOCAL_QUORUM一致性级别
问题3:修改RF后数据不一致
原因:未执行repair
解决:执行nodetool repair
九、总结 #
复制策略要点:
- SimpleStrategy:简单但仅适合单数据中心开发测试
- NetworkTopologyStrategy:生产环境必选,支持多数据中心
- 复制因子:生产环境推荐RF=3
- 变更RF:增加需repair,减少需cleanup
- 多数据中心:使用LOCAL_QUORUM保证性能
- 监控:定期检查复制状态和数据分布
下一步,让我们学习一致性级别!
最后更新:2026-03-27