我有以下设置
+---2---+
s---1 OVS 4---t
+---3---+
其中1, 2, 3, 4
是一台服务器中的 OVS 端口(所有端口都是称为ovs1
的网桥端口(,源s
和目标t
是另外两台服务器(通过 LAN 连接(。假设,数据包流经2
(从1
(,在某些时候,我想通过端口3
转发端口1
的所有新流,而旧流保留在2
上(直到终止(。
我可以用这个 OVS 命令突然做到这一点
ovs-ofctl del-flows ovs1 in_port=1
ovs-ofctl del-flows ovs1 in_port=2
ovs-ofctl add-flow ovs1 in_port=1,action=output:3
ovs-ofctl add-flow ovs1 in_port=3,action=output:1
这迫使所有流量都通过3
而不是2
.但是我需要旧流量保留在2
上,只有新流量通过3
.这在 OVS 中可能吗?
理想情况下,我想用 OVS。如果这是不可能的,我可以摆脱它并使用 Linux 网络来实现这种"平滑"的链接切换。
任何帮助,不胜感激。
我不认为 OVS 为备份路径提供 MBB。理想情况下,您可以做的是安装 2 个具有不同优先级的类似流,并通过更改优先级切换到您想要的流。在这种情况下,您可能不会中断现有的流量。
在与我的朋友交谈后,我得到了这个问题的几个解决方案(关闭 StackOverflow(。我分享两种不同的解决方案,供将来参考。
第一个基于连接跟踪(如@pchaigno和@karthik-prasad所建议的那样(。我认为这是对解决方案的更详细的描述(他们想到了(。因此,我们安装了一个默认规则来将所有连接转发到端口2
并为2
启用连接跟踪。现在,在将流重定向到3
之前,我们安装完整的 IP 元组规则(匹配 src、dst、端口等(以将现有流转发到端口2
。换句话说,如果在(端口3
(故障转移之前端口2
有 100 个 conntrack 条目,我们将安装 100 个特定规则将数据包转发到端口2
。这将确保所有现有流将继续通过端口2
。
要将新流转发到端口3
,我们覆盖从端口2
到端口3
的默认转发规则。当我们这样做时,现有流将与更具体的规则(之前建立(匹配,并转到端口2
.新流将与通配符规则匹配并转到端口3
。请注意,即使这样,开关也不会是原子的。迁移到3
时,我们可能会丢失一些流(取决于我们如何安装更新的规则(。
解决这个问题的另一种方法,也许更优雅,是利用OpenFlow控制器。我们将OpenFlow控制器插入交换机并跟踪端口2
中的流量,并在数据包传入事件上安装端口2
转发规则(每当新流量到达时(。当我们想要故障转移时,我们会更改 OpenFlow 控制器行为,以开始将新流转发到端口3
(每当发生新的数据包传入事件时(。这会将旧流保留在端口2
中。例如,您可以使用 Ryu 控制器并编写 Ryu 应用程序来响应建议的数据包传入事件。