-
DVR : Distributed Virtual Router(分布式虚拟路由)
-
在没有 DVR 之前,所有跨子网的通讯,以及子网到外网的通讯都需要经过网络节点来转发:
- DVR 既是在所有启动 Neutron L3 Agent 的节点上都部署 Neutron router。从而实现:
- 对于东西向的流量, 流量会直接在计算节点之间传递。
- 对于南北向的流量,如果有floating ip,流量就直接走计算节点。如果没有floating ip,则会走网络节点。
neutron/extensions/dvr.py
class Dvr(extensions.ExtensionDescriptor)
class DVRMacAddressPluginBase(object)
neutron/db/dvr_mac_db.py
class DVRDbMixin(ext_dvr.DVRMacAddressPluginBase)
def __new__(cls, *args, **kwargs):
registry.subscribe(_delete_mac_associated_with_agent,
resources.AGENT, events.BEFORE_DELETE)
return super(DVRDbMixin, cls).__new__(cls)
事件订阅。
属性方法,获取 core plugin 的实例
调用 _get_dvr_mac_address_by_host
根据 host 获取 dvr_host_macs
的数据库记录
若是没有相关记录则调用 _create_dvr_mac_address
创建 dvr_host_macs
的数据库记录
读取配置文件中的 dvr_base_mac
调用 _create_dvr_mac_address_retry
实现 mac 地址的创建,实现 dvr_host_macs
的数据库记录的创建
- 调用
get_random_mac
产生 Mac 地址 - 创建
dvr_host_macs
的数据库记录 - 调用
get_dvr_mac_address_list
获取所有dvr_host_macs
的数据库记录 - 调用 core plugin 实例的
plugin.notifier.dvr_mac_address_update
发送 rpc 消息 - 调用
_make_dvr_mac_address_dict
返回创建后的信息
获取所有的 dvr_host_macs
的数据库记录
def _make_dvr_mac_address_dict(self, dvr_mac_entry, fields=None):
return {'host': dvr_mac_entry['host'],
'mac_address': dvr_mac_entry['mac_address']}
当有 agent 资源将被删除时,会调用该方法。
- 获取 core plugin 的实例
- 若是该 agent 所在的 host 还有别的 agent 则不作操作,直接返回
- 若是该 agent 所在的 host 没有别的 agent 了,则删除该 host 的
DistributedVirtualRouterMacAddress
(dvr_host_macs
)数据库记录 - 调用 core plugin 实例的
get_dvr_mac_address_list
方法获取所有的dvr_host_macs
数据库记录 - 调用 core plugin 实例的
plugin.notifier.dvr_mac_address_update
发送 rpc 消息
根据 subnet
和 fixed_ips
获取子网的详细信息(带有 gateway_mac
,这个方法会通过 rpc 被调用)
获取提供 DVR 服务的 port
host
:host idsubnet
:subnet id
Scenario: High Availability using Distributed Virtual Routing (DVR)