集群通信组件Tribes之怎样维护集群成员信息

一个集群包括若干成员,要对这些成员进行管理就必需要有一张包括全部成员的列表。当要对某个节点做操作时通过这个列表能够准确找到该节点的地址进而对该节点发送操作消息。怎样维护这张包括全部成员的列表是本节要讨论的主题。

成员维护是集群的基础功能,一般划分一个独立模块或层完毕此功能,它提供成员列表查询、成员维护、成员列表改变事件通知等能力。

因为tribes定位于基于同等节点之间的通信,所以并不存在主节点选举的问题,它所要具备的功能是自己主动发现节点,即新节点增加要通知集群其它成员更新成员列表,让每一个节点都能及时更新成员列表。每一个节点都维护一份集群成员表。如图。节点1、节点2、节点3使用组播通过交换机各自已经维护一份成员列表。且他们隔一段时间向交换机组播自己节点消息,即心跳操作。当第四个节点增加集群组,节点四向交换机组播自己的节点消息,原理三个节点接收到后各自把节点四增加到各自的成员列表中。而原来三个节点也不断向交换机发送节点消息。节点四接收到后依次更新成员列表信息。终于达到四个节点都拥有四个节点成员信息。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

看下tribes的集群是怎样设计实现以上功能的。其成员列表的创建维护是基于经典的组播方式实现,每一个节点都创建一个节点信息发射器和节点信息接收器,让他们执行于独立的线程中。发射器用于向组内发送自己节点的消息,而接收器则用于接收其它节点发送过来的节点消息并进行处理。要使节点之间通信能被识别就需要定义一个语义。即约定报文协议的结构,tribes的成员报文是这样定义的,两个固定值用于表示报文的開始和结束,開始标识TRIBES_MBR_BEGIN 的值为字节数组84, 82, 73, 66, 69, 83, 45, 66, 1, 0,结束标识TRIBES_MBR_END的值为字节数组84, 82, 73, 66, 69, 83, 45, 69, 1, 0。整个协议包结构为:開始标识(10bytes)+包长度(4bytes)+存活时间(8bytes)+tcp端口(4bytes)+安全端口(4bytes)+udp端口(4bytes)+host长度(1byte)+host(nbytes)+命令长度(4bytes)+命令(nbytes)+域名长度(4bytes)+域名(nbytes)+唯一会话id(16bytes)+有效负载长度(4bytes)+有效负载(nbytes)+结束标识(10bytes)。成员发射器依照协议组织成包结构并组播,接收器接收包并依照协议进行解包,依据包信息维护成员表。

以下用一段代码简单展示实现过程。因为篇幅问题包的处理省略:

public class McastService {

private MulticastSocket socket;

private String address = "228.0.0.4";

private int port = 8000;

private InetAddress addr;

private byte[] buffer = new byte[2048];

private DatagramPacket receivePacket;

private final Object sendLock = new Object();

public void start() {

try {

addr = InetAddress.getByName(address);

receivePacket = new DatagramPacket(buffer, buffer.length, addr,port);

socket.joinGroup(addr);

new ReceiverThread().start();

new SenderThread().start();

} catch (IOException e) {

}

}

public class ReceiverThread extends Thread {

public void run() {

while (true) {

try {

receive();

} catch (ArrayIndexOutOfBoundsException ax) {

}

}

}

}

public class SenderThread extends Thread {

public void run() {

while (true) {

try {

send();

} catch (Exception x) {

}

try {

Thread.sleep(1000);

} catch (Exception ignore) {

}

}

}

}

public void send() {

byte[] data = 依照成员协议组织包结构;

DatagramPacket packet = new DatagramPacket(data, data.length, addr, port);

try {

socket.send(packet);

} catch (IOException e) {

}

}

public void receive() {

try {

socket.receive(receivePacket);

解析处理成员报文。

} catch (IOException e) {

}

}

}

第一步要先执行增加组播成员操作。接着分别启动接收器线程、发射器线程,一般接收器要优先启动。发射器每隔1秒组织协议包发送心跳,组播组内成员的接收器对接收到的协议报文进行解析,依照一定的逻辑更新各自节点本地成员列表,假设成员表已包括协议包的成员则仅仅更新存活时间等消息。

Tribes利用上述原理维护集群成员,而且由独立模块MembershipService提供成员的相关服务,比如获取集群全部成员相关信息等。

点击订购作者《Tomcat内核设计剖析》

时间: 2024-07-30 06:37:23

集群通信组件Tribes之怎样维护集群成员信息的相关文章

集群通信组件tribes之使用方法

