同步复制

93.背景

HBase 中的当前复制异步。因此,如果主集群崩溃,则从集群可能没有最新数据。如果用户想要强一致性,那么他们就无法切换到从属群集。

94.设计

请参阅 HBASE-19064 上的设计文档

95.运行和维护

Case.1 设置两个同步复制集群

  • 在源集群和对等集群中添加同步对等体。

对于源群集:

  1. hbase> add_peer '1', CLUSTER_KEY => 'lg-hadoop-tst-st01.bj:10010,lg-hadoop-tst-st02.bj:10010,lg-hadoop-tst-st03.bj:10010:/hbase/test-hbase-slave', REMOTE_WAL_DIR=>'hdfs://lg-hadoop-tst-st01.bj:20100/hbase/test-hbase-slave/remoteWALs', TABLE_CFS => {"ycsb-test"=>[]}

对于对等集群:

  1. hbase> add_peer '1', CLUSTER_KEY => 'lg-hadoop-tst-st01.bj:10010,lg-hadoop-tst-st02.bj:10010,lg-hadoop-tst-st03.bj:10010:/hbase/test-hbase', REMOTE_WAL_DIR=>'hdfs://lg-hadoop-tst-st01.bj:20100/hbase/test-hbase/remoteWALs', TABLE_CFS => {"ycsb-test"=>[]}

对于同步复制,当前实现要求源和对等集群具有相同的对等 ID。另一件需要注意的事情是:peer 不支持集群级,命名空间级或 cf-level 复制,现在只支持表级复制。

  • 将对等集群转换为 STANDBY 状态
  1. hbase> transit_peer_sync_replication_state '1', 'STANDBY'
  • 将源群集转换为 ACTIVE 状态
  1. hbase> transit_peer_sync_replication_state '1', 'ACTIVE'

现在,已成功设置同步复制。 HBase 客户端只能请求源集群,如果请求到对等集群,现在处于 STANDBY 状态的对等集群将拒绝读/写请求。

Case.2 备用集群崩溃时的操作方法

如果备用群集已崩溃,则无法为活动群集写入远程 WAL。因此我们需要将源集群转移到 DOWNGRANDE_ACTIVE 状态,这意味着源集群将不再编写任何远程 WAL,但正常复制(异步复制)仍然可以正常工作,它会对新写入的 WAL 进行排队,但复制块直到对等集群回来。

  1. hbase> transit_peer_sync_replication_state '1', 'DOWNGRADE_ACTIVE'

一旦对等集群返回,我们就可以将源集群转移到 ACTIVE,以确保复制是同步的。

  1. hbase> transit_peer_sync_replication_state '1', 'ACTIVE'

Case.3 当活动集群崩溃时如何操作

如果活动集群已崩溃(现在可能无法访问),那么让我们将备用集群转移到 DOWNGRANDE_ACTIVE 状态,之后,我们应该将所有请求从客户端重定向到 DOWNGRADE_ACTIVE 集群。

  1. hbase> transit_peer_sync_replication_state '1', 'DOWNGRADE_ACTIVE'

如果崩溃的集群再次返回,我们只需要将其直接转移到 STANDBY。否则,如果将群集传输到 DOWNGRADE_ACTIVE,则原始 ACTIVE 群集可能具有与当前 ACTIVE 群集相比的冗余数据。因为我们设计同时编写源群集 WAL 和远程群集 WAL,所以源群集 WALs 可能比远程群集具有更多数据,这导致数据不一致。将 ACTIVE 转换为 STANDBY 的过程没有问题,因为我们将跳过重放原始的 WAL。

  1. hbase> transit_peer_sync_replication_state '1', 'STANDBY'

之后,我们现在可以将 DOWNGRADE_ACTIVE 集群提升为 ACTIVE,以确保复制是同步的。

  1. hbase> transit_peer_sync_replication_state '1', 'ACTIVE'