
# 基于Replication能力迁移HBase数据到MRS集群
#### 应用场景
HBase的Replication功能是一种数据同步机制，用于实现不同HBase集群之间的数据异步复制，主要用于提高数据可用性、实现灾难恢复以及满足跨地域数据分发等需求。
HBase Replication基于WAL（Write-Ahead Log，预写日志）机制实现，核心流程如下：
1. 数据写入与WAL记录 客户端写入数据时，HBase先将操作记录到RegionServer的WAL中，再写入MemStore。
   
2. WAL日志复制 主集群（源集群）的RegionServer会将WAL中的日志条目异步发送到从集群（目标集群）。
   
3. 从集群重放日志 从集群接收日志后，按顺序重放这些操作，将数据同步到对应的表中，保证与主集群数据一致。
   
通过HBase Replication功能，可以将开源大数据平台或者自建HBase集群中的数据迁移到MRS集群的HBase中。
- 在目的端恢复快照可以完成元数据和历史数据迁移。
- Replication同步可以将源端WAL文件的数据迁移到目的端，完成增量数据迁移。
图1HBase数据迁移方案   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002407587617.png "点击放大")
#### 迁移调研
迁移HBase数据前需要对源端HBase组件进行调研，以便评估迁移过程中可能会产生的风险、对系统的影响等。调研主要包含HBase组件版本、部署模式、数据存储、性能优化等，具体请参考[表1]。
 表1迁移调研 
| **调研项目** | **调研**内容               | **示例**                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|
| 版本兼容性    | 源端、目标端HBase版本号。        | 基于Apache HBase 2.x版本。                                                                                                                                                                                                                                                                                                                                            |
| 版本兼容性    | 源端、目标端HBase是否兼容标准API。  | 兼容标准API，支持华为云增强功能。                                                                                                                                                                                                                                                                                                                                               |
| 部署模式     | 源端、目标端HBase的部署模式。      | 自建物理/虚拟化集群、云原生服务，支持弹性扩缩容。                                                                                                                                                                                                                                                                                                                                        |
| 数据存储     | 源端、目标端HBase数据存储的存储方式。  | 本地HDFS或S3兼容存储、支持OBS（华为云对象存储），支持冷热数据分离存储。                                                                                                                                                                                                                                                                                                                         |
| 性能优化     | 源端、目标端HBase性能优化策略。     | - 需手动调优Region分布、预分区策略、支持自动负载均衡。  - 智能预分区。  - 支持向量化查询加速。   |
| 监控与运维    | 源端、目标端HBase使用的监控、运维工具。 | 云日志服务LTS、支持自动化运维。                                                                                                                                                                                                                                                                                                                                                |
| 安全性      | 源端、目标端HBase使用的安全性配置。   | SSL加密、Kerberos认证、VPC网络隔离、数据加密传输、细粒度ACL。                                                                                                                                                                                                                                                                                                                          |
   
#### 网络方案
迁移方案支持各种网络选型：公网、VPN、专线等。根据实际情况选择网络方案，两端网络互通即可迁移。
表2网络方案 
| **迁移网络类型** | **优点**                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | **缺点**                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|:---|
| 专线         | - 性能稳定：时延低至毫秒级。  - 带宽选择范围可达几十Gbit/s。  - 数据传输安全性高。                                                                                                                  | - 成本高：一般是包年包月。  - 源端和目的端私网IP地址不能重叠。  - 开通时间长：一般需提前1个月申请。   |
| VPN        | - 组网灵活，随时搭建。  - 稳定性较好，安全性较好。  - 成本适中：公网费用+VPN费用。                                                                                                                     | - 时延较高。  - 源端和目的端私网IP地址不能重叠。                                                                                                                    |
| 公网IP       | - 支持源端和目的端私网IP一致的情况下实施迁移。  - 带宽任意选择（Mbit/s\~Gbit/s）。  - 即买即用，快速绑定。  - 成本低。   | - 稳定性差：带宽可能无法全部利用，迁移速率相对较慢。  - 公网传输数据有泄漏风险。                                                                                                       |
   
