hbase 学习(十三)集群间备份原理

集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份结构一样,只有一个日志来跟踪。一个master集群可以向多个slave集群推送,收到推送的集群会覆盖它本地的edits日志。

这个备份操作是异步的,这意味着,有时候他们的连接可能是断开的,master的变化不会马上反应到slave当中。备份个格式在设计上是和mysql的statement-based replication是一样的,全部的WALEdits(多种来自Delete和Put的Cell单元)为了保持原子性,会一次性提交。

HLogs是region server备份的基础,当他们要进行备份时必须保存在hdfs上,每个region server从它需要的最老的日志开始进行备份,并且把当前的指针保存在zookeeper当中来简化错误恢复,这个位置对于每一个slave 集群是不同的,但是对于同一个队列的HLogs是相同的。

下面这个是设计的结构图:

9f192e5d010323fe7b87347a576ad0dfd862dadb

下面我们了解一下master和一个slave节点的整个过程。

1)当客户端通过api发送Put、Delete或者ICV到region server,这些KeyValue被转换成WALEdit,这个过程会被replication检测到,每一个设置了replication的列族,会把scope添加到edit的日志,然后追加到WAL中,并被应用到MemStore中。

2)在另一个线程当中,edit被从log当中读取来,并且只有可以备份的KeyValues(列族为scoped为GLOBAL的,并且不是catalog,catalog指的是.META. 和 -ROOT-)

3-1)这个edit然后被打上master群集的UUID,当buffer写满的时候或者读完文件,buffer会发到slave集群的随机的一个region server同步的,收到他们的region server把edit分开,一个表一个buffer,当所有的edits被读完之后,每一个buffer会通过HTable来flush,edits里面的master集群的UUID被应用到了备份节点,以此可以进行循环备份。

4-1)回到master的region server上,当前WAL的位移offset已经被注册到了zookeeper上面。

3-2)这里面,如果slave的region server没有响应,master的region server会停止等待,并且重试,如果目标的region server还是不可用,它会重新选择别的slave的region server去发送那些buffer。

同时WALs会被回滚,并且保存一个队列在zookeeper当中,那些被region server存档的Logs会更新他们在复制线程中的内存中的queue的地址。

4-2)当目标集群可用了,master的region server会复制积压的日志。

下面是一些具体的操作:

假设zookeeper当中的节点是/hbase/replication , 它会有三个子节点。

/hbase/replication/state
/hbase/replication/peers
/hbase/replication/rs

The State znode

state节点是记录是否可以进行备份的,它里面记录这个一个boolean值,true或者false,它是由hbase.replication决定的,同事它会在ReplicationZookeeper当中缓存,它还会因为在shell中执行了stop_replication而改变

/hbase/replication/state [VALUE: true]

The Peers znode

这个节点下面记录着所有需要备份的集群和他们当前的备份状态,如下:

/hbase/replication/peers/1 [Value: zk1.host.com,zk2.host.com,zk3.host.com:2181:/hbase]/2 [Value: zk5.host.com,zk6.host.com,zk7.host.com:2181:/hbase]
peer的id是自己在add_peer时候,自己提供的,后面的value是slave集群所使用的zookeeper集群,最后是所在的znode的父节点。

在每一个peer节点的下面还有一个表示状态的节点:

/hbase/replication/peers/1/peer-state [Value: ENABLED]/2/peer-state [Value: DISABLED]

The RS znode

rs的节点下面包括了复制的region server以及需求复制的HLog的队列,看图就知道啦!

第一层节点记录着region server的机器名,端口号以及start code。

/hbase/replication/rs/hostname.example.org,6020,1234/hostname2.example.org,6020,2856

下一层是需求复制的HLog的队列:

/hbase/replication/rs/hostname.example.org,6020,1234/1/2

队列里面需要复制的HLog,值是已经被复制的最新的位置position。

/hbase/replication/rs/hostname.example.org,6020,1234/123522342.23422 [VALUE: 254]12340993.22342 [VALUE: 0]
过程是上述的过程,下面展开讲一下具体的细节。

