Ambari窥探分布式心跳机制

Ambari是在Hadoop大数据生态圈的基础上应运而生,Ambari的架构也借助了分布式的思想,细细品味,与Hadoop分布式架构有很多相似之处。

Hadoop中单NN 与多DN的通信是借助netty封装的RPC机制实现,单Ambari server与多Agent通信则是基于restful api + json实现,rpc与rest api的争论不是本文要讨论的重点,我们追求的目标只有一个,完美实现业务需求。

心跳设计一个主要的原因是判断客户端是否在线,每隔一段时间会发送数据交互。Ambari agent是无状态存在,通过心跳机制定期发送数据,状态信息存储在server数据库中,并在ambari-web页面正确显示存活状态。Agent主要任务是负责收集每个节点本身信息以及各服务组件 status;接收server传达command指令并对组件等进行启停操作,语言的选择上python是首选。

Ambari server不能主动给agent发心跳,只能通过agent的心跳请求返回信息中加入command queue以及对agent所要下达的其他一些指令,例如重新注册心跳、发送 status状态。接下来带你走进心跳机制实现的分布式架构:

接下来,简单明了,四个类带你了解Ambari心跳机制:

Agent端:两个线程类Control.py 以及ActionQueue.py

Control.py :

init方法初始化以下两个接口,https安全接口后续文章结合openssl再详细分析

start方法后,执行run方法,开启while true循环,调用 registerAndHeartbeat()

且先看注册方法:Register 相当于一个bean类,定义了rest请求需求注册的节点信息,server端有同样对应的一个Register类来接收,符合json与bean严格对应;注册成功后返回Response中会带有statuscommand指令,要求agent去收集各组件服务的状态信息,加入actionQueue队列中线程执行

注册成功后,则不会再进行该注册方法。

心跳方法同样有与server一一对应的HeartBeat bean类,会包含两类信息,上一command 执行结果result以及各服务状态信息。以下方法是对每次心跳返回response信息进行下一步处理,例如执行启停某一服务组件等。

Server端:

AgentResource.java  以及HeartBeatHandler.java

@Path("register/{hostName}"),该接口用于接收register请求,handleRegistration(message),返回RegistrationResponse,也就是agent端注册请求后的response信息

@Path("heartbeat/{hostName}")  ,该接口用于处理心跳,handleHeartBeat(message),返回HeartBeatResponse,该信息也就是上图中的response。

Server通过以下三个循环做心跳处理(处理过程通过事件驱动以及fsm状态机去实现)

总结:Agent两个线程,control负责发送注册(注册信息就是hostname以及一些节点机器硬件信息)、心跳(status以及command result)请求;ActionQueue负责执行command (执行server需要agent的操作)

server :接收注册信息,触发事件驱动由FSM去更改状态数据库,之后返回StatusCommands请求;

心跳接口 接收前一指令的result status,触发各种事件驱动更改数据库;返回web操作的command 操作

阅读代码不是为了简单的分析,是希望通过开源代码了解实际业务逻辑是怎么转换成代码的,并开拓自己的架构视野。我们不需要扯淡,只要实战。

时间: 2024-08-23 12:52:14

Ambari窥探分布式心跳机制的相关文章

如何优化网络心跳机制

什么是心跳机制 最早的心跳机制用于服务器的安全备份机制,是为了防止服务器死机,而在服务器之间采用专用的端口和线路,周期性传送简短的信息,心跳就是形象的比喻.一旦 收不到对方的心跳信息,服务器可以接管对方的业务,避免业务的停滞.为了业务的顺畅进行,服务器发送的心跳信息可以非常频密. 微信的信令风暴将人们的目光导向心跳机制,那么心跳机制是怎么回事呢? 最早的心跳机制用于服务器的安全备份机制,是为了防止服务器死机,而在服务器之间采用专用的端口和线路,周期性传送简短的信息,心跳就是形象的比 喻.一旦收不

rabbitmq 的心跳机制&应用

