- HBase 增量迁移:TB 级历史表 0 停机上云
场景
本地 2.3 TB 的 msg_his 表 → 阿里云 HBase 2.0(LTS 版),要求白天业务可读可写,只容忍 5 min 最终切换窗口。
方案选型
采用“Snapshot + Replication 双轨 + 增量校验”三段式:
凌晨 Snapshot
3:00 触发:
bash
hbase shell
snapshot 'msg_his', 'snap_20231008_0300'
用时 42 s,数据视图冻结在 03:00:42。
ExportSnapshot 到 OSS
走内网 10 Gbps,命令:
bash
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot
-snapshot snap_20231008_0300
-copy-to oss://hbase-snapshot/
-mappers 40 -bandwidth 800
速率 780 MB/s,2 h 56 min 传完 2.3 TB。
云端 ImportSnapshot
创建同名空表,设置 REPLICATION_SCOPE => 1,然后:
bash
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot
-snapshot snap_20231008_0300
-copy-from oss://hbase-snapshot/
-copy-to hdfs://emr-cluster/hbase
-overwrite
1 h 10 min 完成,HFile 直接加载,无写放大。
启动双向 Replication
本地 → 云端 peer id 100,云端 → 本地 peer id 101,形成环回。
用 Filter 排除已迁移历史分区(RowKey 含日期 < 20231008),避免重复。
增量追赶
白天 10 h 产生 190 GB WAL,Replication 延迟稳定在 3–5 min。
割接
22:00 暂停写入口 2 min,确认两端 ReplicationLag = 0;
业务 DNS 切到云端,启动写开关;
本地集群保留只读 24 h,次日下线 peer。
结果
实际停写窗口 3 min 47 s,0 数据丢失,RowKey 级别校验 0 差异。
2. VM 内存去重(KSM + VMware TPS)对比
表格
特性 Linux KSM VMware TPS
粒度 4 KB 匿名页 4 KB 所有 Guest Physical Page
算法 简单哈希+逐字节比较 哈希+树形比较,可跨 VM
控制 echo 1000 > /sys/kernel/mm/ksm/pages_to_scan Mem.ShareScanTime=60
安全性 默认启用,无加密页 禁用跨 VM(2014 年后)仅同 VM 内合并
实验
同一宿主机起 4 台 CentOS 7 VM,各 4 GB,运行相同 Redis 实例,填充 2 GB 数据。
结果:
KSM 合并 1.3 GB,宿主机内存使用 16 → 11.7 GB。
TPS(同 VM 内)合并 0.9 GB,跨 VM 已关闭。
结论:虚拟化层与 OS 层重复去重,收益不叠加,选其一即可;对加密敏感场景优先关闭 TPS。
3. 踩坑记录
ExportSnapshot 中途失败
OSS 返回 RequestTimeout 因单文件 5 GB 以上。
解决:加 -Dfs.oss.multipart.size=256M -Dfs.oss.multipart.threshold=256M 启用分片上传。
Replication 环回导致重复
现象:同一条数据在本地和云端各写 3 次。
根因:未排除历史分区,RowKey 范围重叠。
解决:在 peer 配置 config.setExcludeNamespaces("his"); 并新建 his 命名空间存放只读历史表。