1)选择哪个region server去复制

当master节点准备好备份之后,它首先要通过slave集群的zookeeper,然后查看他们的rs的节点下面有多少可用的rs,然后随机选择他们中的一部分,默认是10%,如果有150个机器的话,会选择15个机器去发送。这个时候是有一个watcher在监视着slave集群的rs下面的变化,如果节点发生了变化,它会通知master节点的region server重发。

2)错误恢复,直接来个实际的例子

一个有3个region server集群正在和一个peer id为2的集群进行备份,每个region server下面都有一个队列

队列中的每个znode都是hdfs上的真实的文件名,“地址,端口.时间戳”。

/hbase/replication/rs/1.1.1.1,60020,123456780/2/1.1.1.1,60020.1234  (Contains a position)1.1.1.1,60020.12651.1.1.2,60020,123456790/2/1.1.1.2,60020.1214  (Contains a position)1.1.1.2,60020.12481.1.1.2,60020.13121.1.1.3,60020,    123456630/2/1.1.1.3,60020.1280  (Contains a position)

现在让1.1.1.2的zookeeper丢失session,观察者会创建一个lock,这个时候1.1.1.3完成了,它会把1.1.1.2的给接手过来,在自己的znode下面创建一个新的znode,并且加上dead的server的名称,就像下面这样子,原来的1.1.1.2的下面多了一层lock,1.1.1.3下面多了一个,和它原始的状态也不一样,前面多了个2。

/hbase/replication/rs/1.1.1.1,60020,123456780/2/1.1.1.1,60020.1234  (Contains a position)1.1.1.1,60020.12651.1.1.2,60020,123456790/lock2/1.1.1.2,60020.1214  (Contains a position)1.1.1.2,60020.12481.1.1.2,60020.13121.1.1.3,60020,123456630/2/1.1.1.3,60020.1280  (Contains a position)2-1.1.1.2,60020,123456790/1.1.1.2,60020.1214  (Contains a position)1.1.1.2,60020.12481.1.1.2,60020.1312
然后1.1.1.3又自己倒腾了一会儿,假设它也挂了,最后的形态会是这样

1.1.1.1把1.1.1.3的未完成事业给接过了过来,所以我们看到1.1.1.1下面有个三手货和几个二手货。。。

/hbase/replication/rs/1.1.1.1,60020,123456780/2/1.1.1.1,60020.1378  (Contains a position)2-1.1.1.3,60020,123456630/1.1.1.3,60020.1325  (Contains a position)1.1.1.3,60020.14012-1.1.1.2,60020,123456790-1.1.1.3,60020,123456630/1.1.1.2,60020.1312  (Contains a position)1.1.1.3,60020,123456630/lock2/1.1.1.3,60020.1325  (Contains a position)1.1.1.3,60020.14012-1.1.1.2,60020,123456790/1.1.1.2,60020.1312  (Contains a position)
原理说完了,从下面说说进行这个备份操作是哪些要求吧

(1)hbase的大的版本要一致

0.90.1 可以向0.90.0推送但是0.90.1不可以向0.89.20100725推送

(2)独立部署的zookeeper集群

(3)集群间的备份的表名和列族都要一致

(4)多个slave集群的话,要0.92以上版本

(5)集群间可以互相访问

(6)集群间的zookeeper.znode.parent不能相同

 要使用这个集群建备份的功能需要先进行以下的设置:

1、修改hbase-site.xml文件

<property><name>hbase.replication</name><value>true</value>
</property>

2、add_peer

输入这个命令,查看它的具体用法,然后添加

3、修改表的REPLICATION_SCOPE

disable 'your_table'
alter 'your_table', {NAME => 'family_name', REPLICATION_SCOPE => '1'}
enable 'your_table'

4、list_peers 查看一下状态

5、备份完成之后如何进行数据校验,VerifyReplication就是专门来处理这个校验的。我们需要提供peer的id还有表名,verifyrep是它的简称,要用hadoop jar来运行。

