节点 - Ignite单独的实例,服务端或客户端。
节点顺序 - 每个节点的内部属性(对于TcpDiscoverySpi,它只是一个统一增加的数字)。
协调器 - 特定(按最小顺序号)服务器节点,负责协调集群中的不同过程(如验证发现消息,管理分区映射交换等)。
拓扑 - 所有节点都被组织成的结构。
发现机制作为基础功能旨在让单独的Ignite节点形成集群。其主要目标是构建所有节点共享的集群视图(节点数,节点顺序等),并保持该视图的一致性。
Discovery隐藏在DiscoverySpi接口背后,其默认实现是TcpDiscoverySpi。另一个实现是ZookeeperDiscoverySpi。
实现了DiscoverySpi接口的类定义了一个拓扑(所有节点都被排列在其中)的结构。其中TcpDiscoverySpi集群使用的是环形拓扑。
当每个节点保持与其下一个节点连接并且其上个节点保持与该节点的连接时,Tcp Discovery将集群中的所有服务端节点排列成环形结构。客户端节点位于环外,并始终连接到特定服务端(客户端没有上一个的节点,只能连接到一个服务端)。
大多数实现逻辑在服务端ServerImpl和客户端ClientImpl类中。
当新的服务器端节点启动时,它会通过TcpDiscoveryIpFinder提供的所有地址尝试查找现有集群。如果所有地址都不可用,则节点将自身视为第一个节点,从自身形成集群并成为此集群的协调者。
如果节点设法从IpFinder连接到其中一个地址,它将执行下文节点加入过程。
节点连接由涉及不同消息的几个阶段组成 - 加入请求消息,NodeAdded消息,NodeAddFinished消息。在验证新节点的过程中,如果验证成功并且在所有节点上更新拓扑信息,则会发生配置信息交换。
当节点成功加入时,它被放置在环中的最后一个节点和协调器之间。
连接过程的起点是ServerImpl和ClientImpl类中提供的joinTopology方法。
首先节点从其所有组件(例如从GridCacheProcessor收集缓存配置)收集发现数据。这里的中心点是TcpDiscoverySpi #collectExchangeData,它在每个组件上调用GridComponent#collectJoiningNodeData。 此disco数据被打包到"加入请求"中并发送到集群。
当JoinReq(加入请求)到达协调器时,它将验证消息,并在验证通过时生成NodeAdded消息(ServerImpl.RingMessageWorker #processJoinRequestMessage)。在加入请求的生命周期结束后; 只有NodeAdded消息进一步使用。协调器创建此消息,添加有关加入节点的信息(包括JoinReq中加入节点发现数据),并发送到环上。
处理逻辑位于ServerImpl.RingMessageWorker#processNodeAddedMessage中。
在接收到NodeAdded时,集群中的每个节点(包括协调器节点)将加入节点发现数据应用于组件,收集其本地发现数据并将其添加到消息中。 然后,节点通过调用ServerImpl.RingMessageWorker#sendMessageAcrossRing将NodeAdded发送到下一个节点。
当NodeAdded完成的消息通过环并再次到达协调器时,表示NodeAdded的生命周期完成。之后,协调器创建NodeAddFinished消息并将其发送到环上。
NodeAdded消息也被传递到加入的那个节点,当所有其他节点都处理完消息时,它会在最后接收消息。
NodeAddFinished消息,顾名思义,完成了节点连接的过程。收到此消息后,服务端和客户端的每个节点都会触发NODE_JOINED事件,以通知Discovery Manager有关新加入节点。
NodeAddFinished和其他加入请求
如果连接节点未按时收到NodeAddFinished,则会发送其他加入请求。此时间由TcpDiscoverySpi#networkTimeout定义,默认值为5秒(TcpDiscoverySpi#DFLT_NETWORK_TIMEOUT)。
翻译自:
https://cwiki.apache.org/confluence/display/IGNITE/TCP+Discovery+SPI+under+the+hood