首页 > 代码库 > 无交换机实现集群网络互联

无交换机实现集群网络互联

分布式集群中对于高性能网络的需求日益增强,尤其是存储集群,对于数据交换的网络带宽、延迟等要求更高。而对于超小规模集群(三节点、四节点等),万兆交换机的使用严重地增加了TCO。这成为了一些小微型企业小规模集群建设的一个门槛。这里对无交换机实现集群网络互联进行了一些简单的探索。 

一、网状拓扑结构
在此种结构中,任意节点都是两两互联,任意两个节点都是直接通信,不用通过其他节点进行转发。每个节点都需要至少需要N-1个网络端口(N为结点数),例如3节点互联,每个节点就至少需要2个网络端口。

 

常规来说,当Linux系统节点中有多个网络端口时,每个网络端口都需要配置一个不同网段的IP地址,每个节点都需要通过不同的IP地址与其他节点通信。但是很多上层应用(尤其是集群应用软件)只支持在同一IP上相互访问。

技术分享

在网状拓扑结构下免交换机互联需要解决的问题有两个: 
1)每个节点有多个IP; 
2)发送数据包网络端口的选择;


1. 配置静态路由

在Linux系统中,配置多网口IP时,一般都会为每个网口配置不同网段的IP地址。如果配置成同一网段,会出现一些不符合预期的现象。例如网卡流量不均衡,arp的应答MAC地址不确定,断网仍能ping通…… 

 

其实主要是因为两个原因造成的: 
a.Linux在默认情况下响应ARP请求时,使用的IP地址并未被严格的限定(修改arp_filter严格限定)。 
b.两个网口共用一个路由表,Linux只会使用第一个符合条件路由条目。 

 

我们要利用这一特性解决第一个问题,如果ARP应答没有严格限定,在不同的网口访问节点的同一IP就都都可以得到应答。可以把同网段中的任意一个IP当作主IP,集群内的所有节点就都可以通过此IP访问该节点。

 

对于第二个问题数据出口的选择,可以通过配置静态路由表解决。例如:有三个节点,拓扑连接以及网络设置如下: 

技术分享

此中网络环境下,静态路由的当按如下配置: 

Node A:
route add -host 10.10.10.12 dev eth3
route add -host 10.10.10.22 dev eth3
route add -host 10.10.10.13 dev eth2
route add -host 10.10.10.23 dev eth2 

Node B:
route add -host 10.10.10.13 dev eth3
route add -host 10.10.10.23 dev eth3
route add -host 10.10.10.11 dev eth2
route add -host 10.10.10.21 dev eth2 

Node C:
route add -host 10.10.10.11 dev eth3
route add -host 10.10.10.21 dev eth3
route add -host 10.10.10.12 dev eth2
route add -host 10.10.10.22 dev eth2 

 

2. 链路捆绑
Linux中可以使用链路捆绑(Channel Bonding)将多个网络端口捆绑成一个虚拟端口,常规的链路捆绑一般使用主备模式(Active-Backup)或者负载均衡模式(Load Balancing)。我们需要根据不同的目的地址选择不同的物理端口发送数据,这两种模式都无法达到该目标,所以我们退一步要求,使用一种特殊的链路捆绑模式广播模式(Broadcast)。 

 

广播模式也称bond 3模式,是一种较少使用的特殊模式,对Bonding设备中所有的网络端口均发送需要传输的数据,用于实现容错(Fault Tolerance)等机制。 

 

在此模式下我们构建的无交换机互联网络在逻辑拓扑上与传统网络中采用集线器互联网络的结构相似,每一个节点都会收到其他节点发送的数据包,如果数据包目的地址与本节点相同则接收数据包,若不同则丢弃数据包。 

 

此种架构优点是配置简单,单一的IP地址,不需要关心网口的连接顺序等。缺点是不同节点同时发送数据时会发生带宽的相互争抢。 

 

其实balance-xor(bond 2)模式也可以达到我们想要的效果,该模式是通过(源MAC地址 XOR 目标MAC地址)% slave数量选择发送路径的。从理论上来讲我们可以通过为集群构建一组特殊的MAC地址来实现,由于过于配置复杂且对比其他方案没有优势,在此没有进行测试。

RHEL6 链路捆绑的配置方法

 

二、树形拓扑结构(星形拓扑结构)
在此种结构中,除了直接连接的节点之外,其他节点之间都是通过其他节点进行转发数据包间接通信。只有负责转发的数据包的节点需要有多个网络端口。在节点数较少时,一般使用其中的星形拓扑结构。

技术分享

 
在树形拓扑结构下的免交换机互联需要解决的问题有两个: 
1)负责转发数据包节点有多个IP; 
2)数据包转发时的网络端口选择;

 

3. 网桥(Bridge)
网桥(Bridge)是早期的两端口二层网络设备,用来连接不同网段。现在已经很少能看见网桥硬件,多数是软件模拟网桥,例如在虚拟化系统中”软网桥”经常被用于连接虚拟机网络。

技术分享

 

我们把树形结构中负责转发的节点所有网络端口桥接成一个网桥设备,并把桥接口配置一个IP地址。这样每一个到达此口的数据包都会在此桥接设备上所有的端口各复制转发一份,从而实现了所有节点间的通信。 

 

网桥属于二层设备,工作在数据链路层。其配置与网络层无关,不需要关心每个节点的IP配置。其优点是配置简单,对网络层来讲是透明的,可以随意配置更换IP地址。缺点是带宽争抢比较严重,软件实现的网桥效率较低延迟较大,占用部分计算资源。 

 

