hbase 学习(十三)集群间备份原理
这个备份操作是异步的,这意味着,有时候他们的连接可能是断开的,master的变化不会马上反应到slave当中。备份个格式在设计上是和mysql的statement-based replication是一样的,全部的WALEdits(多种来自Delete和Put的Cell单元)为了保持原子性,会一次性提交。
HLogs是region server备份的基础,当他们要进行备份时必须保存在hdfs上,每个region server从它需要的最老的日志开始进行备份,并且把当前的指针保存在zookeeper当中来简化错误恢复,这个位置对于每一个slave 集群是不同的,但是对于同一个队列的HLogs是相同的。
下面这个是设计的结构图:
下面我们了解一下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
hbase 学习(十三)集群间备份原理相关推荐
- 集群概述及原理笔记(1)
it你好linux学习文档之集群概述及原理笔记(1) 一 前言 目前,越来越多的网站采用Linux操作系统,提供邮件.Web.文件存储.数据库等服务.也有非常多的公司在企业内部网中利用Linux服务器 ...
- redis 一般启动几个 哨兵_Redis6.0主从、哨兵、集群搭建和原理
点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! 由 ...
- HBase不同版本集群之间数据迁移
本文摘自:https://www.dazhuanlan.com/2019/10/20/5dac43ffeb75a/ 由于HBase CDH4和CDH5数据格式不兼容,所以不能用"CopyTa ...
- 配置两个不同kerberos认证中心的集群间的互信
两个Hadoop集群开启Kerberos验证后,集群间不能够相互访问,需要实现Kerberos之间的互信,使用Hadoop集群A的客户端访问Hadoop集群B的服务(实质上是使用Kerberos Re ...
- linux说明是集群,集群——菜鸟学习Linux集群之概念篇
前两天学习了集群的应用,简单总结下:集群并不是很高深难懂的知识,只要掌握其原理,那么实现起来并不是很困难.下面我们一起来简单学习下集群. 什么是集群? 集群或者说是群集:其目的是为了实现将多台计算机组 ...
- Haoop之hbase高可用集群的 安装与使用
Haoop之hbase高可用集群的 安装与使用 实验目的.要求 掌握完全分布模式的整合平台中HBase的高可用完全分布模式的安装 1.完成HBase的高可用完全分布模式的安装 2.HBase的相关服务 ...
- 集群间实现Session共享
上一篇,同一tomcat不同项目下session共享方案:http://blog.csdn.net/qinmengdecluntan/article/details/72832648 一.引言 针对企 ...
- redis学习之集群部署
redis学习之集群部署 1.Redis主从架构 1.1.主从复制原理 1.2.主从复制优缺点 1.3.redis主从架构搭建,配置从节点步骤 1.4.校验结果 1.5.数据部分复制 2.Redis哨 ...
- 分布式和集群实现的原理
分布式和集群实现的原理 分布式: 1.将不同功能数据放到不同的机器上. 2.将同一数据放到不同的服务器上(数据副本),服务器之间通过网络互通.(涉及到数据的一致局性问题). 分布式系统的CAP理论: ...
最新文章
- 山科大计算机专业排名,山东科技大学专业排名情况
- HDU 3400 Line belt【三分法】
- JSF简单Ajax示例
- 换发型算法_GitHub - fredliu168/yry: yry(颜如玉)—— 一个实现人脸融合的算法,可以接近腾讯天天P图疯狂变脸功能的效果...
- 今天的就每天练习这招的企业即时通讯
- 在Python3里有的变量前面有个*号,或许你不知道,没关系,看文
- java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...
- 失焦事件触发_JavaScript event 事件详解
- 库存收藏-各种设备默认用户名和密码
- J1939协议实用指南与J1939数据记录方案
- 软件开发过程与项目管理(9.软件项目配置管理计划)
- Python 自动刷新网页
- 深度学习自学(二十六):人脸关键点检测
- 氚云ajax,氚云帮助中心
- 常用的Windows命令提示符
- 计算机视觉-OpenCV(七)
- python分数约分_python分数的四则运算
- PDF转换成excel的绿色版软件推荐
- javaweb的校园快递管理系统
- 家庭生活指南杂志家庭生活指南杂志社家庭生活指南编辑部2022年第6期目录
热门文章
- java web 润乾报表教程_润乾报表开发 基础教程.ppt
- myVariable是java标识符吗_java 标识符与变量
- mysql general clomun_关于MySQL索引index杂谈
- android mvc使用方法,详细学习android mvc设计模式教程
- java赋值运算符_11.Java赋值运算符
- php 失去 焦点 另一个表单猎取值,同一表单如何根据某一个文本框的值 改变另一个文本框的值...
- java迭代器cas,java提高篇(三十)-Iterator - Java 技术驿站-Java 技术驿站
- 《软件需求分析(第二版)》第 15 章——变更管理 重点部分总结
- ajax实现上传文件
- Ubuntu 16.04 安装CodeBlocks