Tachyon框架的Worker心跳及Master高可用性分析
0 概述
分布式框架中的Master-Slave类型,Slave节点负责工作的具体执行,Master负责任务的分发或者相关元数据的存储等。一般情况下,一个Master节点都会对应多个Slave节点,Master在分配任务时需要知道当前有哪些Slave节点是可以接受自己所发的命令的(Slave节点有可能因为各种原因挂掉),因此需要在其内部维持一个链表来保存所有还活着的Slave节点。HBase的HMaster是这样、HDFS的NameNode是这样、Tachyon的Master节点也是这样。Slave节点通过不断的心跳汇报(HeartBeat)来和Master通信,Master把收到心跳汇报的Slave节点看做是目前存活的,否则就说明Slave节点挂掉了。除了维持存活性以外,Master节点通常还会把需要执行的命令通过心跳返回给Slave节点,Slave节点接收到后执行Master发来的命令,完成一次交互。
Master是核心,它要是挂掉了对整个系统都是致命的影响,单点问题是每个分布式框架都要考虑的问题。应用和实现了Paxos算法的Zookeeper,是解决一致性问题的利器。HDFS、Storm、HBase等都采用Zookeeper作为元数据信息HA的载体,Tachyon也不例外。
1 Worker心跳
1.1 总体流程
Tachyon的Worker节点,通过不断心跳向Master汇报当前Worker中已使用的内存大小和准备删除的数据块信息,Master接受心跳汇报后返回给Worker节点相关的执行命令,这些命令可以是Register、Free等,也可以是Nothing。
其中,需要说明的地方如下:
(1)Worker心跳的时间间隔默认为1秒,由参数tachyon.worker.to.master.heartbeat.interval.ms设定。
(2)Worker心跳的超时时间默认为10秒,由参数tachyon.worker.heartbeat.timeout.ms设定。
(3)Master返回给Worker的命令主要有五种,分别是:Unknown、Nothing、Register、Free、Delete。Nothing命令什么都不做;Register命令执行Worker向Master的注册,Master会返回WorkerId存储在Worker本地;Free命令要释放Worker内存中存储的数据;Delete命令则既要删除内存中的数据也要删除磁盘上的数据。
(4)心跳的具体执行是调用的WorkerStorage的heartbeat方法。
(5)CheckStatus则会检查当前Worker节点所管理的内存使用情况。
1.2 HeartBeat正常处理
其中,需要说明的地方如下:
(1)首先获取所有需要从当前Worker节点的内存中移除的Block的信息,Block被移除一般有如下几种情况,当Master发来Free命令时、WorkerStorage初始化时、内存不够时需要使用LRU算法换入换出。
(2) 调用MasterClient的worker_heartbeat方法进行心跳汇报给Master,此处的MasterClient会通过MasterService.Client对象调用Master的Thrift服务进行消息传递,类似于HDFS中的RPC通信的动态代理。
(3)连接建立是调用的MasterClient类的connect方法,其主要目的是为了创建MasterService.client对象,即Thrift服务的客户端。步骤如下:
Step1:调用cleanConnect方法,主要是关闭thrift的transport端口、并且将当前的HeartbeatThread线程停止掉如果其对象不为null的话,则将mIsShutdown设置为true,并且会抛出TException。首次进行clean的话,几乎没有什么要做的事情。
Step2:clean之后,进入while循环,准备获取master地址进行建立连接,while循环的条件为tries ++ < MAX_CONNECT_TRY && !mIsShutdown,默认重试5次。
Step3:获取Master的当前地址,使用getMasterAddress方法,在ZK中查找leader目录下的所有节点,根据节点的创建时间,找到最新的那个节点作为当前需要连接的Active Master节点。
Step4:初始化Thrift客户端和服务端通信的协议,此处为TBinaryProtocol。
Step5:初始化Thrift客户端MasterService.Client对象。
Step6:打开协议的Transport,就是数据传输通道,准备进行读写,如果打开失败,则会抛出TTransportException,接着停止用于维持连接的心跳线程HeartbeatThread,并且sleep1秒钟后进入while的失败重试,达到失败次数上限,抛出TException。
Step7:初始化一个心跳线程HeartbeatThread,不断的和服务端进行心跳,超时时间为tachyon.user.master.client.timeout.ms配置的属性值,默认10秒,用于保持上面已建立的Thrift连接的存活,如果期间心跳超时,会触发调用cleanConnect方法,此时就会关闭Thrift数据传输通道,终止此维持连接心跳线程。
(4) connect连接成功后,会调用MasterService.client的worker_heartbeat方法进行心跳处理,结果返回的是Command。其中worker_heartbeat的处理步骤如下:
Step1:首先调用send_worker_heartbeat方法,主要是设置workerId、已使用的内存大小、worker已删除的blockId。
Step2:创建一个worker_heartbeat_result对象,worker_heartbeat_result是MasterService中的静态内部类,这里面会定义两种Field,SUCCESS_FIELD_DESC值为0,E_FIELD_DESC为1。
Step3:通过Thrift服务发送给Master端,由MasterInfo的workerHeartbeat方法负责处理。如果Master节点找不到心跳汇报的Worker信息,则返回给Worker节点CommandType.Register命令。如果有需要释放的内存,则Master返回给Worker节点CommandType.Free命令。否则返回给CommandType.Nothing命令给Worker节点。
1.3 HeartBeat异常处理
在TachyonWorker心跳汇报过程中,可能会出现两种主要的异常:BlockInfoException和TException异常。
(1)如果出现BlockInfoException,则在TachyonWorker中调用WorkerStorage.checkStatus()方法,如果此时继续心跳的条件仍然成立,即mStop为false,则继续循环进行心跳汇报。
(2)如果出现TException,则在TachyonWorker中调用WorkerStorage的resetMasterClient方法进行重置MasterClient对象,利用connect方法连接Thrift服务端。需要注意的是,Worker心跳超时判断,默认超时时间为10秒,如果超时,则抛出RuntimeException,心跳线程直接就挂掉了;如果没有心跳超时,则继续进行WorkerStorage的checkStatus,重新检查心跳条件,进入下次心跳。
2 Master HA
Master节点在初始化的时候会创建Journal目录,如果底层文件系统是HDFS的话,那就直接在HDFS上创建对应的目录,并且需要格式化(这里的格式化实际上是创建一个空的文件用于标注Format完毕)。
Tachyon的文件系统信息依靠Edits日志 + Fsimage镜像保存(分别是image.data文件和log.data文件),Edits日志是Tachyon文件系统的元数据信息的增量Log,Fsimage是在某个时刻的快照。Tachyon Master在启动时会首先从Fsimage文件中读取文件系统元数据信息,即各种数据节点(文件、目录、Raw表、Checkpoint、依赖关系等)信息,然后再从继续Edits(可能多个)中读取增量操作记录,Edits日志的内容基本对应于Tachyon文件系统Client的一些相关操作,包括文件的添加,删除,重命名,数据块的添加等。但是这里的Edits日志不包括实际的文件内容数据,只是元数据信息,当Cache中的文件内容丢失,而又没有持久化,也没有绑定相关lineage信息时,对应的文件的内容就会丢失。搞定完这些,Tachyon Master会先把当前的元数据信息写出为新的Fsimage。
采用Zookeeper作为Master的HA实现机制的时候,处于Standby角色的Master会定期将Editlog合并,并创建Standby的Fsimage,如果没有Standby的Master则只有在启动过程中,才会通过合并EditsLog产生新的Fsimage。
Master的Active选举,通过LeaderSelectorClient类来完成,如果当前Master被选举为Leader,则停止EditsLog的滚动,调用MasterInfo的init方法进行初始化相关参数,进而启动Web的服务UIWebServer(Standby状态的Master没有WebUI服务),接着初始化Master的服务处理对象MasterServiceHandler并启动Thrift服务。
需要注意的是:
(1) JOURNAL的路径、格式化文件前缀、service和web的ip及端口的设定都是在MasterConf类中设置的;
(2) MasterInfo的init方法会依次做如下事情:
Step1:加载EditsLog文件到内存
Step2:创建新的镜像文件
Step3:创建新的EditsLog日志文件
Step4: 创建心跳汇报器MasterInfoHeartbeatExecutor并启动
Step5: 创建文件丢失恢复器RecomputationScheduler并启动
(3)Master也有心跳,只不过是做周期性的系统状态检查
Step1:获取超时的worker列表BlockingQueue,从Master端的Worker存储列表中删除
Step2:尝试从超时worker列表中恢复丢失的文件
Step3:重启所有超时的worker列表,这一点很重要!
(4)Master在Zookeeper中会创建两个节点,分别是election节点,在其下面子节点是CreateMode.EPHEMERAL_SEQUENTIAL类型的,即临时节点;leader节点,在其下的子节点是CreateMode.PERSISTENT类型的,用于维护当前存活的Master节点信息。
(5) 由于当前Active Master可能是变化的,所以Worker进行选择Master进行通信的时候,需要首先从Zookeeper中的leader目录下取出所有的Master节点进行遍历,如果只有一个Master,则直接返回,否则,查找出cTime最大的那个Master作为当前的Active节点,由Worker节点负责和它通信。而Worker端在进行心跳汇报的时候,会重试五次,仍然失败则抛出异常TException,由TachyonWorker的run方法catch,调用resetMasterClient方法进行重新设置,每次connect的时候都会从Zookeeper中获取最新的Active Master地址,如果一段时间后仍然连接不上master,则停止心跳,通过调用cleanConnect方法。
-------------------------------------------------------------------------------
如果您看了本篇博客,觉得对您有所收获,请点击右下角的 [推荐]
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言
感谢您的阅读,请关注我的后续博客
Tachyon框架的Worker心跳及Master高可用性分析的更多相关文章
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
- worker启动executor源码分析-executor.clj
在"supervisor启动worker源码分析-worker.clj"一文中,我们详细讲解了worker是如何初始化的.主要通过调用mk-worker函数实现的.在启动worke ...
- Flask框架(五) —— session源码分析
Flask框架(五) —— session源码分析 目录 session源码分析 1.请求来了,执行__call__方法 2.__call__方法 3.调用__call__方法 3.1.ctx = s ...
- 轻松应对并发问题,简易的火车票售票系统,Newbe.Claptrap 框架用例,第一步 —— 业务分析
Newbe.Claptrap 框架非常适合于解决具有并发问题的业务系统.火车票售票系统,就是一个非常典型的场景用例. 本系列我们将逐步从业务.代码.测试和部署多方面来介绍,如何使用 Newbe.Cla ...
- Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPersistence_Test编写 1.3.1 XXXMapper.xml详解 1.3.2 ...
- 【笔记】拉勾Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
以下笔记是我看完视频之后总结整理的,部分较为基础的知识点也做了补充,如有问题欢迎沟通. 目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPe ...
- Hadoop心跳机制源码分析
正文: 一.体系背景 首先和大家说明一下:hadoop的心跳机制的底层是通过RPC机制实现的,这篇文章我只介绍心跳实现的代码,对于底层的具体实现,大家可以参考我的另几篇博客: 1. hadoop的RP ...
- 前端MVC框架Backbone 1.1.0源码分析系列
Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代码.而且,在传统的 ...
- 前端MVC框架Backbone 1.1.0源码分析(一)
前言 如何定义库与框架 前端的辅助工具太多太多了,那么我们是如何定义库与框架? jQuery是目前用的最广的库了,但是整体来讲jQuery目的性很也明确针对“DOM操作”,当然自己写一个原生态方法也能 ...
随机推荐
- Java WEB安全问题及解决方案
1.弱口令漏洞 解决方案:最好使用至少6位的数字.字母及特殊字符组合作为密码.数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密. ...
- ILog JRules 标识符 X 未定义
在定义枚举值时,属性“转译”(“translation”),定义字符串时需要双引号,相当于value值. 其属性值如果只有字符串,而没有双引号,在编译或者执行时就会报“标识符X未定义”的错误信息.
- YTU 2621: B 继承 圆到圆柱体
2621: B 继承 圆到圆柱体 时间限制: 1 Sec 内存限制: 128 MB 提交: 313 解决: 240 题目描述 定义了Circle圆形类,在此基础上派生出Cylinder圆柱体类. ...
- Win8环境下 IIS6部署MVC网站出现的无法显示此网页错误
在Win7环境下做好的网站,新的Win8环境发布出现如下图错误: 解决方法如下: 运行:
- CSS选择符类型
一.标签选择符:针对某一类标签,可以以标签作为选择符 <style type="text/css"> p{color:#F00; font-size:36px;} &l ...
- R语言处理大规模数据集的编程要点
1.提高程序效率,保证执行速度 (1)尽量使用向量化运算 (2)尽量使用矩阵,必要时才使用数据框 (3)使用read.table时,尽量显式设定colClasses和nrows,设定comment.c ...
- 安卓WebView中接口隐患与手机挂马利用(远程命令执行)
安卓应用存在安全漏洞,浏览网站打开链接即可中招.目前有白帽子提交漏洞表明目前安卓平台上的应用普遍存在一个安全漏洞,用户打开一个链接就可导致远程安装恶意应用甚至完全控制用户手机,目前微信,手机QQ,QV ...
- BZOJ 1123 BLO
tarjan求割点计算答案.注意不是每一棵子树都算答案.开个变量记一下. #include<iostream> #include<cstdio> #include<cst ...
- (转) Python Generators(生成器)——yield关键字
http://blog.csdn.net/scelong/article/details/6969276 生成器是这样一个函数,它记住上一次返回时在函数体中的位置.对生成器函数的第二次(或第 n 次) ...
- (一)线性回归与特征归一化(feature scaling)
线性回归是一种回归分析技术,回归分析本质上就是一个函数估计的问题(函数估计包括参数估计和非参数估计),就是找出因变量和自变量之间的因果关系.回归分析的因变量是应该是连续变量,若因变量为离散变量,则问题 ...