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操作”,当然自己写一个原生态方法也能 ...
随机推荐
- 寻找最小的k个数
1. 能想到的最直接的办法,就是对数组进行排序,最好的排序算法的时间复杂性为O(n*logn),这一个方法请参照各种排序算法. 2. 另外申请一个k空间数组,依次更改里面的最大值,每做一次最多要扫描一 ...
- No resource found that matches the given name
XML里面明显已经定义了ID,可是android:layout_toLeftOf="@id/text_seller"报错,说没有定义,原来这玩意要写在相对位置对象声明的下面,是有顺 ...
- Android微信SDK API 调用教程
最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这 ...
- UVa 10859 Placing Lampposts
这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...
- (转载)UITableView使用详解
在开发iphone的应用时基本上都要用到UITableView,这里讲解一下UITableView的使用方法及代理的调用情况 UITableView使用详解 - (void)viewDidLoad { ...
- [原创] Ubuntu Linux 安装Eclipse
一 安装JDK 1.下载 JDK 7从http://www.oracle.com/technetwork/java/javasebusiness/downloads/选择下载JDK的最新版本 JDK ...
- JavaScript备忘录-逻辑运算符
关于 || 和 && 运算符 var name=(document.getElementById('txtName') || '') && document.getEl ...
- switchover步骤切换
主库 alter system switch logfile; alter system set log_archive_dest_state_2='defer'; select switchover ...
- Servlet、Struts2、SpringMVC执行流程
Servlet 有以下四个阶段: 1.加载和实例化 Servlet容器负责加载和实例化Servlet. 当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Ser ...
- 【转】Android屏幕适配全攻略(最权威的官方适配指导)
原文网址:http://blog.csdn.net/jdsjlzx/article/details/45891551 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的 ...