#### 约束与限制
- 通过快照迁移历史数据时，元数据不能变化（会导致WAL文件里的增量数据无法写入原表中）。
- Replication对源端集群有负载，快照数据迁移完成前增量数据积压在源端WAL文件中，可能导致源端磁盘空间被占满。
- 仅支持同内核HBase版本的迁移，例如HBase1.x到HBase1.x、HBase2.x到HBase2.x。
 
#### 迁移前准备
- 已创建包含有HBase组件的MRS集群，并已安装集群客户端。
- 源端集群和目标端集群网络已互通。
- 迁移用户权限已放通。
 
#### 创建源端和目标端表的Replication关系
1. 在源端集群的"/etc/hosts"文件下配置目标集群HBase实例所在节点的主机名与节点IP地址映射关系。
2. 进入源端集群的HBase shell命令执行界面。
3. 设置源端集群和目的端集群的peer关系。 
   ```
   add_peer 'peer_name', CLUSTER_KEY => 'ZooKeeper_IP:Port:/hbase'
   ```
   - peer_name：为该复制关系指定一个唯一标识符，用于后续管理，建议命名具有辨识度。
   
   - ZooKeeper_IP:Port：目标集群的ZooKeeper配置信息，用于源集群定位目标集群的元数据。 如何获取MRS集群的ZooKeeper地址与端口，可以参考[如何获取MRS集群ZooKeeper的IP地址和端口？](https://support.huaweicloud.com/mrs_faq/mrs_03_1071.html)。
     
   
   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002407488757.png "点击放大")
   设置成功后可以执行以下命令查看是否设置成功。
   ```
   list_peers
   ```
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002373849224.png "点击放大")
   如果设置错误执行以下命令进行删除。
   ```
   remove_peer 'peer_name'
   ```
   
   
4. 在源端集群的表中设置replication属性。 
   在HBase shell中执行以下命令：
   ```
   alter '目标表名',{NAME =>'列族名',REPLICATION_SCOPE => '1'}
   ```
   例如假设目标表名为"student"，获取到的列族名为"f"，则执行命令为：
   ```
   alter 'student',{NAME => 'f',REPLICATION_SCOPE => '1'}
   ```
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002407368957.png "点击放大")
   也可以通过以下命令对指定表所有列族开启数据同步。
   ```
   enable_table_replication '目标表名'
   ```
   执行以下命令取消同步。
   ```
   disable_table_replication '目标表名'
   ```
   
   
 
#### 迁移历史HBase数据
1. 给源端集群的HBase表创建快照。 
   在HBase shell中，执行以下命令创建表快照。
   ```
   snapshot '表名','快照名'
   ```
   例如生成表"student"的快照"student_snapshot"。
   ```
   snapshot 'student','student_snapshot'
   ```
   通过查看快照是否生成：
   ```
   list_snapshots
   ```
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002366931958.png "点击放大")
   
   
2. 将源端集群中的快照迁移到目的端MRS集群。 
   ```
   hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ 
     -snapshot <snapshot_name> \
     -copy-to <destination_path> \
     [-mappers <num_mappers>] \ 
     [-bandwidth <mb_per_sec>] \
     [-diff <previous_snapshot>] \
     [-overwrite]
   ```
   - -snapshot \<snapshot_name\>：要导出的快照名称。
   
   - -copy-to \<destination_path\>：目标HDFS路径，跨集群时格式为"hdfs://\<目标NameNode\>:\<NameNode端口\>/path"（需目标集群HDFS可访问）。
     可登录目的端MRS集群的Manager界面，查看HDFS NameNode主节点的IP地址和端口。
     1. 单击"集群 \> 服务 \> HDFS \> 实例"，查看实例列表中"NameNode (hacluster,主)"实例对应的IP地址。
     
     2. 单击"配置"，搜索并查询NameNode端口配置参数"dfs.namenode.rpc.port"。
       
   
   - -mappers \<num_mappers\> ：可选，指定MapReduce任务的Mapper数量，可根据集群资源调整（数据量大时增加）。
   
   - -diff \<previous_snapshot\>： 可选，仅复制当前快照与前一个快照之间的差异数据，适用于增量备份场景。
   
   - -bandwidth \<mb_per_sec\>： 可选，限制传输带宽（单位：MB/s），避免占用过多网络资源。
   
   - -overwrite：可选，若目标路径已存在同名文件，强制覆盖。
   
   
   例如迁移快照"student_snapshot"到目的端MRS集群的"/hbase-snapshot"路径，退出HBase shell，然后执行以下命令：
   ```
   hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot student_snapshot -copy-to hdfs://192.168.1.200:8020/hbase-snapshot
   ```
   
   
