修改键空间 #

一、修改概述 #

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

最佳实践:

  1. 提前备份数据
  2. 在测试环境验证
  3. 选择低峰期执行
  4. 增加RF后执行repair
  5. 监控修改进度

下一步,让我们学习删除键空间!

最后更新:2026-03-27