本文是由字节跳动系统部 STE 团队出品的文章。
系统级服务的无扰动升级(non distruptive upgrade,下文简称为热升级)对服务的快速迭代开发有非常重要的意义。虚拟交换机(vSwitch)作为虚拟网络的入口,需求多变,但频繁升级断网会影响虚机上运行的业务。此外,一般每台宿主机上只有一个虚拟交换机,在架构上也不好做主备。因此热升级技术对 vSwitch 的快速迭代至关重要。
本文介绍了我们在 DPDK based Open vSwtich(下简称 ovs-dpdk)上的热更新技术的实践,希望和业界同行共同探讨。
现状
Open vSwitch(下简称 ovs)已有的“热升级”方案基本是为 ovs-kernel 而实现的。在 ovs-kernel 中,vswitchd 进程是慢路径,kernel 模块是快速路径。升级 vswitchd 进程时可不替换 kernel 模块,让大部分流量经过 kernel 中 flow cache 转发,减少网络扰动。升级 kernel 模块则可能会有较长的断网风险。这块的详细信息可以参考链接: http://docs.openvswitch.org/en/latest/intro/install/general/?highlight=hot%20upgrade#hot-upgrading
ovs-dpdk 中,快速路径和慢速路径都集成在 vswitchd 进程中,如果简单的重启 vswtichd,由于 DPDK 的初始化(主要是大页初始化,1G 大页耗时约 600ms)、网卡的初始化(实测 Mellanox CX5 驱动初始化耗时接近 1s)都比较耗时,因此会有秒级断网。
为了实现快速的迭代开发,降低升级导致的断网带来的业务扰动,需要开发 ovs-dpdk 的热升级特性。
方案与折衷
实现热更新有很多实现方式:
插件式升级(形象的说就是热补丁):将主要的包处理逻辑变成动态链接库,通过热加载插件的方式,避免耗时的 dpdk 初始化和网卡初始化。(DPDK 主从模式也可被认为是这种方式的变体)
-
优点:常规升级断网时间非常小,可以做到纳秒级。
缺点:框架升级和插件升级成为了两种升级,框架和插件之间必然有相互调用的 API 和共享数据结构,开发人员需要保持框架和插件之间的 ABI(Application Binary Interface)一致。一个简单的例子是流表的结构体可能会在框架和插件之间共享,如果升级修改了流表的结构体,框架也需要升级,否则会因为不一致而导致内存错误。