此种方案另外一个优点是可以实现链路冗余。只需要通过连接一些冗余链路,然后开启桥接设备的STP协议。在网络链路均正常时,STP协议会主动裁减冗余链路,在逻辑上保证树形结构,以防止网络环路。在有些网络发生断开时,STP协议会再次启用冗余链路以保证通信,整个切换过程在秒级时间内完成。 

 

例如有三个节点,我们将其两两相连形成一个环,这样就允许任意一条网络断开。 
配置网桥的网口需要配置成混杂模式,可以通过如下命令配置:
ifconfig eth0 promisc

Linux网桥有命令行brctl与配置文件两种配置方式,请参考: 
Linux网桥的实现分析与使用 
RHEL 桥接设备配置文件

 

4. 路由三层转发
区别于网桥设备,路由转发是工作在网络层,负责转发数据的节点充当了软路由的角色。这要求所有直连节点间所在IP网段均不相同,简单来讲有几根网线就有几个不同的IP网段。

 

路由表的配置还分为静态路由和动态路由。静态路由适合网络拓扑结构很少更改的网络,每改变一次网络结构,就有手动配置一次路由表。与此相反动态路由会自动更新路由表,同时会消耗少量计算和网络资源。

 

4.1 静态路由
Linux 系统要达到路由器功能,首先得打开Linux 系统内核中的IP转发功能。对于大多数发行版,在默认情况下这一功能是关闭着的,需要通过修改内核参数控制参数使其开启。
echo "1" > /proc/sys/net/ipv4/ip_forward

 

在开启了IP转发功能后,就需要根据具体的网络拓扑配置路由表。对于直连的节点间通信,只要保证两端IP地址在同一网段里即可。对于需要其他节点转发的节点之间的通信,需要添加一条静态路由。指定一个与其直连负责转发的节点IP地址作为下一跳地址。 

技术分享

 
此中网络环境下,静态路由的当按如下配置:
Node A:
echo "1" > /proc/sys/net/ipv4/ip_forward

Node B:
route add -host 10.10.10.11 gw 10.10.11.11 
route add -host 10.10.10.13 gw 10.10.11.11

Node C:
route add -host 10.10.11.11 gw 10.10.10.11
route add -host 10.10.11.12 gw 10.10.10.11

 

4.2 动态路由
动态路由是与静态路由相对的一个概念,指路由器能够根据路由器之间的交换的特定路由信息动态建立自己的路由表,并且能够根据链路和节点的变化适时的进行自动调整。 

 

将转发节点配置成动态路由,就可以实现无交换机网络互联。同时还可以配置冗余链路,以保证通信链路的高可用。 

 

Linux下的Zebra、Gated、Routed等程序,均可以实现动态路由。但由于配置较为复杂,在此不做详细讨论。

 

三、环型拓扑结构
在此种结构中,每一个节点都只与另外两个节点相连,在物理结构上形成了一个环形。只有相邻两个节点是直接通信,其他的都是通过各自相邻节点进行转发数据包间接通信,间隔越远转发的次数越多。每一个节点都需要有两个网络端口。 

 

在环形拓扑结构下,因为其完全可以看成是一个深度较大的单臂树,也可以使用树形拓扑结构的解决方案。而树形结构中基本都是以软件转发数据形成的方案,节点数较多时效率较低。因此在环形拓扑结构中应该尝试找一些更加高效的数据转发方案。 

技术分享

 
5. IP Over FC
FC(Fibre Channel)是一种高速网络技术标准,主要应用于SAN(存储局域网)。FC提供了两种网络拓扑模式: 
FC-AL:如下图所示,该拓扑类似于以太网共享总线的拓扑,所有设备都连接在一个仲裁环中,首位相接。 

技术分享

 
Fabric:如下图所示,该拓扑类似于以太网交换机,Fabric的意思为“网状网络”,表明这种拓扑其实是一个网状交换矩阵。 

技术分享

 
在此我们讨论的是FC-AL模式,此模式下无需FC交换机,每个节点也只需要一个FC端口即可。并且上层无需额外配置,即可以此种模式组网。 

 

我们完全可以将传统的IP-以太网架构中的物理层数据链路层换成FC中对应的层次,以实现在FC网络架构中运行TCP/IP及以上的协议。 

 

IETF组织在RFC 2625、RFC 3831、RFC 4338 中相继制订和更新了IPFC的标准。Brocade,Qlogic等也为部分 FC HBA 卡推出了IPFC的驱动。遗憾的是由于很少有人使用这种模式,这种模式的驱动支持较少更新较慢,例如Qlogic有的卡仅仅支持到RHEL 5.0。 

技术分享

 
虽然FC-AL环状网路不需要配置,但是 IP over FC 的实现需要安装特定驱动以及设置。这使得此种无交换机互联模式配置也比较复杂。同时,环路拓扑结构下,所有节点共享链路的带宽。

 

小结
无交换机的网络互联重点在于网络设备的模拟,模拟软交换机、软集线器、软网桥、软路由等。综合来讲,在网状拓扑结构下配置静态路由的方式带宽利用率最高,但配置方式与网络拓扑、IP设置紧耦合,在节点多时所需网口数较多;而树形拓扑结构下的桥接模式是最为方便配置的方式,配置过程无需关心网络拓扑与iP,支持链路冗余,不过网络带宽利用率较低。而IP Over FC和Nic Bond方式仅仅可以作为一种探索,不推荐使用在实际应用环境中。

阅读原文

无交换机实现集群网络互联