Openstack虚拟网络是通过Openvswitch(OVS)组件承载进行流量转发和租户隔离的,随着租户和虚拟机数量的增加,OVS内的流表数量会线性增加。由于OVS的流表是保存在内存中,当物理服务器遇到下电维修检查、宕机复位等情况时,内存中的流表会丢失,需要控制面重建流表,当OVS内流表数增加到一定规模后,重建流表的时间相当长的,导致系统故障恢复的时间长(小时级)。在流表重建完成前,整个物理服务器上的虚拟网络不可用。
Openstack Vxlan组网模式下,虚拟网络是通过Openvswitch(OVS)组件承载进行流量转发和租户隔离的,随着租户和虚拟机数量的增加,OVS内的流表数量会线性增加。由于OVS的流表是保存在内存中,当物理服务器遇到下电维修检查、宕机复位等情况时,内存中的流表会丢失,需要控制面重建流表,当OVS内流表数增加到一定规模后,重建流表的时间相当长的,导致系统故障恢复的时间长(小时级)。在流表重建完成前,整个物理服务器上的虚拟网络不通,虽然可以通过部署高可用的方式缓解单个节点故障的影响,但是当多个高可用节点同时故障、复位时,仍然面临流表缺失、网络失效长时间无法恢复的问题。
原有方案:
增量场景:
1、业务组件(如创建虚机时)会将port插入ovsdb
2、OVS agent启动db monitor,监控ovsdb中port变化
3、OVS agent通过MQ向Neutron server请求port的详情
4、Neutron server查询数据库,并返回port的详情
5、OVS agent获取到详情,根据详情下发流表到OVS
全量场景:
当物理服务器重启后,OVS agent启动db monitor从ovsdb中监控到全量的port,当集群容量到达一定的规模,ovsdb中port个数超过4000时,流表个数达20000,对于每一个port都要重复执行增量场景中的2、3、4、5步。这一过程整体非常耗时(小时级)。
改进的方法:
增量场景:
在现有方案基础上增加流表快照,如图二所示,当OVS agent通过ovs-ofctl命令下发流表时(图二步骤5),同时下发一条流表到快照中(上图步骤6),快照以文件形式存放到物理服务器的磁盘上。
全量场景:
当物理服务器重启后,先执行第7步(如图二步骤7),加载流表快照文件,读取快照中的各个分区,将各分区中的流表批量下发到OVS中。将流表恢复到服务器重启之前的样子,可将网络流量迅速打通,实现秒级的流表恢复。流表恢复后,再执行原生逻辑中的2,3,4,5,6步,目的是同步在物理服务器重启过程中的增量数据,保证流表的完备性。