英文地址:http://assafmuller.com/2014/08/16/layer-3-high-availability/
当前,你可以通过多网络节点的方式解决负载均衡,但是这并非高可靠和冗余的解决方案。假设你有三个网络节点,创建新的路由,会自动的规划和分布在这三个网络节点上。但是,如果一个节点坏掉,所有路由将无法提供服务,路由转发也无法正常进行。Neutron,在IceHouse版本中,没有提供任何内置的解决方案。
DHCP的Agent是一个另类——DHCP协议本身就支持在同一个资源池内同时使用多个DHCP提供服务。
在neutron.conf中仅仅需要改变:
dhcp_agents_per_network = X
首先,让我们来看一下物理层面的实现。当一台主机连接到子网10.0.0.0/24,会发出DHCP Discover广播包。两个DHCP服务进程dnsmasq1和dnsmasq2(或者其他的DHCP服务)收到广播包,并回复10.0.0.2。假设第一个DHCP服务响应了服务器请求,并将10.0.0.2的请求广播出去,并且指明提供IP的是dnsmasq1-10.0.0.253。所有服务都会接收到广播,但是只有dnsmasq1会回复ACK。由于所有DHCP通讯都是基于广播,第二个DHCP服务也会收到ACK,于是将10.0.0.2标记已经被AA:BB:CC:11:22:33获取,而不会提供给其他的主机。总结一下,所有客户端与服务端的通讯都是基于广播,因此状态(IP地址什么时候被分配,被分配给谁)可以被所有分布的节点正确获知。
在Neutron中,分配MAC地址与IP地址的关系,是在每个dnsmasq服务之前完成的,也就是当Neutron创建Port时。因此,在DHCP请求广播之前,所有两个dnsmasq服务已经在leases文件中获知了,AA:BB:CC:11:22:33应该分配10.0.0.2的映射关系。
以上列出的解决方案,实质上都有从失败到恢复的时间,如果在简单的应用场景下,恢复一定数量的路由到新节点并不算慢。但是想象一下,如果有上千个路由就需要话费数个小时完成,重新分配和配置的过程。人们非常需要快速的故障恢复!
这里有一些文档描述DVR是如何工作的:
这里的要点是将路由放到计算节点(compute nodes),这让网络节点的L3 Agent变得没用了。是不是这样呢?
<span style="color:#333333;">[stack@vpn-6-88 ~]$ sudo ip netns exec qrouter-b30064f9-414e-4c98-ab42-646197c74020 ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default ... 2794: </span><span style="color:#ff0000;"><strong>ha-45249562-ec</strong></span><span style="color:#333333;">: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether 12:34:56:78:2b:5d brd ff:ff:ff:ff:ff:ff inet 169.254.0.2/24 brd 169.254.0.255 scope global ha-54b92d86-4f valid_lft forever preferred_lft forever inet6 fe80::1034:56ff:fe78:2b5d/64 scope link valid_lft forever preferred_lft forever 2795: qr-dc9d93c6-e2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether ca:fe:de:ad:be:ef brd ff:ff:ff:ff:ff:ff inet 10.0.0.1/24 scope global qr-0d51eced-0f valid_lft forever preferred_lft forever inet6 fe80::c8fe:deff:fead:beef/64 scope link valid_lft forever preferred_lft forever 2796: qg-843de7e6-8f: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default link/ether ca:fe:de:ad:be:ef brd ff:ff:ff:ff:ff:ff inet 19.4.4.4/24 scope global qg-75688938-8d valid_lft forever preferred_lft forever inet6 fe80::c8fe:deff:fead:beef/64 scope link valid_lft forever preferred_lft forever</span>这是在master实例中的输出。在另外一个节点的同一个路由上,在ha, hr或者qg设备上没有IP地址。也没有Floating Ip或者是路由记录。这些是被配置在keepalived.conf中的,当keepalived检测到Master实例的失败后,这些地址(或者:VIPs)会被keepalived在适当的设备中重新配置。这是对于同一个路由的keepalived.conf的实例:
vrrp_sync_group VG_1 { group { VR_1 } notify_backup "/path/to/notify_backup.sh" notify_master "/path/to/notify_master.sh" notify_fault "/path/to/notify_fault.sh" } vrrp_instance VR_1 { state BACKUP interface ha-45249562-ec virtual_router_id 1 priority 50 nopreempt advert_int 2 track_interface { ha-45249562-ec } virtual_ipaddress { 19.4.4.4/24 dev qg-843de7e6-8f } virtual_ipaddress_excluded { 10.0.0.1/24 dev qr-dc9d93c6-e2 } virtual_routes { 0.0.0.0/0 via 19.4.4.1 dev qg-843de7e6-8f } }这些notify脚本是干虾米用的呢?这些脚本是被keepalived执行,转换为Master,备份或者失败。这些Master脚本内容:
#!/usr/bin/env bash neutron-ns-metadata-proxy --pid_file=/tmp/tmpp_6Lcx/tmpllLzNs/external/pids/b30064f9-414e-4c98-ab42-646197c74020/pid --metadata_proxy_socket=/tmp/tmpp_6Lcx/tmpllLzNs/metadata_proxy --router_id=b30064f9-414e-4c98-ab42-646197c74020 --state_path=/opt/openstack/neutron --metadata_port=9697 --debug --verbose echo -n master > /tmp/tmpp_6Lcx/tmpllLzNs/ha_confs/b30064f9-414e-4c98-ab42-646197c74020/state
l3_ha = True max_l3_agents_per_router = 2 min_l3_agents_per_router = 2
neutron router-create --ha=<True | False> router1
原文地址:http://blog.csdn.net/xiaoquqi/article/details/39429261