-
同时,老的 ovs 会将所有的 OpenFlow 规则进行备份。
-
这一切完成之后,老进程会返回 JSON-RPC 的请求的响应。如果上述过程无问题,则返回成功,升级继续。否则返回失败,新进程会退出,升级失败。同时老进程会状态回滚,将之前释放的资源又重新申请回来,回到正常的工作状态。
-
新进程获得各种状态信息,开始正常初始化。包括 DPDK 初始化内存,ovs 从 ovsdb 中获取网桥、网卡等各种配置开始初始化等。在这个过程中,如果出现异常,新进程 crash,会导致 JSON-RPC 这个 unix socket 连接中断。一旦老进程检测到这个连接中断,就认为新进程初始化失败,自动回滚。
-
新进程加载之前备份的 OpenFlow 规则。这之间的 OpenFlow 规则变更,会由 local controller 记录并下发。
-
新进程发起第二阶段 JSON-RPC 请求。
-
第二阶段:
-
- 老进程退出。
-
新进程开启 pmd 线程开始转发。
-
升级结束。
下图简单的描述了升级时序图:
由升级时序图可以看出,热升级第一阶段里新 ovs 进程完成了最耗时的初始化工作,同时老 ovs 进程一直在进行转发,并没有断网。断网只是在第二阶段老 ovs 退出和新 ovs 启动 PMD 线程之间发生。
在升级过程中,我们利用了 MLNX 网卡一个特性:同一个网卡设备可以被两个独立的 dpdk 进程同时打开,并且流量会被同时镜像到两个进程中去。如果使用其他的网卡,可以通过多 VF 配合流表规则切换的方法达到同样效果。这里就不再展开叙述了。
断网时间评估
======
我们考察了两种虚拟网卡后端的断网时间:
-
采用 representer + VF 的方式,
-
采用 vhost-user + virtio 的方式。
测试方法