You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无数据损失、无应用停机拆分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的每个节点上依次执行以下操作:

  1. 停止节点读写并清空提交日志:
    nodetool drain
    nodetool flush
    
  2. 停止Cassandra服务:
    sudo systemctl stop cassandra
    
  3. 修改cassandra.yaml核心配置:
    • 将cluster_name改为cluster2
    • 更新seed_provider为DC2内部的种子节点(如DC2-Node1,DC2-Node2)
    • 调整endpoint_snitch为单DC适用的配置(如SimpleSnitch,若原先是跨DC snitch)
    • 确保listen_address、rpc_address仅指向DC2内部网络
  4. 清理原集群的系统数据文件(避免集群名冲突):
    rm -rf /var/lib/cassandra/data/system/*
    rm -rf /var/lib/cassandra/commitlog/*
    rm -rf /var/lib/cassandra/saved_caches/*
    
  5. 启动Cassandra服务:
    sudo systemctl start cassandra
    
  6. 验证cluster2状态:
    nodetool status
    
    确认所有DC2节点加入集群,状态为UN(正常),Keyspace_B数据完整

4. 调整DC1为独立集群cluster1

在DC1的每个节点上依次执行以下操作(此时DC1已无跨DC业务流量):

  1. 停止节点读写并清空提交日志:
    nodetool drain
    nodetool flush
    
  2. 停止Cassandra服务:
    sudo systemctl stop cassandra
    
  3. 修改cassandra.yaml核心配置:
    • 将cluster_name改为cluster1
    • 更新seed_provider为DC1内部的种子节点(如DC1-Node1,DC1-Node2)
    • 调整endpoint_snitch为单DC适用的配置
  4. 清理原集群的系统数据文件:
    rm -rf /var/lib/cassandra/data/system/*
    rm -rf /var/lib/cassandra/commitlog/*
    rm -rf /var/lib/cassandra/saved_caches/*
    
  5. 启动Cassandra服务:
    sudo systemctl start cassandra
    
  6. 验证cluster1状态:
    nodetool status
    
    确认所有DC1节点加入集群,状态为UN,Keyspace_A数据完整

5. 收尾与清理

  • 验证两个集群的读写业务均正常,应用无报错
  • 删除各集群不需要的Keyspace:
    DROP KEYSPACE Keyspace_B;  # 在cluster1执行
    DROP KEYSPACE Keyspace_A;  # 在cluster2执行
    
  • 对两个集群分别执行全量备份,确保数据安全

内容的提问来源于stack exchange,提问作者Vadivel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:40:57