hbase,
HBase在完全分布式环境下,由Master进程负责管理RegionServers集群的负载均衡以及资源分配,ZooKeeper负责集群元数据的维护并且监控集群的状态以防止单点故障,每个RegionServer会负责具体数据块的读写,HBase所有的数据存储在HDSF系统上。
图一 HBase逻辑架构[1]
HBase集群部署
HBase集群物理架构
物理机
192.168.0.105 Master Ubuntu Desktop 11.10 Desktop 192.168.0.102 Slave1 Ubuntu Desktop 11.10 Desktop 192.168.0.103 Slave2 Ubuntu Desktop 11.10 Desktop 192.168.0.104 Slave3 Ubuntu Desktop 11.10 Desktop 192.168.0.101 Recover Ubuntu Desktop 11.10 Desktop
图二 集群物理架构
先决条件
Hadoop部署
验证服务:MapReduce管理界面http://master:50030/jobtracker.jsp
HBase部署
验证:使用jps命令查看HBase的集群进程
HBase数据容灾
前面我们已经介绍过,如果HBase单个节点出现故障,Zookeeper会通知master主进程,master会将HLog日志进行拆分,分发到其他RegionServer上进行数据恢复。HBase对于单点故障的容错能力还是不错的,但是如果发生多点故障,现有的基本容错功能是远远不够的(会造成数据丢失)。
HBase Replication机制[6]
HBase 0.90以后开始支持Replication机制,该机制设计的主导思想是基于操作日志(put/get/delete)做数据同步,这点很像MySQL基于Binary Log做statement-based replication[7]。
如下图所示,客户端的put/delete操作会被RegionServer写入本地的HLog中去,与此同时每个RegionServer会将Hlog放入对应znode上的Replication队列,HBase集群会有一个独立的线程,根据固定大小的buffer值,将HLog内容推送到Slave Cluster集群中的某个RegionServer上(当前版本只支持单个Slave Cluster复制),并在将当前复制的偏移量保存在ZooKeeper上,整个过程是异步完成的。
图三 HBase数据同步[8]
HBase Replication启动
验证:查看RegionServer的日志
Considering 1 rs, with ratio 0.1 Getting 1 rs from peer cluster # 1 Choosing peer 192.168.0.101:62020
数据校验
为了保证数据一致性,生产环境上做异地容灾需要增加数据校验/数据监控。HBase的Replication机制,根据官方的文档提供了数据比对的工具类VerifyReplication[9]。我们可以将其功能包装起来,做自动化校验。下面是代码片段:
final String[] argumentsArray = new String[] {
"--starttime=xxxxxxxxxxx", //开始时间戳根据具体的业务需要
"--stoptime=" + new Date().getTime(), //选取当前时间戳作为结束的时间戳
"1", //peer node id
"my_table_name" //表名
};
final Timer timer = new Timer();
timer.schedule(new TimerTask() {@Override
public void run() {
try {
Configuration conf = HBaseConfiguration.create();
Job job = VerifyReplication.createSubmittableJob(conf, argumentsArray);
job.waitForCompletion(true);
long value = job.getCounters().findCounter(VerifyReplication.Verifier.Counters.BADROWS).getValue();
if (value > 0) {
Logger.getLogger("Finding Unmatched Rows! " + value);
}
} catch (Exception e) {
//异常处理策略
final String msg = "Comparing Job Error!";
Logger.getLogger(this.getClass()).error(msg, e);
try {
SMTPClientWrapper.send("xxx@xxx.com", "HBase replication error!", msg);
} catch (Exception e1) {
//考虑邮件服务器down机, failover
Logger.getLogger(this.getClass()).error("send alarm email error!", e);
}
}
}
}, 0, 600000); //十分钟校验一次
小结与展望
HBase的Replication机制,为增强系统可靠性提供了有力支持,但目前单节点Slave Cluster复制会增加系统的负荷并间接形成Slave Cluster的数据热点,期待HBase后续的版本支持多节点Slave Clusters复制。
引用
[1] http://ofps.oreilly.com/titles/9781449396107/intro.html
[2] http://en.wikipedia.org/wiki/Secure_Shell
[3] http://hadoop.apache.org/common/docs/current/cluster_setup.html
[4] http://hadoop.apache.org/common/releases.html#Download
[5] http://www.apache.org/dyn/closer.cgi/HBase/
[6] http://HBase.apache.org/replication.html
[7] http://dev.mysql.com/doc/refman/5.1/en/replication-formats.html
[8] http://HBase.apache.org/replication.html
[9] http://HBase.apache.org/xref/org/apache/hadoop/HBase/mapreduce/replication/VerifyReplication.html