3. 将快照数据放置到目的端MRS集群的对应的目录下。 
   1. 由于HBase的archive目录会有定时清理机制，提前检查目标集群中HMaster清理过去HLog文件的周期并适当增大，避免数据复制过程中发生了数据清理。 登录目的端MRS集群的Manager管理界面，单击"集群 \> 服务 \> HBase"，在HBase服务页面单击"配置 \> 全部配置"，搜索"hbase.master.cleaner.interval"配置并修改。
      该参数单位为毫秒，例如设置为"600000"（10分钟）。
      
   
   2. 进入目的端MRS集群客户端，将元数据放到"/hbase/.hbase-snapshot"中，将原始数据放到"/hbase/archive"目录中。 如果目标集群中没有对应的目录，则可以提前创建，参考命令如下。
      ```
      hdfs dfs -mkdir -p /hbase/.hbase-snapshot
      ```
      ```
      hdfs dfs -mkdir -p /hbase/archive/data/default/
      ```
      移动导出的snapshot文件到snapshot目录。
      ```
      hdfs dfs -mv 导出的快照目录/.hbase-snapshot/快照名 /hbase/.hbase-snapshot/
      ```
      ```
      hdfs dfs -mv 导出的快照目录/archive/data/default/表名 /hbase/archive/data/default/
      ```
      例如，移动表student快照文件到指定的snapshot目录下。
      ```
      hdfs dfs -mv /hbase-snapshot/.hbase-snapshot/student_snapshot /hbase/.hbase-snapshot/
      ```
      ```
      hdfs dfs -mv /hbase-snapshot/archive/data/default/student /hbase/archive/data/default/
      ```
      
   
   
   
   
4. 在目的端集群中恢复表的快照。 
   进入目的端MRS集群的HBase shell命令执行界面。
   1. 禁用表：
      ```
      disable 'student'
      ```
      
   
   2. 恢复表快照：
      ```
      restore_snapshot '快照名'
      ```
      例如恢复快照名student_snapshot：
      ```
      restore_snapshot  'student_snapshot'
      ```
      
   
   3. 快照恢复完成重新启用表。
      ```
      enable 'student'
      ```
      
   
   
   
   
 
#### 迁移增量HBase数据
恢复快照后，目的端集群上会创建出对应的表，源端集群上设置的replication关系会自动开始将之前保留的WAL日志的操作同步至目标集群的表中，开始增量数据同步。
可在HBase shell命令执行界面执行如下命令查看同步情况：
```
status 'replication'
```
#### 数据校验
在源端和目的端集群检查数据是否一致。
例如通过执行select count (1)命令来对比表的行数。
```
select count (1) from student;
```
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002367091858.png "点击放大")
#### 数据迁移后清除设置
1. 在源端集群的"/etc/hosts"文件下删除目的端集群HBase实例所在节点的主机名与节点IP地址映射关系。
2. 进入源端集群的HBase shell命令执行界面。
3. 清理复制关系。 
   1. 查看已设置的复制关系。
      ```
      list_peers
      ```
      
   
   2. 删除指定复制关系。
      ```
      remove_peer 'peer_name'
      ```
      
   
   3. 取消表同步。 查询表是否设置了同步状态。
      ```
      desc '目标表名'
      ```
      通过如下命令取消同步：
      ```
      alter '目标表名',{NAME => '目标表对应的列族名',REPLICATION_SCOPE => '0'}
      ```
      或者直接执行：
      ```
      disable_table_replication '目标表名'
      ```
      
   
   
   
   
 
