十、复制

1、复制场景

1.1、现有一个SSD的HBase集群被业务方A访问,业务方A对HBase集群的延迟和可用性要求非常高。现在又收到业务方B的数据分析任务需求,每天定期对表TableX跑数据分析任务。

思路:

用一批成本较低的机器搭建一个离线的HBase集群,然后把表TableX的全量数据导入离线集群,再通过复制把增量数据实时地同步到离线集群。分析任务就跑在离线集群上,既满足了业务方B的需求,又不会对业务方造成任何影响。操作方式大概如下。

1)先确认表TableX的多个Colum Family都已经将REPLICATION_SQCOPE设为1.

2)在SSD集群上添加一条DISABLED复制链路,提前把主集群正在写的HLog堵在复制队列中。

3)对TableX做一个Snapshot,并用HBase内置的ExportSnapshot工具把Snapshot拷贝到离线集群上

4)待Snapshot数据拷贝完成后,从Snapshot中恢复一个TableX表到离线集群

5)打开步骤1中添加的Peer

6)等待peer=100,所有堵住的HLog都被在线集群推送到离线集群,也就是两个集群的复制延迟等于0,就可以开始在离线集群上跑分析任务了。

1.2、HBase集群迁移

1.3、跨HBase的数据备份

1.4、HBase同步到异构的存储系统

2、HBase2.X复制原理

1)客户端将创建Peer的请求发送到Master

2)Master给每一个RegionServer发送Peer请求,直到所有的RS成功创建Peer;否在重试

3)Master返回给HBase客户端

2.1、RegionServer创建Peer的内部实现

1)在创建Peer时,每个RegionServer会创建一个ReplicationSource线程。ReplicationSource首先把正在写的HLog保存在复制队列中,然后注册监听HLog Roll操作。如果把HLog发生了Roll,那么ReplicationSource会把对应的HLog分到对应的待复制HLog队列里面,同时把HLog名字持久化到Zk上,这样重启后还可以接着复制未复制完成的HLog

2)每个待复制HLog队列后面会有一个ReplicationSourceWALReder的线程,不断从队列中取出一个HLog,然后一个个把HLog的Entry读取出来,放到Entry队列里面

3)Entry队列后面还会有一个ReplicationSourceShipper的线程,不断从队列中取出一个Log Entry,交给Peer的ReplicationEndopint,他会把Entry通过RPC发送到Peer集群。Peer集群对应的RS收到请求后解析出Entry,进行数据复制。一次RPC成功后ReplicationSourceShipper会把成功复制的HLog offset写入ZK.以便重启之后,下次还能找到最新的位置开始复制。

你可能感兴趣的:(十、复制)