注:以迁移keyspace名为mydb,table名为user表数据为例,使用Cassandra的export/import工具:COPY TO/FROM
另有镜像备份恢复能大粒度实现多keyspace备份功能,但需要相同的system_schema(元数据信息),一般只在同一集群上操作。
一、查看原始Cassandra表
1、进入cqlsh
bin/cqlsh
2、查看keyspace的mydb结构,复制并记录最上方的keyspace创建语句
cqlsh> desc keyspaces mydb;
例:CREATE KEYSPACE mydb WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
参数解释:class:策略;replication_factor:复制因子
简单策略:在一个数据中心的情况下使用简单的策略。 在这个策略中,第一个副本被放置在所选择的节点上,剩下的节点被放置在环的顺时针方向,而不考虑机架或节点的位置。
网络拓扑策略:该策略用于多个数据中心。 在此策略中,您必须分别为每个数据中心提供复制因子。
复制因子:复制因子是放置在不同节点上的数据的副本数。 超过两个复制因子是很好的获得没有单点故障。 所以3个以上是很好的复制因子。)
3、选择keyspace
cqlsh> use mydb;
4、查看表
cqlsh:mydb> desc tables;
5、查看详细建表语句,复制,记录
cqlsh:mydb> desc user;
例:CREATE TABLE mydb.user (
id int PRIMARY KEY,
user_name text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
6、记录数据总数用于检测数据完整性
cqlsh:mydb> select count(*) from user;
二、数据导出
1、把user表数据以csv的格式导出为user.csv文件(以系统目录/root/user.csv为例)
cqlsh:mydb> COPY mydb.user TO '/root/user.csv';
三、系统文件转移
找到刚刚生成的user.csv文件,复制到需要迁移的服务器(如/root/user.csv)上
此过程略
四、数据导入
1、在新集群中创建keyspaces和表,keyspace随意,表结构必须与原集群保持一致,创建新keyspace(粘贴之前复制的语句)
cqlsh> CREATE KEYSPACE mydb WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
2、在新集群环境中创建新表(粘贴之前复制的建表语句)
cqlsh> CREATE TABLE mydb.user (
id int PRIMARY KEY,
user_name text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99PERCENTILE';
3、将csv数据导入user表
cqlsh> COPY mydb.user FROM '/root/user.csv';
4、确认数据完整性
cqlsh> use mydb;
cqlsh:mydb> select count(*) from user;
5、删除临时产生的csv文件
rm -rf /root/user.csv