【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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:009093

评论

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

flutter系列之:按比例缩放的AspectRatio和FractionallySizedBox

程序那些事

flutter 程序那些事 6月月更

Java—JVM II

武师叔

6月月更

GNU/Linux知识库(1)- 历史和演变

冯亮

Linux DevOps GNU

学生管理系统的考试试卷存储方案

爱晒太阳的大白

作为神经搜索生态的开创者,Jina AI 在做什么?

Jina AI

Python 深度学习 开源 云原生 搜索

使用统计数据消除生活中的无谓

宇宙之一粟

贝叶斯公式 6月月更

Vue-13-Vif和Vshow的区别

Python研究所

6月月更

稳了github star突破9k即时通讯IM开源项目OpenIM版本发布-生产环境重点关注

Geek_1ef48b

InfoQ 极客传媒 15 周年庆征文|Vim 常用快捷键

耳东@Erdong

vim 运维 快捷键 6月月更 InfoQ极客传媒15周年庆

BOM

Jason199

js BOM 6月月更

HashSet与WeakHashMap的理解

源字节1号

uni-app进阶之模版语法与数据绑定【day7】

恒山其若陋兮

6月月更

成为架构师需要点亮哪些知识树

奔向架构师

数据仓库 架构师 6月月更

什么是 IPv6?IPv6有哪些优势?

wljslmz

ipv6 IP地址 网络技术 6月月更

【LeetCode】乘积小于 K 的子数组Java题解

Albert

LeetCode 6月月更

统一返回结果

卢卡多多

返回值 6月月更

JavaScript基础语法知识遨游记

未见花闻

6月月更

【Python技能树共建】with...as... 实战

梦想橡皮擦

Python 6月月更

数据库每日一题---第16天:计算特殊奖金

知心宝贝

数据库 云计算 前端 后端 6月月更

【愚公系列】2022年06月 通用职责分配原则(六)-多态原则

愚公搬代码

6月月更

字节Pico走“小”路

科技新知

读书笔记之:如何有效阅读

甜甜的白桃

读书笔记 读书 笔记 6月月更

模拟红绿灯来看GetX的定向刷新

岛上码农

flutter ios 前端 安卓 6月月更

市场冷空气来袭,SeekTiger如何逆流而上?

鳄鱼视界

力扣每日一练之数组上篇Day1

京与旧铺

6月月更

微服务稳定性保障

阿泽🧸

微服务 6月月更

开源Star10K+数据库工具Beekeeper上手体验,免费够酷值得拥有!

MegaQi

数据库管理工具 6月月更 #开源项目体验

Java Core 「11」AQS-AbstractQueuedSynchronizer

Samson

学习笔记 Java core 6月月更

leetcode 64. Minimum Path Sum 最小路径和(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

JVM调优简要思想及简单案例-对象的回收与保留

zarmnosaj

6月月更

Docker 实用技巧三

Nick

Docker 容器 实用技巧 6月月更 实操

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