官方文档说: If a consumer dies (its channel is closed, connection is closed, or TCP connection is lost) without sending an ack, RabbitMQ will understand that a message wasn't processed fully and will re-queue it 即: 如果消费者进程挂掉了(channel关闭, connection关闭,或者tcp

Linux socket编程的心跳机制总结

Linux socket编程的心跳机制总结 我写这篇文章的目的是想总结一下心跳机制的使用,因为最近两个项目的TCP通信中都使用了这个方法,感觉用法好诗比较经典的,所以拿出来与大家共享. 什么是心跳机制 心跳机制就是当客户端与服务端建立连接后,每隔几分钟发送一个固定消息给服务端,服务端收到后回复一个固定消息给客户端,如果服务端几分钟内没有收到客户端消息,则视客户端断开.发送方可以是客户端和服务端,看具体需求. 为什么要使用 我们都知道在TCP这种长连接情况下下,有可能有一大段时间是没有数据往来的,

MapReduce剖析笔记之四:TaskTracker通过心跳机制获取任务的流程

上一节分析到了JobTracker把任务从队列里取出来并进行了初始化,所谓的初始化,主要是获取了Map.Reduce任务的数量,并统计了哪些DataNode所在的服务器可以处理哪些Split等等,将这些信息缓存起来,但还没有进行实质的分配.等待TaskTracker跟自己通信. TaskTracker一般运行于DataNode之上,下面是他的声明,可见,是一个线程类: /******************************************************* * TaskT

心跳机制

网络中的接收和发送数据都是使用操作系统中的SOCKET进行实现.但是如果此套接字已 经断开,那发送数据和接收数据的时候就一定会有问题.可是如何判断这个套接字是否还可以使用呢?这个就需要在系统中创建心跳机制.其实TCP中已经为我们 实现了一个叫做心跳的机制.如果你设置了心跳,那TCP就会在一定的时间(比如你设置的是3秒钟)内发送你设置的次数的心跳(比如说2次),并且此信息不 会影响你自己定义的协议.所谓“心跳”就是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己“在线”. 以确保链接的

轮询与心跳机制

上一篇内容参见() 在上一篇文章中提到的缓存内网服务端会话信息中,外网服务端保存内网服务端会话的有效性以及平台上监控所有内网服务端的网络状况,模仿心跳机制实现,这里在做一点叙诉,关于思路和具体实现. 在很多的平台应用中,都有这样的需求,平台内包括多个子系统或者属于其管控范围内的其他平台,需要对这些系统进行统一的监控,来查看当前的运行状态或者其他运行信息,我们的应用也有这样的一个情况,需要再外网服务端(平台)上监控,其下运行的多个内网服务端的网络状况,查阅了写资料后确立了2种可实现的方式. 1:轮

使用map端连接结合分布式缓存机制实现Join算法

前面我们介绍了MapReduce中的Join算法,我们提到了可以通过map端连接或reduce端连接实现join算法,在文章中,我们只给出了reduce端连接的例子,下面我们说说使用map端连接结合分布式缓存机制实现Join算法 1.介绍 我们使用频道类型数据集和机顶盒用户数据集,进行连接,统计出每天.每个频道.每分钟的收视人数 2.数据集 频道类型数据集就是channelType.csv文件,如下示例 机顶盒用户数据集来源于“08.统计电视机顶盒中无效用户数据,并以压缩格式输出有效数据”这个实

互联网推送服务原理:长连接+心跳机制(MQTT协议)

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢: 在写之前,我们首先了解一下为什么Android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给 服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手

一种工作流心跳机制的设计

最近工作中一直和SWF(Amazon的Simple Work Flow)打交道,在一个基于SWF的工作流框架上面开发和修bug.SWF的activity超时时间是5分钟,在activity task开始执行以后,activity worker需要主动发送心跳请求告知service端:“我还活着,我还在干活”,如果出现超过5分钟(可以配置)没有心跳,SWF的service端就认为,你已经挂了,我需要把这个activity安排到别的activity worker上来执行了.借用AWS官网的一张图: