本文只是从总体流程来分析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

hbase replication原理分析相关推荐

  1. hbase coprocessor的分析

    转自 http://walkoven.com/?p=77 hbase coprocessor的分析 下载链接:hbase coprocessor的分析.pdf hbase Coprocessor是很多 ...

  2. Hbase Replication 介绍

    https://blog.csdn.net/teriy/article/details/7954203 现状 Hbase 的replication目前在业界使用并不多见,原因有很多方面,比如说HDFS ...

  3. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  4. Elasticsearch实现原理分析

    介绍 本文是分析Elasticsearch系列文章中的一篇,是一个译文.共有三个部分,每部分讲解部分Elasticsearch的实现原理.     在翻译的过程中,也需要查看对应部分的源码,来加深对实 ...

  5. Hadoop生态圈-Zookeeper的工作原理分析

    Hadoop生态圈-Zookeeper的工作原理分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   无论是是Kafka集群,还是producer和consumer都依赖于Zoo ...

  6. 2021年大数据HBase(十四):HBase的原理及其相关的工作机制

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的原理及其相关的工作机制 一.HBase的flus ...

  7. java signature 性能_Java常见bean mapper的性能及原理分析

    背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...

  8. Select函数实现原理分析

    转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...

  9. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

最新文章

  1. 分布式经典书籍--深入分布式缓存 从原理到实践
  2. 抖音python广告_抖音上好看的小姐姐,Python给你都下载了
  3. 奥鹏2014计算机应用基础,奥鹏大连理工大学2014年春《计算机应用基础》在线测试...
  4. Java学习规划及就业规划(本人大三)
  5. throw 、throws 简介
  6. python setup_简述python setup.py install的过程
  7. 下列选项中 采用边界值平滑_2014年10月湖南自考:软件工程全真模拟试题二
  8. vlan间路由+静态路由+NAT(PAT+静态NAT)综合实验
  9. python逻辑编程题_python逻辑取反
  10. 【Verilog基础】常见的加法器电路总结(面试常考)(半加器、全加器、行波进位加法器RCA、超前进位加法器CLA)
  11. 计算机网络:CSMA/CD 与 CSMA/CA
  12. 用python画一个糖葫芦
  13. 8个最受欢迎的移动跨平台开发引擎
  14. 将数组中数字0元素移动到数组末尾
  15. 京东商城CEO刘强东:赢在“后台”
  16. linux对日语编码支持吗,linux nkf 日文编码转换命令
  17. java并发学习8:问题引入
  18. java一百以内三的倍数_3的倍数有哪些100以内?
  19. 在Win10系统下安装Win7,使笔记本电脑形成“双硬盘-双系统”格局的过程
  20. 甚小孔径终端(VSAT)卫星网络拓扑结构及接入方式

热门文章

  1. oracle is null效率,Oracle查询优化之is null和is not null优化
  2. 数学--数论--HDU 12151七夕节
  3. [开源]基于姿态估计的运动计数APP开发(三)
  4. 如何解决Ubuntu 14.04编译make menuconfig时缺少'ncurses-devel'库
  5. 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
  6. 【Android-NCNN-Vulkan】ncnn-vulkan load param model 速度慢
  7. 使用Java中的Try-With-Resource
  8. 【python 11】super()
  9. python3(十四)Python 异常处理
  10. 机器学习实战(八)预测数值型数据:回归