如何将Cassandra 3.9(CentOS 6.7)数据迁移至Cassandra 3.11(CentOS 7)
嗨,这个Cassandra跨小版本+跨CentOS版本的迁移场景我之前处理过几次,给你整理两个最靠谱的实操方案,你根据自己的情况选就行:
方案一:节点直接替换法(适合单节点小集群,最省心)
这个方法相当于把老节点的数据直接“搬”到新节点,操作步骤简单,适配你的单节点场景:
- 准备新环境:在CentOS7上安装Cassandra3.11,配置
/etc/cassandra/conf/cassandra.yaml时,确保和老节点核心参数一致:cluster_name、seeds(单节点填新节点自身IP)、listen_address、rpc_address、endpoint_snitch。同时调整CentOS7系统参数:在/etc/security/limits.conf中设置cassandra soft nofile 100000和cassandra hard nofile 100000,关闭SELinux或给Cassandra添加对应权限,避免后续读写报错。 - 老节点打快照:先暂停业务写入(单节点场景必须停,否则会出现数据不一致),执行命令:
快照会保存在老节点的nodetool snapshot -t migration_snap/var/lib/cassandra/data/每个keyspace/表名-UUID/snapshots/migration_snap目录下。 - 复制快照到新节点:用
rsync或scp把老节点整个/var/lib/cassandra/data目录下的快照内容复制到新节点对应路径,复制完成后修正权限:chown -R cassandra:cassandra /var/lib/cassandra/data - 新节点加载数据:启动新节点的Cassandra服务,执行命令加载快照:
若只想加载特定keyspace,可用nodetool refreshnodetool refresh --keyspace <你的keyspace名>。加载完成后,用nodetool status查看节点状态是否为UN(正常),再通过cqlsh连接查询核心数据验证一致性。 - 切换业务:确认数据无误后,将业务的Cassandra连接地址改为新节点IP,再停掉老节点即可。
方案二:sstableloader批量导入法(适合需要过滤数据或分步迁移的场景)
如果不想直接替换节点,或需要对数据做筛选,这个方法更灵活:
- 导出老节点schema:在老节点用
cqlsh导出全量schema:
将cqlsh -e "DESCRIBE SCHEMA;" > schema.cqlschema.cql复制到新节点,执行创建schema:
确保新节点的keyspace和表结构与老节点完全一致(3.9到3.11的schema兼容,无需额外修改)。cqlsh -f schema.cql - 老节点刷写内存数据到磁盘:在老节点执行
nodetool flush,把内存中未持久化的数据刷到sstable文件,避免数据丢失。 - 用sstableloader导入数据:在新节点上,针对每个表的sstable目录执行导入命令:
导入过程可查看新节点的Cassandra日志(sstableloader -d <新节点IP> /var/lib/cassandra/data/<keyspace名>/<表名-UUID>/var/log/cassandra/system.log)确认进度和是否有报错。 - 验证数据:导入完成后,随机查询多个表的数据,与老节点对比确保完全一致。
关键注意事项
- 版本兼容性:Cassandra 3.x系列的sstable格式向下兼容,3.9的sstable可直接在3.11上使用,无需用
sstableupgrade工具升级格式。 - 数据一致性保障:若迁移期间无法停写,建议临时开启业务双写(同时写入老节点和新节点),完成后再切换到新节点;单节点场景下,停写是最稳妥的方式。
- 配置细节:务必对比老节点和新节点的
cassandra.yaml核心参数,尤其是endpoint_snitch,如果老节点用的是GossipingPropertyFileSnitch,新节点必须保持一致,否则会出现节点通信异常。
内容的提问来源于stack exchange,提问作者dzyzas
相关产品推荐
相关产品推荐

