-
Notifications
You must be signed in to change notification settings - Fork 67
通讯与组网
Nano中,通讯分为外部通讯和内部通讯两种。
外部通讯,是Nano集群与外部模块之间的通讯,通常使用固定地址和端口,以便外部访问,比如FrontEnd调用Core模块提供的REST API接口默认会设定为TCP 5850端口。
内部通讯,是Nano集群内部模块之间的控制与传输,比如平台模块之间的控制报文,Cell与ImageServer之间的镜像传输数据等。为了最大程度地适应多变的网络环境,同时提升系统部署的智能化程度,减少人工配置工作,Nano的绝大部分内部网络通讯地址和端口均为动态分配,自动配置,正常情况下用户无需干预即可正常工作;当网络环境发生地址变化、模块迁移等场景下,Nano平台都可以自动完成网络重建和数据更新的工作,无需重新手动调整。
Nano的通讯形式如下图所示:
REST API由Core模块提供服务,默认监听端口TCP 5850;FrontEnd模块基于REST接口,提供了完整的Web管理界面便于用户操作,默认监听端口TCP 5870,用户也可以根据需要定制自己的FrontEnd服务。这两个端口为静态配置,在平台工作过程中不会发生变化,用户可以将其设置为认为合适的端口(需要重启模块生效, 详见 安装与配置)。
API接口定义和FrontEnd定制详见 自定义开发
现实中的网络环境非常复杂,而且容易变化,为了实现自动化的集群组网,Nano定义了通讯域的概念(Domain)。
同一套网络环境中,允许存在多个Nano集群,每个Nano集群使用一个独立的通讯域,一个通讯域由域名、组播地址、组播端口三部分定义。相同通讯域的模块可以相互发现,自动组网,同时不会与其他域的Nano集群交互冲突。
Nano集群安装时默认的通讯域如下:
域名:Nano
组播地址:224.0.0.226
组播端口:5599
用户可以在安装程序配置或者模块配置时修改默认域信息,以适配自己的环境或者构建多个Nano集群。
通讯域的发现和组网通过组播协议来实现。
当用户设置好组播地址和端口并启动模块后,模块会构建两个组播通道,Core模块作为桩(Stub)监听用户设置的通讯域地址,比如224.0.0.226:5599,其他模块(比如Cell)作为发信者(pinger)会在 组播地址:(组播端口 - 1) 上监听桩的组播响应,比如224.0.0.226:5598。
组建Nano集群时,应当首先启动Core模块,Core模块初次时会检查本地网络设备,选择一个有网络可用的网卡作为监听设备,在上面监听组播地址和模块通讯端口。如果Core模块所在服务器有多个已连接网络的网卡设备,Core模块会提示用户选择用来做内网通讯的网段作为自己的监听地址。比如一台物理服务器有两张网卡,一张使用ip 59.36.83.74连接公网,一张使用ip 172.16.6.3连接内部网络,请选择172.16.6.3作为监听地址。
Core成功启动之后,当使用相同通讯域的模块(比如Cell)启动时,会首先向组播的Stub通道发送查询报文,Core的监听到该查询报文后,会将Core的模块通讯地址应答给请求者;请求者在Pinger通道上监听到应答请求,获取到Core的通讯地址,然后在本服务器选择相同网段的网络设备启动通讯服务,并尝试连接Core模块开始工作。
Nano集群内部模块之间通讯使用基于UDP的可靠传输协议,为了保障集群可用性,减少人工配置故障,所有网络地址和端口都由模块自动选择、分配和组网,无需人工干预。Nano模块启动后,会在UDP 5600~5800端口范围内寻找可用端口,建立服务并且与其他模块通讯;模块启动时,Nano的基础框架会根据模块类别和所在服务器MAC地址,为模块分配一个形如Cell_000c29987ded的模块名,用于在系统中标识和区别;只要网络设备不发生变化,在同一台服务器上反复安装启动,都会保持同一个模块名称。
为了保障数据安全,防护数据泄露和破坏,Nano内部镜像和云主机数据均采用HTTPS传输,默认情况下,Nano安装程序会生成自签名CA证书,并在每个涉及数据传输的服务器上将其设置为可信证书。同时镜像构建和克隆过程中,Nano还会使用数字签名检查最终文件一致性,防范网络故障或者传输异常导致的数据损毁。