写点什么

HBase 数据容灾技术方案

  • 2012-02-13
  • 本文字数:3535 字

    阅读完需:约 12 分钟

HBase 是一个分布式的、非关系型开源数据库。HBase 有如下几个特点:首先 HBase 是 No-SQL 的一个典型实现,提升了系统的可扩展性;其次 HBase 支持线性水平扩展,极大提升了系统的可伸缩性和运算能力;最后 HBase 和 Google 的 BigTable 有异曲同工之妙,底层也是建立在 HDFS(Hadoop 分布式文件系统) 之上,可以搭建在廉价的 PC 机集群上。No-SQL、云计算、海量数据分析的普及,使我们越来越关注系统的可靠性(High Availability),数据容灾 / 数据恢复是高可用系统的一个很重要的技术组成,本文由简入深,一步步搭建一个 HBase 数据集群,并详细说明生产环境如何使用 HBase 数据容灾方案。

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

图二 集群物理架构

先决条件

  1. SSH 协议 [2] Hadoop 集群之间的通讯采用的是 SSH 协议,所以要保证 Master、Slave 之间可以自由的通讯,一般推荐使用无验证通讯
  • 安装 SSH ```

    apt-get install openssh-server
    apt-get install openssh-client

复制代码
- 创建相同用户名的 SSH 公钥 在 master 主机和 slave 机上创建相同的用户 hadoop
复制代码
sudo adduser hadoop
复制代码
- 在主机上生成公私钥 key pair ```
ssh-keygen -t rsa -P ""
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
  • 将 key 值复制到 slave1 和 slave2 上 ```

    scp $HOME/.ssh/id_rsa.pub hadoop@slave1:/home/hadoop/.ssh/authorized_keys
    scp $HOME/.ssh/id_rsa.pub hadoop@slave2:/home/hadoop/.ssh/authorized_keys
    scp $HOME/.ssh/id_rsa.pub hadoop@slave3:/home/hadoop/.ssh/authorized_keys

复制代码
这样 master 就可以自由的访问 slave 节点了
2. Java 安装 ```
sudo apt-get install sun-java6-jdk

Hadoop 部署

  1. Hadoop 配置 [3] 下载 Hadoop 0.20.2 版本 [4]
  • hadoop-env.sh ```

    export JAVA_HOME=/usr/lib/jvm/java-6-sun
    export HADOOP_HOME=/home/hadoop/hadoop-0.20.2

复制代码
- master,slaves ```
Master, Slave1, Slave2, Slave3
  • core-site.xml ```

    fs.default.name hdfs://master:9000 hadoop.tmp.dir // 临时文件目录 /data/tmp/hadoop // 注意不要放到 /tmp 目录下
复制代码
- hdfs-site.xml ```
<property>
<name>dfs.replication</name> // 备份文件
<value>1</value>
</property>
  • mapred.xml ```

    mapred.job.tracker master:9001
复制代码
2. 启动 Hadoop hadoop namenode format // 首先需要格式化 namenode

bin/start-all.sh

复制代码
验证服务:MapReduce 管理界面 http://master:50030/jobtracker.jsp
### **HBase 部署 **
1. HBase 配置 下载 HBase 0.90.50 版本 [\[5\]](#_Ref5)
- HBase-env.sh ```
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export HBase_MANAGES_ZK=true //zookeeper 随 HBase 启动
  • HBase-site.xml ```

    HBase.rootdir hdfs://master:9000/HBase // 端口号和名称和 Hadoop 配置一致 HBase.cluster.distributed true dfs.replication 1 HBase.master master HBase.zookeeper.quorum slave1,slave2,slave3
复制代码
2. 启动 HBase 集群 Master 主机上执行 $HBase\_HOEM/bin/start-HBase.sh
{1}
验证:使用 jps 命令查看 HBase 的集群进程
{1}
![](https://static001.infoq.cn/resource/image/b6/f1/b6757f8dcc52737bba7abffab2bf2df1.jpg)
{1}
## HBase 数据容灾
{1}
前面我们已经介绍过,如果 HBase 单个节点出现故障,Zookeeper 会通知 master 主进程,master 会将 HLog 日志进行拆分,分发到其他 RegionServer 上进行数据恢复。HBase 对于单点故障的容错能力还是不错的,但是如果发生多点故障,现有的基本容错功能是远远不够的 (会造成数据丢失)。
{1}
### **HBase Replication 机制 [\[6\]](#_Ref6)**
{1}
HBase 0.90 以后开始支持 Replication 机制,该机制设计的主导思想是基于操作日志 (put/get/delete) 做数据同步,这点很像 MySQL 基于 Binary Log 做 statement-based replication[\[7\]](#_Ref7)。
{1}
如下图所示,客户端的 put/delete 操作会被 RegionServer 写入本地的 HLog 中去,与此同时每个 RegionServer 会将 Hlog 放入对应 znode 上的 Replication 队列,HBase 集群会有一个独立的线程,根据固定大小的 buffer 值,将 HLog 内容推送到 Slave Cluster 集群中的某个 RegionServer 上 (当前版本只支持单个 Slave Cluster 复制),并在将当前复制的偏移量保存在 ZooKeeper 上,整个过程是异步完成的。
{1}
![](https://static001.infoq.cn/resource/image/a3/13/a394ea8cb8cd2a50014e9cb27b724b13.jpg)
{1}
** 图三 HBase 数据同步 **[**\[8\]**](#_Ref8)
{1}
### **HBase Replication 启动 **
{1}
1. HBase-env.sh ```
export JAVA_HOME=/usr/lib/jvm/java-6-sun
export HBase_MANAGES_ZK=<strong>false</strong> //ZooKeeper 独立启动
  1. HBase-site.xml master 集群和 slave 集群的配置需要同时修改
