云HBase通过master节点自动切换、数据两副本、快速自动failover等手段最大程度的保证了HBase实例服务和数据可用性,但是面对可用区级别的断电、断网及其他极端故障单个HBase集群无法满足用户的高可用要求,针对跨可用区灾备需求我们提供了跨可用区的HBase同城主备容灾,提供混合场景(云实例同云实例、云实例同自建实例以及自建与自建实例)下的故障一键、透明、快速切换能力。
产品优势
支持云HBase、EMR HBase、自建HBase混合主备。
零代码改造,支持1.x、2.x多个版本。
自动数据同步管理,高效双向同步,延迟在百毫秒级。
故障自动容错。
主备控制台,可显示同步延迟、客户端链接数、主备状态等重要信息。
架构说明
用户主备HBase实例分别部署在不同可用区,使用BDS数据通道服务完成主备实例之间实时增量数据双向同步,同时在BDS上进行主备切换操作,用户通过alihbase-connector访问HBase实例,alihbase-connector监听主备实例zk集群的切换事件完成实例切换,切换过程对上层业务透明。
使用限制
当前仅支持相同VPC内跨可用区部署方式。
2019年9月18日后购买的BDS服务支持该功能。
主备实例数据同步目前使用最终一致性模型,暂时不支持强一致模型。
目前只支持HBase服务切换,不支持phoenix,solr切换。
操作步骤
购买HBase集群,如已购买请执行步骤2,如未购买请参考购买集群。
登录云数据库HBase控制台。
在集群列表页面,单击集群名称,进入集群详情页。
在实例信息页面在左侧导航栏选择数据库连接,查看VPC ID。
购买LTS实例,如已经购买可以忽略,如未购买可以到购买链接页面购买BDS实例,BDS实例需要同HBase在相同VPC网络下,并且同主备HBase实例不在相同可用区,如果没有多余可用区BDS建议购买在备实例所在可用区,购买好的BDS实例如下。
添加白名单
主备HBase实例以及BDS实例都要添加客户端的白名单,否则客户端无法访问相应的实例,添加白名单方法参见设置白名单。
自建实例网络打通
当关联自建实例时,BDS需要能够访问自建实例,这里以EMR HBase实例为例(用户自己购买ECS自建实例情况时一致的),需要在部署HBase的ECS实例安全组中为BDS的节点授权,进入LTS页面,选择配置管理,单击生成安全组规则,会下载xxxx_securityrule.json的文件到本地:在EMR控制台 > 集群管理找到对应的集群 > 单击详情:找到安全组(如果是完全自建HBase集群找到ECS实例的安全组)> 单击安全组名称:在安全组中选择导入:选择刚才下载的xxxx_securityrule.json文件,开始导入安全组规则:导入完成后BDS有权限可以访问自建HBase的相关端口;自建HBase实例需要在BDS中绑定实例节点的host信息。进入bds页面,选择配置管理,配置bds.conf.hosts后,单击修改:EMR的hosts信息可以登入到EMR的集群的ECS上查看/etc/hosts查看IP和域名,域名规则一般是emr-header-x.cluster-xxx/emr-worker-x.cluster-xxx
控制台新增高可用实例
进入集群列表页面,单击新购买的bds实例:选择高可用管理,添加高可用实例:如果主备实例都是云HBase实例,则可以直接选择相应的实例名(对于增强版实例需要填写用户名和密码),如果备实例为新实例,高可用服务可以支持一键迁移功能,可以选择同步类型实例级别(同步主实例中全部表)和表级别(指定需要同步的表,表名按,号分隔),如果备实例是已有实例同时已经开启了实时同步,可以选择无需同步跳过数据同步:如果主备实例中存在自建实例,则需要填写自建实例的链接信息,包括自建实例的链接地址(格式为zk1,zk2:port:/hbase),自建实例名(用户自定义),hdfs地址(格式为hdfs://namenode1:port,namenode2:port),HBase根目录(hbase-site.xml的hbase.rootdir配置):单击确认,添加成功后,可以看到新生成高可用实例和高可用实例访问地址:
切换管理
单击管理(用户名和密码可以在数据库链接 > 重置UI访问密码中进行设置)可以跳到管理页面,如果选择了数据同步,可以在管理页面上看的主备实例实时数据双向同步的点位,同时也可以看到历史数据的同步进度,历史数据同步完成且实时点位正常更新就说明数据迁移成功:i可以单击切换,进行实例之间的切换操作,操作成功后,可以看到Active状态的变化:
Java API访问
准备
在高可用管理页面获取高可用链接地址和高可用实例ID:
hbase2.X版本使用客户端,需要添加alihbase-endpoint依赖
<dependency>
<groupId>com.aliyun.hbase</groupId>
<artifactId>alihbase-endpoint</artifactId>
<version>2.8.3</version>
</dependency>
配置客户端参数
您可以通过以下两种方式,来配置客户端参数:
方式一:配置文件
<configuration>
<!-- 高可用链接地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>HOST:PORT</value>
</property>
<!--
高可用实例ID
-->
<property>
<name>haclient.cluster.id</name>
<value>ha-xxxxxx</value>
</property>
<!--
如果需要连接HBase增强版,需要设置用户名和密码,默认均为root,可根据实际情况调整
-->
<property>
<name>hbase.client.username</name>
<value>testuser</value>
</property>
<property>
<name>hbase.client.password</name>
<value>password</value>
</property>
</configuration>
配置信息可以在高可用管理页面中获取:
方式二:代码
通过代码Create Configuration,然后增加相关配置
// 新建一个Configuration
Configuration conf = HBaseConfiguration.create();
// 高可用链接地址
conf.set("hbase.zookeeper.quorum", "HOST:PORT");
// 高可用实例ID
conf.set("haclient.cluster.id", "ha-xxxxxx");
// 设置用户名和密码,默认均为root,可根据实际情况调整
conf.set("hbase.client.username", "testuser")
conf.set("hbase.client.password", "password")
//一键切换API
ClusterSwitcher clusterSwitcher = new ClusterSwitcher(conf);
//switch to standby
clusterSwitcher.switchToStandby();
创建连接
通过配置conf创建Connection,然后访问HBase。
// 创建 HBase连接,在程序生命周期内只需创建一次,该连接线程安全,可以共享给所有线程使用。
// 在程序结束后,需要将Connection对象关闭,否则会造成连接泄露。
// 也可以采用try finally方式防止泄露
Connection connection = ConnectionFactory.createConnection(conf);
新建表
使用haclient,支持使用API,在主备实例上新建表,新建表会实时在Active实例上进行创建,同时会生成异步任务在standby实例上进行创建,并且会对更新实时同步任务更新,可以在高可用实例管理页面进行查看: