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

九、总结 #

复制策略要点:

  1. SimpleStrategy:简单但仅适合单数据中心开发测试
  2. NetworkTopologyStrategy:生产环境必选,支持多数据中心
  3. 复制因子:生产环境推荐RF=3
  4. 变更RF:增加需repair,减少需cleanup
  5. 多数据中心:使用LOCAL_QUORUM保证性能
  6. 监控:定期检查复制状态和数据分布

下一步,让我们学习一致性级别!

最后更新:2026-03-27