复制代码
<property>
<name>HBase.replication</name>
<value>true</value>
</property>
  1. Shell 启动复制功能
复制代码
add_peer disable 'my_table_name'  // 表名字
alter ' my_table_name ', {NAME => 'family_name', <strong>REPLICATION_SCOPE => '1'</strong>// 修改表 schema
enable ' my_table_name' 

验证:查看 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


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-02-13 00:009322

评论

发布
暂无评论
发现更多内容

Java知识体系!极客学院黑马程序员,BIO和NIO有啥区别

Java 程序员 后端

Java研发岗面试复盘总,4面技术5面HR附加笔试面

Java 程序员 后端

阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段

阿里巴巴云原生

阿里云 云原生 业务中台 云栖大会 BizWorks

Java排序算法面试,黑马java项目一,springboot实战项目源码

Java 程序员 后端

Java架构师必备技能,java程序设计实用教程第五版答案,掌握这个提升路径

Java 程序员 后端

云栖发布|企业级互联网架构全新升级 ,助力数字创新

阿里巴巴云原生

阿里云 云原生 产品升级 云栖大会

Java爬虫爬取视频,尚硅谷笔试答案,最全面试考点与面试技巧

Java 程序员 后端

Java程序员面试中最容易答错的8道面试题,tomcat面试题及答案

Java 程序员 后端

Java技术成长,kafka学习教程,Java开发者面试如何系统复习

Java 程序员 后端

Java日常开发的12个坑,你踩过几个,一招让你拿下seata分布式事务框架

Java 程序员 后端

Java架构师进阶之路,马士兵的java教程,大厂Java面试总结+详细解答

Java 程序员 后端

Java百度云资源,java基础案例教程黑马程序员在线阅读,美团Java面试流程

Java 程序员 后端

Java的Io模型你了解多少?尚硅谷大厂学院课,Java开发面试笔试题大汇总

Java 程序员 后端

Java技术基础知识总结,菜鸟教程mysql,Java重要知识点

Java 程序员 后端

Java教程视频百度网盘,小甲鱼数据结构百度云,腾讯Java面试题

Java 程序员 后端

Java教程百度云最新版,java写脚本教程视频,程序员必须要了解的知识点

Java 程序员 后端

Java程序员面试笔记,极客时间vue开发实战,Java进阶教程视频

Java 程序员 后端

Java数据处理的常用技术,springboot源码解读与原理分析

Java 程序员 后端

Java春招实习面试经验汇总,图灵学院诸葛,Java微服务架构视频下载

Java 程序员 后端

Java框架,黑马java视频教程,面试资料分享

Java 程序员 后端

Java程序员全套,百度三面牛客网猿生活,疯狂膜拜

Java 程序员 后端

Java程序员最新职业规划,尚学堂高琪300集,初级Java工程师面试题

Java 程序员 后端

Java教程百度云最新版,极客时间vip年卡,Java开发者面试如何系统复习

Java 程序员 后端

Java月薪过万要掌握的技能,javajdk下载教程,高级Java工程师面试问题

Java 程序员 后端

Java程序员如何有效提升学习效率,如何化身BAT面试收割机

Java 程序员 后端

Java百度云,springboot实例教程,面试大厂应该注意哪些问题

Java 程序员 后端

Java研发岗必问30+道高级面试题,腾讯,字节等大厂面试真题汇总

Java 程序员 后端

Java数据结构面试题,java架构师指南下载百度,Java工程师面试题及答案

Java 程序员 后端

Java百度云教程,深入java虚拟机百度云,附详细答案

Java 程序员 后端

Java知识体系!java黑马视频和达内,链表反转的两种实现方法

Java 程序员 后端

Java程序员必会!开课吧java高级架构师课程,Java开发大厂面试经验

Java 程序员 后端

HBase数据容灾技术方案_DevOps & 平台工程_李湃_InfoQ精选文章