HBase Replication 流程介绍 与 可靠性测试

1.  Replication 大致流程

从RS的选取:

  主机群根据提供给它的从集群zk群组,扫描/hbase/rs目录来发现所有可用的从RS,然后随即挑选一部分服务器来复制数据(默认10%)。例如,当从集群有150台RS,15台会被选取;从集群有5台RS,一台会被选取。

日志复制的Position追踪:

  每个主RS在zk中都有一个znode,该znode中都包含一个需要处理的HLog队列(/hbase/replication/rs/hbase12.hadoop,60020,1385024790434/2/...)。每个队列都会跟踪RS创建的HLog,不同队列,大小可能不同。

  每次日志滚动后,新的HLog也会添加到znode的同步队列中,即保证所有的资源都知道有新的HLog需要复制到自己的集群中。当复制线程从日志文件读不到新的日志条目,并且队列中还有其他文件的路径,说明该文件也被读完并且没有后续数据写入了,即它可以被丢弃; 如果读到当前文件的末尾,且该文件仍正在被写入,该文件不能被删除。

另外一种情况:日志归档。归档的日志分三种情况处理:

1> 如果一个源已经同步了这个日志,便会忽略这条信息。

2> 如果这个文件在队列中,那么更新其路径。

3> 如果日志正在被同步,且修改是原子性的,读进程会在文件移动完毕之后进行。

读取与过滤数据:

  理想情况下,日志文件应该被迅速读取并发送到从RS,以达到最小的同步延迟。实际是受限两种情况:
1) 读取的日志需要过滤,只有被分为GLOBAL类并且不属于ROOT,META表日志的KeyValue会被保留。
2) 默认主机群读取日志信息到Buffer达到 64MB 后才会发往从集群。(如果有3个从集群,则需要缓存192MB的数据,才能开始发送)

清理日志:

  如果没有启用同步复制,Master的日志清理线程会按照配置的生存期(TTL)删除旧的日志。那么开启了同步复制之后,就不能这样做,因为超过了生存期的日志有可能还在同步队列中。所以清理线程会先找到超过生存期的日志文件,然后判断这些日志是否在同步队列中,如果在先缓存起来,否则日志会被删除。

2. Replication 异常处理

从RS异常:

1> 如果正在同步的从RS出现了异常(假死,挂了……),它不再响应主RS的同步请求,主RS会先睡眠然后重试(次数可配置),重试完毕还是不行,则重选从RS.
2> 如果从集群的所有RS出现了异常,WAL会回滚日志并存储在zk同步队列里。日志被主RS归档起来,并更新同步队列里日志的路径。当从集群可用后,缓冲区的修改会被同步,主机群积压的日志接着同步。

主RS异常:

主集群的每台RS都会为其他的RS保留一个监听器(watcher),以便当其他的服务器崩溃时收到通知。当主机群的某台RS崩溃,其他的RS都会竞争着为宕机RS创建一个叫做lock的znode,该znode包含宕机RS的复制队列。创建成功的RS会把队列添加到自己的复制队列中,这个新队列的名字为集群ID附加宕机RS的名称。一旦完成,为这个队列新建一个ReplicationSource。

集群正常工作时,ZK的状态如下:

这时 1.1.1.2这台RS突然下线,ZK会第一时间watch到这个动作,最先发现的集群中的某台(1.1.1.3)rs将其在Replication/rs下对应的lock住,并将其考到自己的节点之下。其他的RS(1.1.1.1)发现其被lock后就不做动作。

1.1.1.3启动一个新的线程处理掉所有未被同步的hlog.保证数据不丢失。

3. Replication 实际测试:

主从复制模式: dev81, dev82, dev83 => test88.hadoop, test89.hadoop, test90.hadoop, test91.hadoop
1> 单线程写HBase, TPS 800左右
模拟主RS宕机
过程:
1. dev82宕机 10分钟,然后重启;
2. dev81, dev83宕机 5 分钟,然后重启;
3. 等待5分钟,然后停止数据写入,开始校验数据
主机群:写入数据 836506 row(s)
从集群:写入数据 836506 row(s)

模拟从RS宕机
过程(包括极端情况):
1. test88 宕机10分钟,然后重启;
2, test89,test91宕机3分钟,然后重启;
3, test89,90,91 宕机5分钟,然后重启;
4. test88, 89, 90, 91 宕机5分钟, 然后重启; 中间意外出现Master宕机,立即重启
PS:重启后,出现一波明显的高TPS访问量
5. 等待5分钟,然后停止数据写入,开始校验数据
主机群:写入数据 2031251 row(s)
从集群:写入数据 2031251 row(s)

