修改键空间 #
一、ALTER KEYSPACE概述 #
1.1 可修改的属性 #
ALTER KEYSPACE可以修改以下属性:
| 属性 | 可修改 | 说明 |
|---|---|---|
| 复制因子 | ✓ | 可以增减 |
| 复制策略类型 | ✗ | 创建后不可更改 |
| durable_writes | ✓ | 可以修改 |
| 键空间名称 | ✗ | 不支持重命名 |
1.2 基本语法 #
sql
ALTER KEYSPACE keyspace_name
WITH replication = {
'class': 'replication_strategy',
...
}
[AND durable_writes = true|false];
二、修改复制因子 #
2.1 SimpleStrategy #
sql
-- 查看当前配置
DESCRIBE KEYSPACE my_app;
-- 增加复制因子
ALTER KEYSPACE my_app
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
};
-- 减少复制因子
ALTER KEYSPACE my_app
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 2
};
2.2 NetworkTopologyStrategy #
sql
-- 查看当前配置
DESCRIBE KEYSPACE my_app;
-- 修改单数据中心RF
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 4
};
-- 修改多数据中心RF
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 4,
'DC2': 3
};
-- 添加新数据中心
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3,
'DC2': 3,
'DC3': 2
};
三、修改durable_writes #
3.1 禁用持久写入 #
sql
-- 禁用持久写入(提高性能,但可能丢失数据)
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3
}
AND durable_writes = false;
3.2 启用持久写入 #
sql
-- 启用持久写入(默认)
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3
}
AND durable_writes = true;
3.3 使用场景 #
text
durable_writes配置建议:
启用(true)- 默认
├── 生产环境
├── 关键数据
└── 需要数据持久化
禁用(false)
├── 分析环境
├── 临时数据
├── 可重建的数据
└── 性能优先场景
四、增加复制因子流程 #
4.1 完整流程 #
sql
-- 步骤1:修改键空间配置
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 4
};
-- 步骤2:在每个节点执行repair
-- 这会复制数据到新节点
nodetool repair my_app;
-- 步骤3:验证数据分布
nodetool status;
nodetool tablestats my_app;
4.2 验证复制 #
sql
-- 查看键空间配置
DESCRIBE KEYSPACE my_app;
-- 查看数据分布
SELECT * FROM system.size_estimates
WHERE keyspace_name = 'my_app';
五、减少复制因子流程 #
5.1 完整流程 #
sql
-- 步骤1:修改键空间配置
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 2
};
-- 步骤2:在每个节点执行cleanup
-- 这会删除多余的副本
nodetool cleanup my_app;
-- 步骤3:验证数据清理
nodetool status;
nodetool tablestats my_app;
5.2 注意事项 #
text
减少复制因子注意事项:
1. 必须执行cleanup
└── 否则多余数据会占用磁盘空间
2. 逐个节点执行
└── 避免同时清理影响性能
3. 验证数据完整性
└── 确保清理后数据正常
4. 备份重要数据
└── 减少RF前建议备份
六、多数据中心扩展 #
6.1 添加新数据中心 #
sql
-- 步骤1:配置新数据中心节点
-- 在新数据中心的节点上配置cassandra.yaml
-- 步骤2:启动新节点
bin/cassandra
-- 步骤3:修改键空间配置
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3,
'DC2': 3
};
-- 步骤4:在新数据中心节点执行repair
nodetool repair my_app;
-- 步骤5:验证数据同步
nodetool status;
6.2 移除数据中心 #
sql
-- 步骤1:修改键空间配置,移除数据中心
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3
};
-- 步骤2:在旧数据中心节点执行cleanup
nodetool cleanup my_app;
-- 步骤3:退役旧数据中心节点
nodetool decommission;
-- 步骤4:验证
nodetool status;
七、监控与验证 #
7.1 查看修改结果 #
sql
-- 查看键空间配置
DESCRIBE KEYSPACE my_app;
-- 查看系统表
SELECT * FROM system_schema.keyspaces
WHERE keyspace_name = 'my_app';
7.2 监控数据分布 #
bash
# 查看集群状态
nodetool status
# 查看数据分布
nodetool ring
# 查看表统计
nodetool tablestats my_app
# 查看数据流
nodetool streaminfo
7.3 验证数据一致性 #
bash
# 验证数据一致性
nodetool verify my_app
# 检查数据完整性
nodetool scrub my_app
八、最佳实践 #
8.1 修改时机 #
text
最佳修改时机:
推荐
├── 业务低峰期
├── 维护窗口期
└── 有充足监控
避免
├── 业务高峰期
├── 大型活动期间
└── 无监控状态
8.2 修改顺序 #
text
增加RF顺序:
1. ALTER KEYSPACE
2. nodetool repair(每个节点)
3. 验证数据分布
减少RF顺序:
1. ALTER KEYSPACE
2. nodetool cleanup(每个节点)
3. 验证数据清理
8.3 回滚计划 #
sql
-- 修改前记录当前配置
DESCRIBE KEYSPACE my_app;
-- 如果需要回滚
ALTER KEYSPACE my_app
WITH replication = {
'class': 'NetworkTopologyStrategy',
'DC1': 3 -- 恢复原配置
};
-- 执行相应操作
nodetool repair my_app; -- 增加RF
-- 或
nodetool cleanup my_app; -- 减少RF
九、常见问题 #
9.1 修改后数据不一致 #
bash
# 问题:修改RF后数据不一致
# 解决:执行全量repair
nodetool repair -full my_app
9.2 磁盘空间未释放 #
bash
# 问题:减少RF后磁盘空间未释放
# 解决:执行cleanup
nodetool cleanup my_app
9.3 新数据中心无数据 #
bash
# 问题:添加新DC后无数据
# 解决:在新DC节点执行repair
nodetool rebuild --dc DC1
十、总结 #
修改键空间要点:
- 复制策略类型不可更改:只能修改复制因子
- 增加RF需repair:确保数据复制到新节点
- 减少RF需cleanup:清理多余数据
- 低峰期操作:减少对业务影响
- 验证和监控:确保修改成功
- 备份重要数据:修改前做好备份
下一步,让我们学习删除键空间!
最后更新:2026-03-27