hbase replication原理分析

本文只是从总体流程来分析replication过程,很多细节没有提及,下一篇文章准备多分析分析细节。
replicationSource启动过程
org.apache.hadoop.hbase.regionserver.HRegionServer#startServiceThreads ->
org.apache.hadoop.hbase.replication.regionserver.Replication#startReplicationService ->
 //初始化replicationManager
org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager#init ->
//在init阶段for循环把所有的replicationPeers添加到source里,即每个replicationPeer对应一个source,也就是可以添加多个slave cluster,replicationPeers从zookeeper /hbase/replication/peers目录取
org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager#addSource ->
//在addSource阶段生成ReplicationSource并启动ReplicationSource,ReplicationSource本身是一个线程
org.apache.hadoop.hbase.replication.regionserver.ReplicationSource#startup
//ReplicationSource线程启动,进入while循环工作
replicationSource大致工作流程
  1. while(isAlive())进行主体循环
  2. 从WAL文件获取List<WAL.Entry>
  3. 通过调用shipEdits方法发送数据
  4. 调用replicationEndpoint replicate方法发送数据
  5. 最终调用admin.replicateWALEntry通过rpc发送数据
 
regionserver如何从slave cluster中选取regionserver当做复制节点
  1. replication过程需要连接peer(slave cluster),首先要获取这个peer所有活着的regionservers
  2. 拿到所有regionservers信息之后,开始选择哪些regionservers作为replication的对象
  3. 选哪些regionservers当做sink由peer活着的regionserver个数*ratio(默认值0.1)决定,regionservers先shuffle打乱顺序后再截取
  4. 如果选择的sink(regionserver)个数为0,一直等待peer上线,也就是slave cluster没有启动的情况
  5. 下面源码可以解释如何选择regionserver当做sink
  private void connectToPeers() {getRegionServers();int sleepMultiplier = 1;// Connect to peer cluster first, unless we have to stopwhile (this.isRunning() && replicationSinkMgr.getSinks().size() == 0) {replicationSinkMgr.chooseSinks();if (this.isRunning() && replicationSinkMgr.getSinks().size() == 0) {if (sleepForRetries("Waiting for peers", sleepMultiplier)) {sleepMultiplier++;     //倍数最多为默认配置的300倍,也就是每次sleep最长间隔是300秒
        }}}}void chooseSinks() {List<ServerName> slaveAddresses = endpoint.getRegionServers();Collections.shuffle(slaveAddresses, random);int numSinks = (int) Math.ceil(slaveAddresses.size() * ratio);sinks = slaveAddresses.subList(0, numSinks);lastUpdateToPeers = System.currentTimeMillis();badReportCounts.clear();}/*** Do the sleeping logic* @param msg Why we sleep* @param sleepMultiplier by how many times the default sleeping time is augmented* @return True if <code>sleepMultiplier</code> is &lt; <code>maxRetriesMultiplier</code>*/protected boolean sleepForRetries(String msg, int sleepMultiplier) {try {if (LOG.isTraceEnabled()) {LOG.trace(msg + ", sleeping " + sleepForRetries + " times " + sleepMultiplier);}Thread.sleep(this.sleepForRetries * sleepMultiplier);} catch (InterruptedException e) {LOG.debug("Interrupted while sleeping between retries");}return sleepMultiplier < maxRetriesMultiplier;}this.maxRetriesMultiplier = this.conf.getInt("replication.source.maxretriesmultiplier", 300);
this.ratio = conf.getFloat("replication.source.ratio", DEFAULT_REPLICATION_SOURCE_RATIO);

 

    总结
  1. 每个slave cluster对应一个replicationSource线程,各个slave复制互不干扰
  2. 每个replicationSource是单线程进行传输数据,改成多线程并发传可能更好
  3. 数据是通过rpc发送过去,调用slave cluster regionserver RSRpcServices的replicateWALEntry方法

 

转载于:https://www.cnblogs.com/yueweimian/p/6520390.html

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

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

相关文章

8168

http://blog.csdn.net/crushonme/article/details/10287693 http://blog.csdn.net/yangxueble/article/details/10138763

Mysql查询结果只有一条的情况下把值赋值给变量,再用if else 流程判断

1 BEGIN 2 set n(SELECT count(day) from log where dayCURDATE()); 3 IF n0 THEN 4 call m_LogInsert(); 5 ELSE 6 call m_LoginCheck(); 7 end if; 8 end 转载于:https://www.cnblogs.com/mengms/p/7629486.html

近距离无线通信技术对比

定义&#xff1a;无线通信是利用电磁波信号在自由空间中传播的特性进行信息交换的一种通信方式。 优点&#xff1a;成本低、无物理线路&#xff0c;不受工业环境限制&#xff0c;环境适应能力强&#xff1b; 故障诊断简单&#xff0c;可远程诊断&#xff0c;扩展性强&#xff…

看不清的融资迷局 二线玩家字节跳动在打什么主意?

互联网似乎对离经叛道者总是多一分关注&#xff0c;吃瓜心态随着时间的推进越来越浓烈。 其中&#xff0c;今日头条成了“看热闹”时代最佳的“演员”之一&#xff0c;供看客消遣&#xff1a;其母公司字节跳动一个融资传闻从8月炒到了10月&#xff0c;即便是媒体通过信源确认这…

第3章-动态基础分析实验

Lab 3-1 Question: 1.先对文件使用PEID进行查壳,显示文件被加壳处理过 2.使用Dependency Walker查看文件导入函数&#xff0c;文件只有一个DLL而且只有一个导入函数Exitprocess 3.使用Strings程序查看字符串&#xff0c;发现可疑字符串。 4.动态分析前期准备 4.1 对系统进行初始…

