hbase-0.90.0的一个重要改进是引入了replication机制,使它的数据完整性得到了进一步的保障。
hbase的replication机制很像mysql statement-based replication。它是通过WALEdit和HLog来实现的。当请求发送给master cluster时,HLog日志放入hdfs的同时进入replication队列,由slave cluster通过zookeeper获取并写入slave的表中。目前的版本仅支持一个slave cluster 。
HBase Replication
hbase的replication机制很像mysql statement-based replication。它是通过WALEdit和HLog来实现的。当请求发送给master cluster时,HLog日志放入hdfs的同时进入replication队列,由slave cluster通过zookeeper获取并写入slave的表中。目前的版本仅支持一个slave cluster 。
HBase复制是一种在不同HBase部署中复制数据的方法。它可以作为一种故障恢复的方法,并提供HBase层次的高可用性。
HBase复制中最基本的架构模式是”主推送”(master一push),因为每个region server都有自己的WAL(或HLog),所以很容易保存现在正在复制的位置。正如众所周知的解决方案–Mysql的主/从复制,只使用二进制文件来跟踪修改。一个主集群可以将数据复制到任意数目的从集群,每个region server都会参与复制自己的修改。
来自每个regoin server的HLog是HBase复制的基础,并且只要它们需要将数据复制到从集群,它们就必须被保存到HDFS上。每个region server从它需要的最老的日志开始复制,同时在zookeeper中保存当前恢复的位置来简化错误恢复。每个从集群恢复的位置可能不同,但它们处理的HLog队列内容是相同的。
参与复制的集群的规模可以不对等。主集群会通过随机分配尽量均衡从集群的负载。
解决问题:
参与复制的集群的规模可以不对等。主集群会通过随机分配尽量均衡从集群的负载。
数据管理人员的失误,不可逆的DDL操作。
底层HDFS文件BLOCK块corruption。
短时间过度的读数据对集群造成的压力,增加服务器应对这种情况比较浪费资源。
系统升级,维护,诊断问题会造成集群不可用时间增长。
双写的原子性难以保证。
不可预计的一些原因。(如机房断电,大规模硬件损坏,断网等)
离线应用的MR计算对在线读写造成的较大的延迟影响。
在线备份方案比较
底层HDFS文件BLOCK块corruption。
短时间过度的读数据对集群造成的压力,增加服务器应对这种情况比较浪费资源。
系统升级,维护,诊断问题会造成集群不可用时间增长。
双写的原子性难以保证。
不可预计的一些原因。(如机房断电,大规模硬件损坏,断网等)
离线应用的MR计算对在线读写造成的较大的延迟影响。
对于数据中心的数据冗余的备份方案,目前从一致性,事务性,延迟,吞吐量,数据损失,Failover几个角度来分析有以下几种方案。
简单备份模式
通过定时不定时的Dump出集群数据,保证数据的安全性,通常可以通过snapshot或设置时间戳来dump数据来实现这种方案。
如果方案简介,设计优雅,可以做到对在线数据中心低干扰或无千扰的数据备份。
这种方案缺点也是显而易见的,只是对时间点之前的数据安全性得到保障,如果发生突发事件会导致不可避免的整段时间的数据丢失,为很多人无法接受。
主从模式(Master-Slave)
如果方案简介,设计优雅,可以做到对在线数据中心低干扰或无千扰的数据备份。
这种方案缺点也是显而易见的,只是对时间点之前的数据安全性得到保障,如果发生突发事件会导致不可避免的整段时间的数据丢失,为很多人无法接受。
这种模式比起简单的备份模式多了很多优点,可以通过最终一致性保证数据的一致,数据从主集群到备集群延时较低,异步写入不会对主集群带来性能压力,基本不会产生多少性能的影响,突发事件来临时数据丢失很少,并且主集群的事务在备集群也可以得以保证。
一般通过构造较好的Log系统加上check Point来实现,可以实现读写分离,主集群可以担当读写服务,但备集群一般只承担读服务。
一般通过构造较好的Log系统加上check Point来实现,可以实现读写分离,主集群可以担当读写服务,但备集群一般只承担读服务。
![](https://i-blog.csdnimg.cn/blog_migrate/54ae13b0cf058c1519c52701b863b881.png)
原理总体类似于主从模式,不同的是2个集群可以互相承担写的分离,都可承担读写服务。吞吐量有所欠缺。
2阶段提交
这种方案保证了强一致性和事务,服务器返回给客户端成功,则表明数据一定已经成功备份,不会造成任何数据丢失。每台服务器都可承担读写服务。
但缺点是造成集群延迟较高,总体吞吐下降。
Paxos算法
但缺点是造成集群延迟较高,总体吞吐下降。
基于paxos算法实现的强一致性方案,同一客户端连接的server能保证数据的一致性。
缺点是实现复杂,集群延迟和吞吐随着集群服务器增加而变差。
缺点是实现复杂,集群延迟和吞吐随着集群服务器增加而变差。
主从模式 Replication工作流程
![](https://i-blog.csdnimg.cn/blog_migrate/9447387811c14c5fbc3bfff4712736ae.png)
1、首先 要构建两套hbase集群。
2、编辑主集群中所有机器的 ${HBASE_HOME}/conf/hbase-site.xml
增加如下配置:
2、编辑主集群中所有机器的 ${HBASE_HOME}/conf/hbase-site.xml
增加如下配置:
[XML]
纯文本查看 复制代码
01 | < property > |
02 | < name >hbase.replication</ name > |
03 | < value >true</ value > |
04 | </ property > |
修改完成后,重启HBase主集群,使配置生效。
3、在HBase shell中运行如下命令:
[XML]
纯文本查看 复制代码
01 | hbase(main):001:0>add_peer 'ID' 'CLUSTER_KEY' |
02 | hbase(main):002:0>start_replication |
第一条命令是为从集群设置zookeeper集群信息,这样可以使得修改被同步到从集群上。
第二条命令真正将修改过的记录发布到从集群上。为了保证工作能按照预期进行,用户必须保证已经在从集群上建立了一个相同的表的副本,表可以为空,但必须有相同的模式和表名。
第二条命令真正将修改过的记录发布到从集群上。为了保证工作能按照预期进行,用户必须保证已经在从集群上建立了一个相同的表的副本,表可以为空,但必须有相同的模式和表名。
注意:
hbase-0.96和hbase-0.98已经没有了 start_replication命令和
stop_replication命令。hbase-0.98相较hbase-0.96,新增了 set_peer_tableCFs, show_peer_tableCFs命令。在设定复制时,hbase-0.98需要使用 set_peer_tableCFs设置。具体的有对应的帮助命令可供参考。
ID必须是一个短整数,CLUSTER_KEY的内容请参考以下模板:
hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent
比如, zk.server.com:2180:/hbase
hbase-0.96和hbase-0.98已经没有了 start_replication命令和
stop_replication命令。hbase-0.98相较hbase-0.96,新增了 set_peer_tableCFs, show_peer_tableCFs命令。在设定复制时,hbase-0.98需要使用 set_peer_tableCFs设置。具体的有对应的帮助命令可供参考。
ID必须是一个短整数,CLUSTER_KEY的内容请参考以下模板:
hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent
比如, zk.server.com:2180:/hbase
注意:如果两个集群使用相同的zookeepe集群,你不得不使用不同的
zookeeper.znode.parent,因为它们不能写入相同的文件夹中。
zookeeper.znode.parent,因为它们不能写入相同的文件夹中。
![](https://i-blog.csdnimg.cn/blog_migrate/d1750d10d75c00a6721a3fc77f68b35e.png)
4、一旦你有一个对等(从)集群,你需要在你的列簇上使复制可用,要想达到这样的效果,可以在HBase shell中执行如下命令:
[XML]
纯文本查看 复制代码
01 | hbase(main):005:0>disable 'your_table' |
02 | hbase(main):006:0>alter 'your_table',{NAME=>'family_name', |
03 | REPLICATION_SCOPE=>'1'} |
04 | hbase(main):007:0>enable 'your_table' |
scope值为0(默认值),意味着它不会被复制,而scope值为1意味着它将被复制。
5、运行如下命令可以列出所有配置的对等(从)集群:
[XML]
纯文本查看 复制代码
01 | hbase(main):008:0>list_peers |
6、运行如下命令将使对等(从)集群不可用:
[XML]
纯文本查看 复制代码
01 | hbase(main):009:0>disable_peers 'ID' |
运行完命令后,HBase将停止将向对等(从)集群发送修改,但是它将一直跟踪所有新的WALs文件,以便当从集群可用时继续复制。
7、可以运行如下命令,将使之前设置为不可用的对等(从)集群可用:
[XML]
纯文本查看 复制代码
01 | hbase(main):010:0>enable_peer 'ID' |
8、运行下面的命令,可以移除一个从集群:
[XML]
纯文本查看 复制代码
01 | hbase(main):011:0>stop_replication |
02 | hbase(main):012:0>remove_peer 'ID' |
需要注意的是,停止复制仍会完成所有已在队列里的修改的复制,但是之后所有的处理都被停止了。为了确认你的配置都正常工作,你可以查看任何一个region server的日志文件,看是否有类似下面几行的内容:
[XML]
纯文本查看 复制代码
01 | Considering 1 rs,with ratio 0.1 |
02 | Getting 1 rs from peer cluster # 0 |
03 | Choosing peer 10.10.1.49:62020 |