使用 OVSDB 代替调用 ovs-vsctl

https://blueprints.launchpad.net/neutron/+spec/vsctl-to-ovsdb

问题描述

Neutron 的 ovs_lib 使用 Open vSwitch CLI 命令 ovs-vsctl 来执行基本的 vSwitch CRUD 操作。 这比使用直接 OVSDB 协议命令或使用 Open vSwitch Python API 慢近一个数量级。

提议的变更

首先,应该定义一个用于与 OVSDB 交互的接口,作为一个抽象基类。 然后,应该创建一个使用 ovs-vsctl 调用实现此接口的实现,并且 ovs_lib 应该通过这个新的实现进行所有 ovsdb 相关的调用。

接下来,应该使用 Open vSwitch IDL Python 库实现 OVSDB 接口。 将添加一个配置选项以允许选择要使用的 OVSDB 接口。 允许这种选择是必要的,因为两种 OVSDB 实现之间权限的处理方式存在差异。 ovs-vsctl 实现使用 sudo/rootwrap,而 IDL 库将需要授予 neutron 用户访问 ovsdb unix socket 的权限,或者使用 TCP/SSL socket 并通过防火墙规则控制访问(尽管可能只是使用环回接口)。

任何不支持所提出的 OVSDB 实现要求的发行版或部署目标仍然可以使用现有的实现。

这将允许在很大程度上保持 ovs_lib API 不变。 在一个简单的测试中,创建一个桥接上 100 个端口并删除它们,当前的 ovs_lib 实现比使用 OVS Python API 慢近 10 倍。 值得注意的是,ovs_lib 比向 Open vSwitch 发送原始 OVSDB 命令慢 100 多倍。 原始 OVSDB 和现有的 OVS Python API 之间的性能差异是由于 OVS Python API 自己的纯 Python JSON 解析器的性能较差,测试表明它比 Python 的 stdlib JSON 解析器慢约 30 倍,不幸的是,这对于 OVS 的用例来说不太合适,因为它需要准备好整个字符串进行解析,而 OVS 代码的结构是随着读取而解析缓冲区。 通过编写一个添加 Python 绑定到 C 版本解析器的扩展,可以在 OVS 的 JSON 解析器中实现潜在的显著加速。

OVS IDL 实现使用监视命令来同步 OVSDB 的本地缓存。 不幸的是,它没有将这些监视事件提供给库的用户。 为了取代 ovsdb-monitor,有必要使用较低级别的 Open vSwitch API 运行额外的监视请求以获取这些事件通知,修改 IDL 库在运行时,或者尝试将代码合并到上游 Open vSwitch 库中,该库可以选择性地公开这些事件。

数据模型影响

n/a

REST API 影响

n/a

安全影响

现有的实现通过 sudo/rootwrap 处理权限。 提出的更改将使用程序化 API,并改为依赖于在底层 Open vSwitch unix 域套接字上设置适当的权限,或者通过使用 Open vSwitch 的 SSL 身份验证。

通知影响

n/a

其他最终用户影响

n/a

性能影响

在不更改上游 OVS Python API 的情况下,可以提高 6-7 倍的速度。 通过使用 OVS C JSON 解析器的 Python 绑定,应该能够接近本机 OVSDB 协议性能,这比当前的 ovs_lib 快 100 倍。

IPv6 影响

n/a

其他部署者影响

重复 Security 部分的内容,部署者必须确保 neutron 用户具有对 Open vSwitch db.sock 的读/写权限。 还需要一个新的配置选项来指定 ovs-server 的连接字符串。 打包者需要添加对 python-openvswitch 的依赖项(这似乎在常见的发行版中很容易获得,因为它包含在标准的 openvswitch 软件包中)。

开发人员影响

对于初始实现,ovs_lib 的 API 应该不会有太大变化。

值得注意的是,当前使用 XenAPI 的用户使用修改后的 rootwrap 版本来执行 ovs-vsctl 命令。 要在 XenAPI 中使用提出的 OVSDB 实现,可能需要开发一个等效的包装器。 这项工作不在此蓝图的范围内。

社区影响

n/a

备选方案

可以围绕 OVSDB 协议编写我们自己的库。 它很可能会更快,但最终很可能看起来很像 OVS Python API,在我们完成时。

实现

负责人

otherwiseguy

工作项

  • 将现有的处理完全与外部 Open vSwitch 操作相关的 OVS 单元测试转换为功能测试。

  • 将现有的 ovs-vsctl 调用转换为等效的 OVS Python API 调用

  • 重构 OVSDB 监视以使用 OVS Python API

  • 为 OVS 的基于 C 的 JSON 推送解析器编写 Python 绑定以提高性能

依赖项

添加对 OVS python 绑定的要求

测试

ovs_lib 的许多单元测试都必须更改,因为它们过于紧密地绑定到特定的实现细节,模拟对 ovs-vsctl 的调用等。

Tempest 测试

n/a

功能测试

应该创建实际测试 CRUD 操作的针对真实 Open vSwitch 安装的功能测试。 它们应该适用于两种 OVSDB 接口实现。

API 测试

n/a

文档影响

用户文档

需要对新的配置选项和安全注意事项进行文档记录。

开发人员文档

OVSDB 抽象基类应该有良好的文档记录。 将添加树内开发人员文档,描述 ovs_lib 的实现。

参考资料

http://tools.ietf.org/html/rfc7047 https://github.com/openvswitch/ovs/tree/master/python/ovs