集群之间备份的网址,说明他们是怎么工作的:

http://hbase.apache.org/replication.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python expect模块_Python基础教程:用Python怎么telnet到网络设备

Python基础教程&#xff1a;用Python怎么telnet到网络设备0.前言Telnet协议属于TCP/IP协议族里的一种&#xff0c;对于我们这些网络攻城狮来说&#xff0c;再熟悉不过了&#xff0c;常用于远程登陆到网络设备进行操作&#xff0c;但是&#xff0c;它的缺陷太明显了&#xff0c;…

Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

[Java教程]动态加载页面数据的小工具 javascript jQuery (持续更新)0 2014-05-07 18:00:06使用该控件&#xff0c;可以根据url&#xff0c;参数&#xff0c;加载html记录模板(包含json参数对应&#xff0c;以及具体记录位置Index根据参数描述加载对应的属性&#xff0c;并可以…

pygame render怎么显示中文_PyGame开发游戏(2D)02.基础图元

这节将介绍PyGame的基础架构。并学习如何在PyGame里绘制各种几何图形和显示加载图片。01.应用框架上一节的示例程序里&#xff0c;我们用到一个PyGame的应用程序框架。这是一个基础框架&#xff0c;利用它我们可以很轻松的添加各类图型绘制&#xff0c;键盘鼠标输入处理和各类逻…

word+增加水印+java_为Word2019文档添加水印的两种方法

水印的类型包括文字水印和图片水印两种。在Word文档中添加文字水印时&#xff0c;可以使用程序中预设的水印效果&#xff0c;而图片水印则需要自定义添加。一、使用程序预设的文字水印Word 2019中预设了机密、紧急、免责声明三种类型的文字水印&#xff0c;用户可根据文件的类型…

如何设置CentOS 7获取动态及静态IP地址

自动获取动态IP地址1.输入“ip addr”并按回车键确定&#xff0c;发现无法获取IP(CentOS 7默认没有ifconfig命令)&#xff0c;记录下网卡名称&#xff08;本例中为ens33&#xff09;。2.输入“cd /etc/sysconfig/network-scripts/”按回车键确定&#xff0c;继续输入“ls”按回…

请求列出指定服务器上的可用功能失败_滥用 ESI 详解(上)

在进行安全性评估时&#xff0c;我们注意到了标记语言 Edge Side Includes (ESI)中的一个意外行为&#xff0c;这种语言用于许多流行的 HTTP 代理(反向代理、负载平衡器、缓存服务器、代理服务器)。我们发现成功的 ESI 攻击可以导致服务器端请求伪造(SSRF)、各种绕过 HTTPOnly …

openstack nova-network 的小bug的排错经历

环境是 nova-network vmwareflatdhcp错误表现为 开出来的虚拟机有一定几率获取不到dhcp地址&#xff0c;手工赋予ip则正常&#xff0c;用flat模式注入的ip正常&#xff0c;下面是排错过程1首先找网络防火墙已经把 dnsmasq对应的端口已经打开抓包结果&#xff1a;可以看到虚拟机…

anaconda base环境_anaconda中安装packages:pip还是conda install?

conda install我就不说了&#xff0c;这都不会别学了就。Using command:$ which -a pip, the terminal will return:This indicates two different pip path to install packages[1].在tf23环境中pip install在base环境中pip install在windows下powershell内&#xff0c;进入到…

【风马一族_xml】xmlp之dtd1

什么是XML约束&#xff1f;在xml技术里&#xff0c;可以编写一个文档来约束一个xml文档的写法&#xff0c;这称之为xml约束 2. 为什么要使用xml约束&#xff1f; 参看提示栏 3. xml约束的作用&#xff1f; 约束xml的写法对xml进行校验4. 常见的xml约束技术 xml dtdxml Schema…

java ssm框架 缓存_SSM框架之MyBatis3专题4:查询缓存

