OvS 实现难点

OvS 实现难点

  • 兼容 OpenFlow 多个版本

兼容 OpenFlow 多个版本

在运行时的时候,需要兼容 OpenFlow 多个版本,比如同时支持多个不同 OpenFlow 网桥的协议解析

对于不同的 OpenFlow 版本,比如都是独立的 openflow1x.h 头文件。

实现兼容性的主要方法是从核心代码中抽象出差异的大部分细节,通过在OF1.X 和稍高级的抽象表示之间添加一个进行转换的协议层。。这种方法的核心是include/openvswitch/of-util.h 中的许多 struct ofputil_* 结构。

  • OpenFlow 1.1 support is complete.
  • OpenFlow 1.2 support is complete.
  • OpenFlow 1.3 support 不完全(原因:部分功能依赖内核支持)
  • 1.4 ...
  • 1.5 ...

ovs-vswitched 为 bond 实现基于以太网源地址和VLAN的“负载均衡”机制

In particular, the source MAC and VLAN tag are hashed into one of 256 values,实现了一个 bond hash 的 hash 表。每 10 秒,会触发一次重均衡。重均衡每次调整的权重是 0.1。最多允许的不平衡量是 3%。

只有当通过绑定的流量有多个以太网源地址时才有用,例如,来自多个虚拟机的网络流量通过绑定进行多路复用。

ovs-vswitchd 代码在 vswitchd/bridge.c

bond 子接口异常,自动切换到另一个 (方法:bond_enable_slave()): 会发送一个免费 ARP(比如: gratuitous learning packet),特别是 RARP。

  • 单播包: bond 会从所有 slave 卡接收
  • 多播: 只会从一个 slave 接收
  • 广播: 当虚拟机移动到另个节点的交换机上时,vswitch 会有一个例外规则:交换机会发 ARP reply 广播:用于表示,虚拟机的MAC 已经移动到别处了。APR reply 通常是一个单播,但在这个场景是一个广播。这个广播是从交换机的某个端口发出的,他的其他端口收到都会丢包。
使用 SLB Bonding

上面说的就是,基于源 MAC+VLAN 进行 hash

如果不使用 SLB bond,也没有任何流表控制,可能虚拟机热迁移会丢包超过一分钟(取决于旧的 arp 超时)

OvS 实现难点_第1张图片

使用 LACP Bonding

依赖远程交换机实现 LACP, LACP 会协商(不用 OVS 自己的 SLB )

使用 主备 Bonding

你可能感兴趣的:(后端)