修改键空间 #
一、修改概述 #
1.1 可修改的属性 #
text
可修改属性:
├── 复制策略
├── 复制因子
├── 持久化写入设置
└── 表配置(间接影响)
1.2 修改影响 #
| 修改类型 | 影响 | 需要操作 |
|---|---|---|
| 增加复制因子 | 数据复制到新节点 | 执行repair |
| 减少复制因子 | 删除多余副本 | 自动处理 |
| 切换策略 | 重新分布数据 | 执行repair |
二、基本语法 #
2.1 ALTER KEYSPACE语法 #
sql
ALTER KEYSPACE keyspace_name
WITH replication = {
'class': 'replication_strategy',
...
}
[AND durable_writes = true|false];
2.2 简单示例 #
sql
-- 修改复制因子
ALTER KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 5
};
-- 修改持久化写入
ALTER KEYSPACE my_keyspace
WITH durable_writes = false;
三、修改复制因子 #
3.1 增加复制因子 #
sql
-- SimpleStrategy增加RF
ALTER KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 5
};
-- NetworkTopologyStrategy增加RF
ALTER KEYSPACE production_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 5,
'dc2': 3
};
-- 增加后需要执行repair
-- nodetool repair my_keyspace
3.2 减少复制因子 #
sql
-- SimpleStrategy减少RF
ALTER KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
};
-- NetworkTopologyStrategy减少RF
ALTER KEYSPACE production_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 3,
'dc2': 2
};
-- 减少后数据自动清理
3.3 修改后的数据同步 #
bash
# 增加复制因子后执行repair
nodetool repair my_keyspace
# 查看repair进度
nodetool repair -pr my_keyspace
# 并行repair(大集群)
nodetool repair my_keyspace -par
四、切换复制策略 #
4.1 SimpleStrategy到NetworkTopologyStrategy #
sql
-- 查看当前配置
DESCRIBE KEYSPACE my_keyspace;
-- 切换策略
ALTER KEYSPACE my_keyspace
WITH replication = {
'class': 'NetworkTopologyStrategy',
'datacenter1': 3
};
-- 切换后执行repair
-- nodetool repair my_keyspace
4.2 NetworkTopologyStrategy调整 #
sql
-- 添加新数据中心
ALTER KEYSPACE global_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 3,
'dc2': 3,
'dc3': 2 -- 新增数据中心
};
-- 移除数据中心
ALTER KEYSPACE global_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 3,
'dc2': 3
};
-- 调整各数据中心RF
ALTER KEYSPACE global_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 5, -- 增加
'dc2': 3,
'dc3': 1 -- 减少
};
五、修改持久化写入 #
5.1 启用持久化写入 #
sql
-- 启用(推荐)
ALTER KEYSPACE my_keyspace
WITH durable_writes = true;
5.2 禁用持久化写入 #
sql
-- 禁用(不推荐生产使用)
ALTER KEYSPACE my_keyspace
WITH durable_writes = false;
-- 注意:禁用后节点故障可能丢失数据
六、完整修改示例 #
6.1 开发到测试环境迁移 #
sql
-- 原配置(开发)
-- CREATE KEYSPACE app_ks
-- WITH replication = {
-- 'class': 'SimpleStrategy',
-- 'replication_factor': 1
-- };
-- 修改为测试配置
ALTER KEYSPACE app_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'test_dc': 2
}
AND durable_writes = true;
-- 执行repair
-- nodetool repair app_ks
6.2 测试到生产环境迁移 #
sql
-- 原配置(测试)
-- CREATE KEYSPACE app_ks
-- WITH replication = {
-- 'class': 'NetworkTopologyStrategy',
-- 'test_dc': 2
-- };
-- 修改为生产配置
ALTER KEYSPACE app_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'prod_dc1': 3,
'prod_dc2': 3
}
AND durable_writes = true;
-- 执行repair
-- nodetool repair app_ks
6.3 扩展多数据中心 #
sql
-- 原配置(单数据中心)
-- CREATE KEYSPACE app_ks
-- WITH replication = {
-- 'class': 'NetworkTopologyStrategy',
-- 'dc1': 3
-- };
-- 扩展为多数据中心
ALTER KEYSPACE app_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': 3,
'dc2': 3,
'dc3': 2
};
-- 执行repair
-- nodetool repair app_ks
七、查看修改结果 #
7.1 查看键空间配置 #
sql
-- 查看键空间详情
DESCRIBE KEYSPACE my_keyspace;
-- 输出示例
CREATE KEYSPACE my_keyspace WITH replication = {
'class': 'NetworkTopologyStrategy',
'dc1': '3',
'dc2': '3'
} AND durable_writes = true;
7.2 查询系统表 #
sql
-- 查询键空间配置
SELECT * FROM system_schema.keyspaces
WHERE keyspace_name = 'my_keyspace';
-- 查看复制配置
SELECT keyspace_name, replication
FROM system_schema.keyspaces
WHERE keyspace_name = 'my_keyspace';
八、修改注意事项 #
8.1 增加复制因子 #
text
注意事项:
├── 需要足够的磁盘空间
├── 执行repair可能耗时
├── 建议在低峰期执行
├── 监控集群负载
└── 分批执行repair
8.2 减少复制因子 #
text
注意事项:
├── 数据会自动清理
├── 确保剩余副本足够
├── 注意可用性影响
└── 监控数据分布
8.3 切换策略 #
text
注意事项:
├── 数据会重新分布
├── 必须执行repair
├── 可能影响性能
├── 建议在维护窗口执行
└── 提前备份数据
九、常见错误处理 #
9.1 键空间不存在 #
sql
-- 错误
ALTER KEYSPACE nonexistent_ks ...;
-- Error: Keyspace 'nonexistent_ks' doesn't exist
-- 解决:先创建键空间
CREATE KEYSPACE IF NOT EXISTS nonexistent_ks ...;
9.2 无效的复制因子 #
sql
-- 错误:复制因子超过节点数
ALTER KEYSPACE my_ks
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 10 -- 但只有3个节点
};
-- 解决:设置合理的复制因子
ALTER KEYSPACE my_ks
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
};
9.3 数据中心名称错误 #
sql
-- 错误
ALTER KEYSPACE my_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'wrong_dc': 3
};
-- 解决:使用正确的数据中心名称
-- 先查看:nodetool status
ALTER KEYSPACE my_ks
WITH replication = {
'class': 'NetworkTopologyStrategy',
'datacenter1': 3
};
十、监控修改进度 #
10.1 监控repair进度 #
bash
# 查看repair状态
nodetool repair -pr my_keyspace
# 查看流式传输
nodetool netstats
# 查看节点状态
nodetool status
10.2 监控数据分布 #
bash
# 查看数据分布
nodetool ring
# 查看表统计
nodetool tablestats my_keyspace
# 查看磁盘使用
nodetool cfstats my_keyspace
十一、最佳实践 #
11.1 修改流程 #
text
修改流程:
├── 1. 备份重要数据
├── 2. 查看当前配置
├── 3. 规划修改内容
├── 4. 在测试环境验证
├── 5. 选择低峰期执行
├── 6. 执行修改
├── 7. 执行repair
├── 8. 验证修改结果
└── 9. 监控集群状态
11.2 修改建议 #
| 操作 | 建议 |
|---|---|
| 增加RF | 分批执行repair |
| 减少RF | 确保剩余副本足够 |
| 切换策略 | 提前测试 |
| 多DC扩展 | 逐个数据中心添加 |
十二、总结 #
修改键空间要点:
| 操作 | 影响 | 后续操作 |
|---|---|---|
| 增加RF | 数据复制 | repair |
| 减少RF | 数据清理 | 无 |
| 切换策略 | 数据重分布 | repair |
最佳实践:
- 提前备份数据
- 在测试环境验证
- 选择低峰期执行
- 增加RF后执行repair
- 监控修改进度
下一步,让我们学习删除键空间!
最后更新:2026-03-27