查询缓存的使用&#xff0c;主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化&#xff0c;不再每次均从数据库中查询获取结果数据&#xff0c;从而提高访问速度。MyBatis的查询缓存机制&#xff0c;根据缓存区的作用域(声明周期)可划分为两种&#xff1a;一级查…

matplotlib画图_漂亮,超详细的matplotlib画图基础

来自 | 逐梦erhttps://zhumenger.blog.csdn.net/article/details/106530281本文仅作技术交流&#xff0c;如有侵权&#xff0c;请联系后台删除。数据可视化非常重要&#xff0c;因为错误或不充分的数据表示方法可能会毁掉原本很出色的数据分析工作。matplotlib 库是专门用于开发…

android recycleview长按多选_UI设计中Android和IOS设计差异总结

由于设计师、产品经理使用的移动设备大部分是iPhone&#xff0c;所以在做设计时&#xff0c;容易忽略Android和iOS的差异&#xff0c;按照iOS的规范进行设计&#xff0c;两端只做一套。只做一套的会存在两个问题&#xff1a;1、安卓用户的使用习惯不太适应iOS的设计&#xff0c…

自定义动画属性java_创建酷炫动画效果的10个JavaScript库

原标题&#xff1a;创建酷炫动画效果的10个JavaScript库1) Dynamics.jsDynamics.js是设计基于物理规律的动画的重要Java库。它可以赋予生命给所有包含CSS 和SVG属性的DOM(文本对象模型)元素&#xff0c;换句话说&#xff0c;Dynamics.js适用于所有Java对象以及一系列其它的元素…

php xlsx里插入图片_常见的 PHP 面试题和答案分享

如何直接将输出显示给浏览器&#xff1f;将输出直接显示给浏览器&#xff0c;我们必须使用特殊标记 <&#xff1f;and&#xff1f;>。PHP 是否支持多重继承&#xff1f;PHP 只支持单继承。PHP 的类使用关键字 extends 继承另一个类获取图片属性&#xff08;size, width, …

pandas concat_pandas-数据合并-concat(最全参数解释,含代码和实例)

pandas中的concat的功能&#xff1a;假设你现在需要将多个数据合并&#xff0c;前提是&#xff1a;这几个文件列名都一致&#xff0c;也就是说这几个文件格式完全一样&#xff0c;只是数据不太一样&#xff0c;类似于合并多个文件这种&#xff0c;实际数据分析中也会遇到这种情…

java中的de是什么_【转】java中main函数解析

源地址&#xff1a;http://www.cnblogs.com/xwdreamer/archive/2012/04/09/2438845.html从写java至今&#xff0c;写的最多的可能就是主函数public static void main(String[] args) {}但是以前一直都没有问自己&#xff0c;为什么要这么写&#xff0c;因为在c语言中就没有这样…

JAVA多线程(一)线程安全问题产生的原因

JAVA线程内存与主存间映射示意图Java内存模型中规定了所有的变量都存储在主内存中&#xff0c;每条线程还有自己的工作内存&#xff0c;线程的工作内存中保存了该线程使用的变量到主内存副本拷贝&#xff0c;线程对变量的所有操作&#xff08;读取、赋值&#xff09;都必须在工…

两顶点的路径长度为k_计算两个顶点之间的所有可能路径

两顶点的路径长度为kWhat to Learn? 学什么&#xff1f; How to count all possible paths between two vertices? 如何计算两个顶点之间的所有可能路径&#xff1f; In the graph there are many alternative paths from vertex 0 to vertex 4 在图中&#xff0c;有许多从…

covariance matrix r语言_时间序列分析|ARIMAX模型分步骤详解和R中实践

这是关于时间序列的第N篇文章&#xff0c;本文将介绍ARIMAX模型&#xff0c;简单来说就是在ARIMA的基础上增加一个外生变量。ARIMAX和ARIMA相比在理论上没有太多新的内容&#xff0c;所以本文直接介绍在R里怎么一步一步跑ARIMAX。在阅读这篇文章前&#xff0c;需要对ARIMA有一定…