如何优化增强第三方库?

开发中&#xff0c;我们不可避免要使用&#xff0c;别人花很多时间打磨好的轮子&#xff0c;轮子好用&#xff0c;但有时却无法完全满足我们的要去&#xff0c;这时我们不可避免的要去修改增强一下这个库&#xff0c;如何增强&#xff1f; 我认为&#xff0c;一般有两种修改的方…

C语言变长数组data[0]【总结】

C语言变长数组data[0]【总结】 1、前言 今天在看代码中遇到一个结构中包含char data[0]&#xff0c;第一次见到时感觉很奇怪&#xff0c;数组的长度怎么可以为零呢&#xff1f;于是上网搜索一下这样的用法的目的&#xff0c;发现在linux内核中&#xff0c;结构体中经常用到data…

Excel 转为 MySQL 语句

一、方法 一、假设你的表格有A、B、C三列数据&#xff0c;希望导入到你的数据库中表格table&#xff0c;对应的字段分别是col1、col2、col3 二、在你的表格中增加一列&#xff0c;利用excel的公式自动生成sql语句&#xff0c;具体方法如下&#xff1a; 1、增加一列&#xff08;…

CentOS7下安装zookeeper3.4.9

获取zookeeper官方安装包 1 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 解压该文件包 1 tar zxf zookeeper-3.4.9.tar.gz 进入conf文件夹并创建新配置文件 1 cd zookeeper-3.4.9/conf 2 vi zoo.cfg 在config文件中加…

union 和 struct 的区别与联系

union &#xff08; 共用体&#xff09;&#xff1a;构造数据类型,也叫联合体 用途&#xff1a;使几个不同类型的变量共占一段内存(相互覆盖) struct ( 结构体 )&#xff1a;是一种构造类型 用途&#xff1a; 把不同的数据组合成一个整体——自定义数据类型 主要区别&#x…

Android系统中标准Intent的使用

Android系统用于Activity的标准Intent 1.根据联系人ID显示联系人信息 Intent intentnew Intent(); intent.setAction(Intent.ACTION_VIEW);//显示联系人信息 intent.setData(Uri.parse("content://contaccts/people/492")); startActivity(intent); 2.根据联系人ID显…

开关电源简介

1. 基本分类 DC-DC BULK电源 DC-DC BOOST电源 DC-DC BULK/BOOST电源 DC-DC BOOST/BYPASS电源 2. 典型拓扑结构 BULK电路拓扑 降压型电源 串联关系在开关管S导通时&#xff0c;二极管VD负极电压高于正极反偏截止&#xff0c;此时电流经过电感L向电容和负载供电&#x…

Office 2016中Excel的部分快捷方式

【Ctrl下箭头】 拉到最后一行 【Alt 】一秒求和 【CtrlEnter】 一秒输入相同数据 【Ctrld】 一秒竖向填充不连续区域 【Ctrlr】 一秒向右填充数据 【Ctrle】 批量提取字符 【Ctrl1】 调出 设置单元格格式窗口 【Ctrlz】 撤销上一步操作 【Ctrly】 恢复上一步 【F4】 重复上一步…

基于Spring开发的DUBBO服务接口测试

基于Spring开发的DUBBO服务接口测试 知识共享主要内容&#xff1a; 1、 Dubbo相关概念和架构&#xff0c;以及dubbo服务程序开发步骤。 2、 基于Spring开发框架的dubbo服务接口测试相关配置。 3、 spring testjunit和spring testTestNG两种测试框架脚本编写方法。 一、 …

ioctl之FIONREAD

在学习ioctl 时常常跟 read, write 混淆。其实 ioctl 是用来设置硬件控制寄存器&#xff0c;或者读取硬件状态寄存器的数值之类的。 而read,write 是把数据丢入缓冲区&#xff0c;硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区。 ioctl(keyFd, FIONREAD, &a…

电感基础与选型介绍

电感是一种常见的被动元件&#xff0c;常用在LC振荡电路、中低频的滤波电路&#xff0c;DCDC能量转换电路中&#xff0c;其应用频率一般不超过50MHz。 1.电感的主要作用 通直流&#xff0c;阻交流阻交流变化&#xff0c;保持电流稳定----楞次定律滤波 2.电感的主要分类 3.电…

[题解]Codeforces Round #519 - B. Lost Array

【题目】 B. Lost Array 【描述】 Bajtek有一个数组x[0],x[1],...,x[k-1]但被搞丢了&#xff0c;但他知道另一个n1长的数组a&#xff0c;有a[0]0&#xff0c;对i1,2,...,n。由此可以找到数组x[0],x[1],...,x[k-1]的一些可能情况&#xff0c;即满足这个关系的数组x[0],x[1],...,…

Python正则替换字符串函数re.sub用法示例(1)

本文实例讲述了Python正则替换字符串函数re.sub用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; python re.sub属于python正则的标准库,主要是的功能是用正则匹配要替换的字符串然后把它替换成自己想要的字符串的方法re.sub 函数进行以正则表达式为基础的替换工作…

LeetCode 24 Swap Nodes in Pairs (交换相邻节点)

题目链接&#xff1a; https://leetcode.com/problems/swap-nodes-in-pairs/?tabDescriptionProblem: 交换相邻的两个节点如上图所示&#xff0c;递归进行交换。从最尾端开始&#xff0c;当最尾端只有一个节点时&#xff0c;停止交换否则执行 swap(head.next) 参考代码&#x…