如何维护集群成员信息

一个集群包含若干成员,要对这些成员进行管理就必须要有一张包含所有成员的列表,当要对某个节点做操作时通过这个列表可以准确找到该节点的地址进而对该节点发送操作消息。如何维护这张包含所有成员的列表是本节要讨论的主题。

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

看下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提供成员的相关服务,例如获取集群所有成员相关信息等。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-02 00:55:59

如何维护集群成员信息的相关文章

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

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

Coherence的集群成员的离开和加入

最近在客户那里环境中coherence集群不稳定,所以找出一些文档,需要搞清楚Coherence内部的一些机制 1.集群成员的离开 关于状态的检测,官方的说法是: Death detection is a cluster mechanism that quickly detects when a cluster member has failed. Failed cluster members are removed from the cluster and all other cluster

云帆大数据学院Hadoop 集群 ——机器信息分布表

1.分布式环境搭建采用4 台安装Linux 环境的机器来构建一个小规模的分布式集群. 其中有一台机器是Master 节点,即名称节点,另外三台是Slaver 节点,即数据节点.这四台机器彼此间通过路由器相连,从而实验相互通信以及数据传输.它们都可以通过路由器访问Internet,实验网页文档的采集.2.集群机器详细信息2.1 Master 服务器名称详细信息机器名称Master.Hadoop机器IP 地址192.168.1.2最高用户名称(Name) root最用用户密码(PWD) hadoop

【RAC】使用一条“ps”命令获取Linux环境下全部RAC集群进程信息

如何仅使用一条ps命令便能获取到所有与RAC集群进程相关的信息.  从所使用的命令角度上看很简单,仅需使用ps命令结合grep命令便能实现.问题关键是需要确定检索哪些关键字. 1.与RAC集群有关的进程1)常驻系统的通用进程ocssd.binevmd.binevmlogger.bincrsd.bin 这些通用进程需要在各种平台和数据库版本上都会启动. 2)特有进程oprocd: 在UNIX平台当第三方集群软件为运行时会启动该进程:在Linux平台上会在Oracle 10.2.0.4这个版本上启动

Python-获取QQ群成员信息并存入excel及redis并发送邮件

''' 需求: 1.请求qq群的接口,实现传入一个群号 2.把群里每个人的 昵称.群备注.入群时间.qq号,性别,存到redis里面,用hash类型 {"qq_num":XXX,"nick":"XXX","card":"XXX","gender":"男","入群时间":"2017-01-03"} 3.把每个人的头像下载下来保存到

Docker 集群环境实现方式

Docker 集群环境实现的新方式 近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技术更新的步伐,导致企业架构要随时更改以适合业务需求.当前,越来越多的公司都已将以 Docker 为代表的容器技术用于企业级业务平台,比如:腾讯,京东,美团,新浪,阿里巴巴等互联网公司.数据的安全.Docker 容器的稳定运行是众多用户关注的,这就要求我们提供一套行

Docker 集群环境实现的新方式

近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技术更新的步伐,导致企业架构要随时更改以适合业务需求.当前,越来越多的公司都已将以 Docker 为代表的容器技术用于企业级业务平台,比如:腾讯,京东,美团,新浪,阿里巴巴等互联网公司.数据的安全.Docker 容器的稳定运行是众多用户关注的,这就要求我们提供一套行之有效的管理大型容器集群的整体解决方

kubeadm部署高可用K8S集群(v1.14.0)

一. 集群规划 主机名 IP 角色 主要插件 VIP 172.16.1.10 实现master高可用和负载均衡 k8s-master01 172.16.1.11 master kube-apiserver.kube-controller.kube-scheduler.kubelet.kube-proxy.kube-flannel.etcd k8s-master02 172.16.1.12 master kube-apiserver.kube-controller.kube-scheduler.k

管理和维护RHCS集群

导读 管理和维护RHCS集群是一个非常复杂和繁琐的工作,要维护好一个RHCS集群,必须熟悉RHCS的基本运行原理,在集群管理方面,RHCS提供了两种方式:即Luci图形界面方式和命令行方式,这儿重点讲述在命令行下如何管理RHCS集群. 启动RHCS集群 RHCS集群的核心进程有cman和rgmanager.要启动集群,依次启动cman,然后再启动rgmanager,操作如下: 在主机web1上启动集群服务: [[email protected] ~]# service cman start St