ClickHouse在线数据迁移与校验
·
1. 迁移前准备
-
备份源数据
- 使用
SHOW CREATE TABLE获取源表结构,确保目标表结构一致。 - 对源表进行全量备份:
-- 备份源表数据到本地文件 SELECT * FROM source_db.source_table INTO OUTFILE '/path/to/backup/source_table.csv' FORMAT CSV; - 验证备份文件是否完整(例如通过文件大小和行数校验)。
- 使用
-
检查目标集群存储空间
- 确保目标集群(20G设备)的存储空间大于源集群的1.2倍(参考阿里云文档要求)。
- 查询源集群数据总量:
SELECT formatReadableSize(sum(data_uncompressed_bytes)) AS total_uncompressed_size, formatReadableSize(sum(data_compressed_bytes)) AS total_compressed_size, sum(rows) AS total_rows FROM system.parts WHERE active AND database = 'source_db' AND table = 'source_table';
-
评估写入速度
- 如果源集群写入速度 > 20MB/s,需检查目标集群的磁盘吞吐能力(参考阿里云文档要求)。
- 使用
system.metrics或监控工具(如Prometheus)查看目标集群的IO性能。
2. 数据迁移
-
分阶段迁移数据
- 按分区迁移(适用于分区表):
- 在目标集群中创建与源表结构相同的表:
CREATE TABLE target_db.target_table ON CLUSTER 'target_cluster' ENGINE = ReplicatedMergeTree(...) AS source_db.source_table; - 按分区逐个迁移:
-- 从源集群获取分区数据 ALTER TABLE target_db.target_table FETCH PARTITION 'partition_name' FROM 'http://source_cluster_ip:8123/?query=SELECT%20*%20FROM%20source_db.source_table%20WHERE%20partition%3D%27partition_name%27'; -- 将分区附加到目标表 ALTER TABLE target_db.target_table ATTACH PARTITION 'partition_name';
- 在目标集群中创建与源表结构相同的表:
- 全量迁移(非分区表):
- 使用
INSERT INTO ... SELECT一次性迁移:INSERT INTO target_db.target_table SELECT * FROM source_db.source_table;
- 使用
- 按分区迁移(适用于分区表):
-
设置停写时间窗口
- 根据阿里云文档要求,在迁移的最后10分钟暂停源集群写入:
-- 暂停源集群写入(需在业务低峰期操作) -- 例如,通过应用层控制或关闭源集群的写入权限
- 根据阿里云文档要求,在迁移的最后10分钟暂停源集群写入:
3. 数据完整性校验
-
行数与大小校验
- 对比源表和目标表的行数及数据大小:
-- 源表统计 SELECT formatReadableSize(sum(data_uncompressed_bytes)) AS total_uncompressed_size, formatReadableSize(sum(data_compressed_bytes)) AS total_compressed_size, sum(rows) AS total_rows FROM system.parts WHERE active AND database = 'source_db' AND table = 'source_table'; -- 目标表统计 SELECT formatReadableSize(sum(data_uncompressed_bytes)) AS total_uncompressed_size, formatReadableSize(sum(data_compressed_bytes)) AS total_compressed_size, sum(rows) AS total_rows FROM system.parts WHERE active AND database = 'target_db' AND table = 'target_table';
- 对比源表和目标表的行数及数据大小:
-
数据内容校验
- 使用校验和工具(如
sumHash或MD5)对比关键字段:-- 源表校验和 SELECT sum(assumeNotNull(ifNull(cityHash64(*), 0))) AS checksum FROM source_db.source_table; -- 目标表校验和 SELECT sum(assumeNotNull(ifNull(cityHash64(*), 0))) AS checksum FROM target_db.target_table; - 若校验和一致,则数据内容匹配。
- 使用校验和工具(如
-
随机抽样验证
- 从源表和目标表中随机抽取部分数据对比:
-- 源表抽样 SELECT * FROM source_db.source_table ORDER BY random() LIMIT 1000; -- 目标表抽样 SELECT * FROM target_db.target_table ORDER BY random() LIMIT 1000;
- 从源表和目标表中随机抽取部分数据对比:
4. 迁移后操作
-
监控目标集群性能
- 观察目标集群的
merge操作频率(可能导致IO负载升高),根据阿里云文档调整合并策略。 - 使用以下命令查看合并状态:
SELECT * FROM system.merges WHERE table = 'target_table';
- 观察目标集群的
-
更新业务访问配置
- 将业务流量指向目标集群(20G设备),并验证业务功能正常。
- 将10G设备迁移至管理区,保留历史数据访问权限。
-
清理源数据(可选)
- 若不再需要源数据,可删除源表以释放空间:
DROP TABLE source_db.source_table;
- 若不再需要源数据,可删除源表以释放空间:
注意事项
- 停写时间窗口:确保迁移的最后10分钟内源集群无写入操作,避免数据不一致。
- 网络稳定性:迁移过程中保持源集群与目标集群之间的网络稳定。
- 回滚计划:若迁移失败,可通过备份文件恢复源数据,并重新尝试迁移。
更多推荐
所有评论(0)