如何无数据损失、无应用停机拆分Cassandra多DC集群为独立集群?
多DC Cassandra集群拆分方案(零数据损失、零应用停机)
前置准备
- 原集群信息:集群名
Test_cluster,包含DC1(15节点)、DC2(15节点) - 拆分目标:
cluster1:包含DC1所有节点,保留指定Keyspace(如Keyspace_A)cluster2:包含DC2所有节点,保留指定Keyspace(如Keyspace_B)
- 核心约束:全程无应用停机、无数据丢失
1. 确保目标Keyspace在对应DC拥有完整副本
针对每个需保留的Keyspace,调整复制策略并同步数据:
- 对
Keyspace_A(cluster1保留),修改复制策略为仅DC1:ALTER KEYSPACE Keyspace_A WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'DC1': 3}; - 对
Keyspace_B(cluster2保留),修改复制策略为仅DC2:ALTER KEYSPACE Keyspace_B WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'DC2': 3}; - 在对应DC的所有节点上执行修复,确保数据完全同步:
nodetool repair Keyspace_A # DC1节点执行 nodetool repair Keyspace_B # DC2节点执行 - 验证数据完整性:用
cqlsh查询对应Keyspace的表,确认数据无缺失
2. 切换应用流量路由(零停机关键)
- 修改应用客户端配置,实现Keyspace级别的流量隔离:
- 访问
Keyspace_A的请求仅路由到DC1节点列表 - 访问
Keyspace_B的请求仅路由到DC2节点列表
- 访问
- 验证流量:通过监控或日志确认所有读写请求已按Keyspace分流,原集群跨DC通信无业务流量
3. 拆分DC2为独立集群cluster2
在DC2的每个节点上依次执行以下操作:
- 停止节点读写并清空提交日志:
nodetool drain nodetool flush - 停止Cassandra服务:
sudo systemctl stop cassandra - 修改
cassandra.yaml核心配置:- 将
cluster_name改为cluster2 - 更新
seed_provider为DC2内部的种子节点(如DC2-Node1,DC2-Node2) - 调整
endpoint_snitch为单DC适用的配置(如SimpleSnitch,若原先是跨DC snitch) - 确保
listen_address、rpc_address仅指向DC2内部网络
- 将
- 清理原集群的系统数据文件(避免集群名冲突):
rm -rf /var/lib/cassandra/data/system/* rm -rf /var/lib/cassandra/commitlog/* rm -rf /var/lib/cassandra/saved_caches/* - 启动Cassandra服务:
sudo systemctl start cassandra - 验证
cluster2状态:
确认所有DC2节点加入集群,状态为nodetool statusUN(正常),Keyspace_B数据完整
4. 调整DC1为独立集群cluster1
在DC1的每个节点上依次执行以下操作(此时DC1已无跨DC业务流量):
- 停止节点读写并清空提交日志:
nodetool drain nodetool flush - 停止Cassandra服务:
sudo systemctl stop cassandra - 修改
cassandra.yaml核心配置:- 将
cluster_name改为cluster1 - 更新
seed_provider为DC1内部的种子节点(如DC1-Node1,DC1-Node2) - 调整
endpoint_snitch为单DC适用的配置
- 将
- 清理原集群的系统数据文件:
rm -rf /var/lib/cassandra/data/system/* rm -rf /var/lib/cassandra/commitlog/* rm -rf /var/lib/cassandra/saved_caches/* - 启动Cassandra服务:
sudo systemctl start cassandra - 验证
cluster1状态:
确认所有DC1节点加入集群,状态为nodetool statusUN,Keyspace_A数据完整
5. 收尾与清理
- 验证两个集群的读写业务均正常,应用无报错
- 删除各集群不需要的Keyspace:
DROP KEYSPACE Keyspace_B; # 在cluster1执行 DROP KEYSPACE Keyspace_A; # 在cluster2执行 - 对两个集群分别执行全量备份,确保数据安全
内容的提问来源于stack exchange,提问作者Vadivel
相关产品推荐
相关产品推荐