上面已经对tribes的内部实现机制及原理进行了深入的剖析,在理解它的设计原理后看看如何使用tribes,整个使用相当简单便捷,只需要四步: ① 定义一个消息对象,由于这个消息对象是要在网络之间传递的,网络传输涉及到序列化,所以需要实现Serializable接口. public class MyMessage implements Serializable { private String message; public String getMessage() { return message

集群通信组件tribes之应用程序处理入口

Tribes为了更清晰更好地划分职责.它被设计成用IO层和应用层,IO层专心负责网络传输方面的逻辑处理.把接收到的数据往应用层传送,当然应用层发送的数据也是通过此IO层发送,数据传往应用层后必需要留一些处理入口供应用层进行逻辑处理,而考虑系统解耦,这个入口最好的方式是使用监听器模式,在底层发生各种事件时触发全部安装好的监听器,使之运行监听器里面的处理逻辑.这些事件主要包括了集群成员的加入和退出.消息报文接收完毕等信息,所以整个消息流转过程被分成两类监听器.一类是跟集群成员的变化相关的监听器Mem

集群通信框架Tribes之整体介绍

接下来一系列文章会对集群通信框架tribes进行源码级别的分析,欢迎讨论. 把若干机器组合成一个集群,集群为了能协同工作,成员之间的通信是必不可少的,当然可以说这也是集群实现中重点需要解决的核心问题,一个强大的通信协同机制是集群的基础. 简约地说,Tribes是一个具备让你通过网络向组成员发送和接收信息.动态检测发现其他节点的组通信能力的高扩展性的独立的消息框架.在组成员之间进行信息复制及成员维护是一个相对复杂的事情,因为不仅要考虑各种通信协议还要有必要的机制提供不同的消息传输保证级别,且成员关

隧道集群通信覆盖系统

隧道集群通信覆盖方案(北京恒星科通科技发展有限公司 http://www.bjhxkt.com 010-82565576)一.隧道集群通信覆盖系统概述隧道集群通信覆盖方案隧道集群通信覆盖系统包括150M调度对讲子系统.350M公安消防集群子系统和调频广播及应急广播子系统.调度对讲子系统主要用于隧道管理单位的内部通信,能让隧道内维修.巡逻等人员与控制室管理人员之间建立灵活的通信联络,满足内部管理.指挥.调度等的需要.350M公安消防集群子系统通过将隧道外的基站信号引入,满足交警.消防等单位在隧道内

集群通信应用开发吐槽(2014年)

在集群通信行业两家公司开发PC应用六年了,但在对开发的理解的道路上感觉还是挺孤独的,于是想写点东西发泄下郁闷,没想到只想了一两小时就写了几十条提纲.好话说在前面,文中的提到的现象可能不全面,甚至是误会的,文中的观点更是需要审视的看待. 产品越复杂(越多硬件)越能卖出好价钱 产品便携易用,越能解决客户问题,越给客户创造价值,才越值钱.产品成本和产品价值没有直接关系,iphone的成本如果只有1元钱,就没人花45千买了? 性能问题需要测试数据来证明 在讨论某个功能的整体设计时,做嵌入式开发的常常随意

如何维护集群成员信息

一个集群包含若干成员,要对这些成员进行管理就必须要有一张包含所有成员的列表,当要对某个节点做操作时通过这个列表可以准确找到该节点的地址进而对该节点发送操作消息.如何维护这张包含所有成员的列表是本节要讨论的主题. 成员维护是集群的基础功能,一般划分一个独立模块或层完成此功能,它提供成员列表查询.成员维护.成员列表改变事件通知等能力.由于tribes定位于基于同等节点之间的通信,所以并不存在主节点选举的问题,它所要具备的功能是自动发现节点,即新节点加入要通知集群其他成员更新成员列表,让每个节点都能及

Oracle RAC 11gR2+WebLogic集群6节点项目安装实施维护视频课程套餐

Oracle RAC 11gR2+WebLogic集群6节点项目安装实施维护视频课程套餐 套餐介绍:高薪必学的企业级核心应用Oracle+WebLogic集群教程. 基础:介绍Oracle RAC 11gR2集群组件概念,ASM存储,体系结构,WebLogic集群相关概念,域,JDK,JVM,数据源,连接池. 实战:1.企业级应用系统项目的实施流程,如调研,方案,规划等;2.Linux统安装与环境配置,ASM存储配置,Oracle 11gRAC集群软件安装与数据RAC数据库创建,RAC集群日常维

SignalR循序渐进(三)简易的集群通讯组件

上一篇演示了泛型Hub的实现,微软于6月17日更新了SignalR 2.1.0,然后自带了泛型Hub,于是就不需要自己去实现了…(微软你为啥不早一个月自带啊…).不过没关系,SignalR出彩之处不在泛型Hub,本篇为各位观众带来了基于SignalR的简易集群通讯组件Demo,可用于分布式定时任务. 说到集群,自然想到了NLB啊Cluster啊HPC啊等等.NLB受制于成员数量,Cluster用数量堆高可用性,HPC太复杂.本着SignalR的双向异步通讯的特点,其实是可以用来玩弹性计算的.初始

用MPI_Send和MPI_Recv实现简单集群通信函数

本片博客总结自我<并行计算>MPI实验 在这里我用阻塞式消息传递函数MPI_Send.MPI_Recv和非阻塞式消息发送函数MPI_Isend实现了三个简单的集群通信函数: MPI_Bcast广播函数 MPI_Gather收集函数 MPI_Scatter散播函数 1.MPI_Bcast广播函数 (1)原型简介 void MPI_Bcast(void* address, int count, MPI_Datatype datatype, int root, MPI_Comm comm); MPI