2> 多线程写HBase, TPS > 4000
模拟主RS宕机
过程-1:
1. dev81宕机 5分钟,dev82宕机 5分钟,然后都重启
2. 等待3分钟,然后停止数据写入,开始校验数据
主机群:写入数据 2541713 row(s)
从集群:写入数据 2541713 row(s)
过程-2 (极端情况-1):
1. 运行25分钟,然后 dev81,82,83 全部宕机
2. 等待1分钟,然后逐步启动 dev81, 82, 83
3. 等待3分钟,然后停止数据写入,开始校验数据
主机群:写入数据 5721059 row(s)
从集群:写入数据 6238011 row(s)
PS: (极端情况-2) 再次重现这个问题时,只是在开始写数据5分钟后,让dev81,82,83全部宕机,然后在全部重启,停止写数据,check,数据一致!
PS: (极端情况-3) 再次重现这个问题时,在开始写数据20分钟后,让dev81,82,83全部宕机,然后在全部重启,停止写数据,check:
主机群:写入数据 3743198 row(s)
从集群:写入数据 3787271 row(s)
PS: 主机群全部RS宕机造成的结果无法预料,所以数据很可能不一致。

模拟从RS宕机
过程:
1. test88 宕机5分钟,然后重启;
2. test89,test91宕机3分钟,然后重启;
3. test88, 89, 90, 91 宕机10分钟, 然后重启;
4. 等待5分钟,然后停止数据写入,开始校验数据
主机群:写入数据 6464858 row(s)
从集群:写入数据 6464858 row(s)

正常情况下
主机群:写入数据 8518936 row(s)
从集群:写入数据 8518936 row(s)

通过详细测试,得出结论如下:
1. 在整个复制过程中,如果没有任何异常的情况下,主从集群数据最终一致。
2. 在整个复制过程中,不管从集群发生了任何异常,宕机一台or全部宕机,只要从集群恢复之后,经过一段时间,主从集群数据最终一致。
3. 在整个复制过程中,如果主机群部分RS宕机,不影响主从集群数据最终一致。
4. 在整个复制过程中,如果主机群RS全部宕机,主从集群数据最终可能不一致。

主主模式 : dev81, dev82, dev83 <=> test88.hadoop, test89.hadoop, test90.hadoop, test91.hadoop
正常情况下:
Test 1:
dev HBase 写入数据:8116619 row(s)
test HBase 写入数据:8907947 row(s)
Test 2:
dev HBase 写入数据:16373203 row(s)
test HBase 写入数据:15883361 row(s)
通过测试得知:在双写的情况下,数据记录数基本处于不一致的状态。而且相同rowkey的记录,由于写两个集群的timestamp不一样,最终的value值也是不一致的。即开启master-master模式的replication时,不能两边同时写表。

结论:
  HBase的Replication方案的设计目的是容灾,而不是严格意义上的HA。要做到严格意义的HA,必须保证双集群所有数据(包括timestamp)严格一致,即双向同步复制,就像MySQL的Schooner同步复制方案。这点,可能不是HBase的设计初衷。所以我们线上HBase双集群复制方案,目的是集群数据双向容灾。对于应用来说,仍然是connect到一个集群,只有在发生灾难的时候,才会临时切到另一个集群。这应该足够满足HBase的可用性了,也可以针对两个集群做读写分离,分别优化配置。

时间: 2024-07-30 07:21:16

HBase Replication 流程介绍 与 可靠性测试的相关文章

Hbase概念流程介绍

一.简介 history started by chad walters and jim 2006.11 G release paper on BigTable 2007.2 inital HBase prototype created as Hadoop contrib 2007.10 First useable Hbase 2008.1 Hadoop become Apache top-level project and Hbase becomes subproject 2008.10 Hb

6.1 网站的开发流程介绍

在上一章中,主要介绍了使用Dreamweaver通过可视化操作来实现网页中的各种元素,既学习了如何使用Dreamweaver在网页中设置页面标题.背景和插入各种对象,又学习了使用Dreamweaver来创建表格布局和实现表单页面,还研究了框架相关知识.另外,为了制作出赏心悦目的网页,我们还学习了在Dreamweaver中如何快速地创建和应用样式表. 从本章开始,我们将学习网站设计和布局技术,其中重点是熟悉网站的开发流程,DIV层和表格布局各自的使用场合,以及网站开发的一些经验.技巧:难点是如何进

在线捉鬼游戏开发之一 - 游戏流程介绍与技术选用

看过芒果台某知名节目的朋友们应该对“谁是卧底”不会陌生:N人参与,N-1人拿到同一个词(如馒头),剩余一人拿到另一个词(如包子),N人都只能看到自己的词,故没人知道自己是否和别人描述的不一样.游戏采用轮流发言制,想尽办法描述自己手中的词,让自己不被怀疑,且又不能让真正的卧底猜出自己和别人不一样,直到猜出谁是卧底. 此类游戏的有趣之处在于描述的尺度要拿捏在明确且不点破之间,机器没有人的智慧那么发散,人的参与感就更重要了(不然好比我喜欢的飞行棋,你还真不知道网络对面的对手是不是条狗). 捉鬼 这个游

02-FPGA设计流程介绍——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线——普利斯队长精心奉献 课程目标: 1.了解并学会FPGA开发设计的整体流程 2.设计一个二选一选择器并进行功能仿真.时序仿真以及板级验证 实验平台:芯航线FPGA开发板.杜邦线 实验内容: 良好的文件夹设置以及工程管理是一个好的FPGA设计的基础,在学习之初就建立俩良好的习惯,会少走一些弯路.因此我们首先在新建的工程文件夹下面,分别建立如图2-1所示的子文件夹. 图2-1 FPGA工程子文件夹 上图中,prj为工程文件存放目录:rtl为verilog可综合代码存放目录:testbench

可靠性测试的基础知识

可靠性测试的定义 在规定条件下,规定时间内,软件不引起系统失效的概率 软件系统在规定的时间内以及规定的环境条件下,完成规定功能的能力 可靠性测试的目的 预测软件在实际运行中的可靠性,同时通过测试可以提高整个软件的防错.容错和纠错的能力 可靠性的计算方法 计算机系统的可靠性是制从它开始运行(t=0)到某时刻t这段时间内能正常运行的概率,用R(t)表示. 失效率是指单位时间内失效的元件数与元件总数的比例,以λ表示,当λ为常数时,可靠性与失效率的关系为: R(t)=е^(-λt). 两次故障之间系统能

可靠性测试的基础知识——软件可靠性测试

可靠性测试 可靠性测试概念 对软件可靠性进行定量的评估或验证,为了达到和验证软件的可靠性定量要求而对软件进行的测试 软件可靠性测试的目的 (1)通过在有使用代表性的环境中执行软件,以证实软件需求是否正确实现. (2)为进行软件可靠性估计采集准确的数据,预测软件在实际运行中的可靠性. 估计软件可靠性一般可分为四个步骤,即数据采集.模型选择.模型拟合以及软件可靠性评估.可以认为,数据采集是整个软件可靠性估计工作的基础,数据的准确与否关系到软件可靠性评估的准确度. (3)通过软件可靠性测试找出所有对软

13.1 CentOS系统启动流程介绍

CentOS系统启动流程介绍 本章我们将学习 Linux 启动流程和内核模块管理相关的内容.通过本章我们将学习如下内容: Linux 系统的组成及特点 CentOS 系统的启动流程 开机启动成 grub 的配置和使用 内核功能与内核模块的加载与使用 在学习本章内容之前,需要对之前学习的操作系统知识做一个简单梳理总结,目的是了解 Linux 系统在启动时面临了哪些问题,怎么去解决这些问题.这样我们才能知道为什么启动流程是"这样". 1 2 3 4 5 6 7 8 9 ----------

性能测试之稳定性测试(可靠性测试)

最近两天在系统的复习性能测试方面的知识,结合之前的性能测试经验有了一些总结,希望写出来与大家分享,希望多提宝贵意见,共同进步~ 概念 首先来说说性能测试:性能是软件的一种非功能特性,他关注的不是软件是否完成了特定的功能,而是软件在完成特定功能是展示出来的及时性.及时性从不同的视角代表不同的指标: 用户:响应时间 系统管理员:资源利用率,可扩展性,系统稳定性,系统容量 开发人员:系统架构,数据库设计,设计和代码实现 可见,系统稳定性对系统管理员的意义重大,稳定性的好坏也可以直接影响到最终用户所关心

【OpenHW12参赛手记】ZedBoard-自定义IP核实现+PS成功调用【详细步骤+流程介绍+源码】 转载

文章来源 图片无法复制,请看原文 http://www.eefocus.com/jefby1990/blog/13-03/291975_490bc.html [OpenHW12参赛手记]ZedBoard-自定义IP核实现+PS成功调用[详细步骤+流程介绍+源码] 2013-03-07 17:56:30 分享: (图片请点击查看原图) 软件环境:WIN7_64 + ISE 14.4 (system_edition) 硬件:Zedboard.USB-Cable线 搭建图: 经过前几天的学习,查看数据