修改键空间 #

一、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

十、总结 #

修改键空间要点:

  1. 复制策略类型不可更改:只能修改复制因子
  2. 增加RF需repair:确保数据复制到新节点
  3. 减少RF需cleanup:清理多余数据
  4. 低峰期操作:减少对业务影响
  5. 验证和监控:确保修改成功
  6. 备份重要数据:修改前做好备份

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

最后更新:2026-03-27