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

分布式集群中对于高性能网络的需求日益增强,尤其是存储集群,对于数据交换的网络带宽、延迟等要求更高。而对于超小规模集群(三节点、四节点等),万兆交换机的使用严重地增加了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方式仅仅可以作为一种探索,不推荐使用在实际应用环境中。

阅读原文

时间: 2024-12-22 20:47:56

无交换机实现集群网络互联的相关文章

shell 脚本实战笔记(7)--集群网络相关知识和环境搭建

前言: 对网络相关的知识, 做下笔记. 包括IP地址A/B/C的分类, 静态地址的配置/DNS配置, 以及网卡相关信息查看. *) A/B/C/D类网络地址的划分 IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址 IPv4的地址划分, 可以分为5种类型, A/B/C/D/E类 A类地址: 由1字节的网络地址和3字节主机地址组成, 网络地址最高位必须是"0", 地址范围从1.0.0.0到126.0.0.0. A类网络有126个, 每个网络能容纳1亿多个主机. B类

Windows集群网络负载均衡

在接触负载均衡的时候,笔者先是在网络上进行负载均衡的搜索,弄清楚了到底什么是负载均衡,之后就发现,支持负载均衡的系统有很多.常用的是Windows,Linux这两大系统.那么网上的教程最多的也是关于LVS和win2003的配置操作.那么现在笔者,在此为大家主要介绍一下Windows负载均衡的特点. 通过使用由两台或多台计算机一起组成的集群,网络负载均衡使得Web服务器的可用性提高,可扩展性改善?Internet客户使用单一IP地址(或多宿主主机采用一套地址)访问集群?网络负载均衡集群与运行单一服

机房4台服务器集群网络配置

主要目标: 可以通过内网系统访问楼下机房服务器集群,楼下机房只给一个可以访问外网的IP. 现有条件: 只有一根可以上外网的网线 一台交换机 4台高性能服务器,每台服务器有两个网口 主要网络架构设计: 一台服务器为master节点 另外三台服务器分别为slave1,slave2,slave3 四台服务器安装的操作系统皆为unbuntu server IP 分布: master节点eth0: 192.168.223.1 , eth1: 10.1.8.200 slave2节点eth0: 192.168

常见的无公网IP中小企业VPN互联解决方案

随着企业规模的发展,信息化时代的到来,越来越多的企业都在逐步依靠计算机网络.应用系统来开展业务 并采用internet来开展更多的商务活动,由于种种原因,稍具规模的企业都不只是一个办公场所,而是有总部 .分公司.办事处.工厂.仓库等多个业务点,既然越来越多的应用了计算机和各类软件系统来处理企业业务, 企业的应用系统(如ERP.财务.文件传输.内部实时邮件等)如何扩展到远程分支机构中去?成了众多企业的 一个难题! 总部与分公司.工厂与写字楼.生产车间与仓库.生产厂与销售部. 分厂与总厂之间距离虽说

kubernetes集群网络配置方案——flannel部署

部署环境: CentOS Linux release 7.2 64位 10.10.0.103 node01 10.10.0.49 node02 安装过程: # yum install flannel # tar zxf flannel-v0.8.0-linux-amd64_.tar.gz # cp flanneld /usr/bin/ # cp mk-docker-opts.sh /usr/bin/ 编辑服务配置文件: #cat /usr/lib/systemd/system/flanneld.

NAT下虚拟机集群网络配置

VMware 设置 物理机(宿主机)设置 虚拟机网卡设置 [[email protected] gongice]# ifconfig eth0 192.168.153.11 [[email protected] gongice]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:2C:DF:3D inet addr:192.168.153.11 Bcast:192.168.153.255 Mask:255.255.255.0 inet6 add

docker 集群网络部署

编辑/etc/network/interface文件 auto br0 iface br0 inet static address 192.168.7.31 netmask 255.255.240.0 gateway 192.168.7.254 bridge_ports em1 bridge_stp off dns-nameservers 8.8.8.8 192.168.6.1 将docker的默认网桥绑定到这个新建的br0上面,这样就将这台机器上容器绑定到em1这个网卡所对应的物理网络上了.u

cobbler集群网络装机

Centos7.X版本安装cobblervim /etc/selinux/config #关闭selinuxsetenforce 0 #半关闭chkconfig iptables off #开机不自启iptables -F #清空防火墙[[email protected] ~]# systemctl stop firewalld #关闭防火墙[[email protected] ~]# systemctl disable firewalld #开机不自启[[email protected] ~]

Kubernetes: 集群网络配置 - flannel

参考: [ Kubernetes 权威指南 ] Kubernetes 集群搭建可以参考 [ Kubernetes : 多节点 k8s 集群搭建实践 ] 在多个 Node 组成的 Kubernetes 集群内, Kubernetes 本身不会对跨主机容器网络进行设置. flannel 就是解决跨主机容器间网络互通的需求. Kubernetes 集群架构 Server List 节点名称 节点 IP k8s-master 10.10.10.10 k8s-node1 10.10.10.11 k8s-n