理解 OpenStack 高可用(2):虚拟路由冗余协议

NinaNickel 9年前
   <h2>1. 基础知识</h2>    <h3>1.1 虚拟路由冗余协议 - VRRP</h3>    <p>1.1.1 概念</p>    <p>路由器是整个网络的核心。一个网络内的所有主机往往都设置一条缺省路由,这样,主机发出的目的地址不在本网段的报文将被通过缺省路由发往路由器,从而实现了主机与外部网络的通信。在通常只使用单路由器来承担缺省路由的情况下,当该路由器坏掉后,本网段内所有以它为缺省路由下一跳的主机将断掉与外部的通信。可见,在使用单路由器的情况下,如果路由器发生致命性的故障,将导致本地网络的瘫痪,如果是骨干路由器,影响的范围将更大,所造成的损失也是难以估计的。因此,对路由器采用热备份是提高网络可靠性的必然选择。</p>    <p>VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种可以解决这种问题的容错协议,其协议文本在 <a href="/misc/goto?guid=4959673467158956404" rel="nofollow,noindex">这里</a> 。 它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。一组实现了该协议的路由器向局域网内的主句提供具有高可用性(HA)的虚拟路由器。</p>    <p>1.1.2 VRRP 怎么解决问题</p>    <p>VRRP 将一组物理路由器组织成一个虚拟路由器,称之为一个备份组。 这个虚拟的路由器拥有自己的 IP 地址,局域网内的机器使用该 IP 地址作为其缺省路由器的地址。</p>    <p><img src="https://simg.open-open.com/show/c91fe795e36622c261b2e2f1967c4156.png"></p>    <p>以上图为例,</p>    <ul>     <li>Device A 和 B 组成一个 VRRP 组,它的虚拟 IP(VIP) 为 10.1.1.10/24。其中,通过选举机制,A 是 Master Router,B 是 Backup Router。一个 VRRP 组内可以由多个设备,但是只有一个是 Master 设备。</li>     <li>Device A 和 B 可以由自己的 IP 地址,VIP 可以和其中的某 IP 相同,也可以不同。</li>     <li>当前,Router A 作为 Master router 向局域网内的机器提供路由服务。</li>     <li>当前,Router B 作为 Backup router。它的任务是周期性地接受 A 发出的心跳。在规定的时间段内,如果都没有收到 A 发出的心跳,则启动一个选举过程,重新选出 Master。</li>     <li>局域网内的机器将虚拟路由器当作默认网关,它们仅仅知道这个虚拟路由器的IP 地址 10.1.1.10,而并不知道具体的 Master 路由器的 IP 地址以及 Backup 路由器的IP 地址。它们将自己的缺省路由下一跳地址设置为10.1.1.10。于是,网络内的主机就通过这个虚拟的路由器来与其它网络进行通信。如果 Master 路由器坏掉,Backup 路由器将会通过选举策略选出一个新的 Master 路由器,继续向网络内的主机提供路由服务。从而实现网络内的主机不间断地与外部网络进行通信。</li>    </ul>    <p>可以看出:</p>    <ul>     <li>VRRP 是一种路由器选择协议,它可以把一个虚拟路由器的责任动态分配到 VRRP 组内的多个路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就虚拟允许路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。</li>     <li>VRRP 包封装在 IP 包中发送,用于 VRRP 组内设备的互相通信比如保持心跳等。它只定义了一种报文即 VRRP 报文,这是一种组播报文,由 Master 路由器定时发出来通告组内的路由器它的存在。</li>     <li>VRRP 中定义了三种状态模型,初始状态 Initialize,活动状态 Master 和备份状态 Backup,其中只有活动状态的交换机可以为到虚拟IP地址的的转发请求提供服务。</li>    </ul>    <p>几个概念:</p>    <ul>     <li>VIP:VRRP 使用两种类型的 VIP:一种 VIP 参与 VRRP 通告,使用配置项 virtual_ipaddress 指定;另一种 VIP 不参与 VRRP 通告,使用配置项 virtual_ipaddress_excluded 指定。</li>     <li>优先级(Priority):虚拟路由器中VRRP设备的优先级。虚拟路由器根据优先级选举出Master设备和Backup设备。</li>     <li>抢占模式:在抢占模式下,如果 Backup 设备的优先级比当前 Master 设备的优先级高,则主动将自己切换成 Master。</li>     <li>非抢占模式:在非抢占模式下,只要 Master 设备没有出现故障,Backup 设备即使随后被配置了更高的优先级也不会成为Master设备。</li>     <li>VRRP协议报文:封装在IP报文中,发送到分配给 VRRP 的 IP 组播地址。在IP报文头中,源地址为发送报文接口的主 IP 地址(不是虚拟IP地址),目的地址是224.0.0.18,TTL是255,协议号是112。目前,VRRP协议包括两个版本:VRRPv2和VRRPv3,VRRPv2仅适用于IPv4网路,VRRPv3适用于IPv4和IPv6两种网络。</li>     <li>VRRP 节点三种状态:初始状态(Initialize)、活动状态(Master)、备份状态(Backup)。其中,只有处于Master状态的设备才可以转发那些发送到虚拟IP地址的报文。</li>    </ul>    <p>Master 路由器的选举过程:</p>    <p>VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master 路由器或 Backup 路由器)。优先级越高,则越有可能成为 Master 路由器。初始创建的 VRRP 交换机工作在 Initialize 状态,收到接口 Up 的消息后,若此路由器的优先级小于255,则会先切换至 Backup 状态,待 Master_Down_Interval 定时器超时后再切换至 Master 状态。首先切换至 Master 状态的 VRRP 路由器通过 VRRP 通告报文的交互获知虚拟交换机中其他成员的优先级,进行Master的选举:</p>    <ul>     <li>如果 VRRP 报文中 Master 路由器的优先级高于或等于自己的优先级,则 Backup 路由器保持 Backup 状态;</li>     <li>如果 VRRP 报文中 Master 路由器的优先级低于自己的优先级,采用抢占方式的 Backup 交换机将切换至 Master 状态,采用非抢占方式的Backup 路由器仍保持Backup状态。</li>     <li>如果多个 VRRP 路由器同时切换到 Master 状态,通过 VRRP 通告报文的交互进行协商后,优先级较低的 VRRP 路由器将切换成 Backup 状态,优先级最高的 VRRP 路由器成为最终的 Master设备;优先级相同时,VRRP 路由器上 VRRP 备份组所在接口主 IP 地址较大的成为 Master 设备。</li>     <li>如果创建的VRRP 路由器为IP地址拥有者,收到接口 Up 的消息后,将会直接切换至Master状态。</li>    </ul>    <p>Master交换机状态的通告:</p>    <ul>     <li>Master 路由器周期性地发送 VRRP 通告报文,在 VRRP 备份组中公布其配置信息(优先级等)和工作状况。Backup 路由器通过接收到 VRRP 报文的情况来判断Master 路由器是否工作正常。      <ul>       <li>当 Master 路由器主动放弃 Master 地位(如 Master 路由器退出备份组)时,会发送优先级为0的通告报文,用来使 Backup 路由器快速切换成 Master 路由器,而不用等到 Master_Down_Interval 定时器超时。</li>       <li>当 Master 路由器发生网络故障而不能发送通告报文的时候,Backup 路由器并不能立即知道其工作状况。等到 Master_Down_Interval 定时器超时后,才会认为 Master 路由器无法正常工作,从而将状态切换为 Master。</li>      </ul> </li>    </ul>    <p>目前,主流的硬件路由器设备都实现了该协议: <a href="/misc/goto?guid=4959673467260417263" rel="nofollow,noindex">这篇文章</a> 介绍了 Broadcom 路由器上 VRRP 的配置, <a href="/misc/goto?guid=4959673467340194713" rel="nofollow,noindex">这篇文章</a> 介绍了一个 Cisco 路由器 VRRP 的配置例子, <a href="/misc/goto?guid=4959673467423491586" rel="nofollow,noindex">这篇文章</a> 是华为的 VRRP 白皮书。</p>    <p>它的优势:</p>    <ul>     <li>操作简单:它不需要改变组网情况,也不需要在主机上做任何配置,只需要在相关路由器上配置极少的几条命令,就能实现下一跳网关的备份,并且不会给主机带来任何负担。和其他方法比较起来,VRRP更加能够满足用户的需求。</li>     <li>简化网络管理:在具有多播或广播能力的局域网(如以太网)中,借助 VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。</li>     <li>适应性强:VRRP报文封装在IP报文中,支持各种上层协议。</li>     <li>网络开销小:VRRP只定义了一种报文——VRRP通告报文,并且只有处于Master状态的路由器可以发送VRRP报文。</li>    </ul>    <p>更多内容,参见 <a href="/misc/goto?guid=4959673467158956404" rel="nofollow,noindex">协议文本</a> ,以及 <a href="https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0CCIQFjABahUKEwjLkNev7YvHAhVMWSwKHc5cCrs&url=%68%74%74%70%3a%2f%2f%65%2e%68%75%61%77%65%69%2e%63%6f%6d%2f%63%6e%2f%6d%61%72%6b%65%74%69%6e%67%2d%6d%61%74%65%72%69%61%6c%2f%63%6e%2f%70%72%6f%64%75%63%74%73%2f%65%6e%74%65%72%70%72%69%73%65%5f%6e%65%74%77%6f%72%6b%2f%73%77%69%74%63%68%65%73%2f%73%39%37%30%30%2f%68%77%5f%32%30%31%30%35%37&ei=TdC-VYu2K8yysQHOuanYCw&usg=AFQjCNHM9Y9opc-2_Xgzr6mqIRVJLauLhg&bvm=bv.99261572,d.bGg" rel="nofollow,noindex">VRRP 技术白皮书 - Huawei</a> 。</p>    <h3>1.2 Keepalived</h3>    <p>1.2.1 概念</p>    <p><a href="/misc/goto?guid=4958348121032788865" rel="nofollow,noindex">Keepalived</a> 是一个用 C 语言编写的路由软件,其主要目的是向 Linux 系统和基础设施提供简单可靠的工具来实现负载均衡(Load balancing)和高可用(HA)。其中,</p>    <ul>     <li>负载均衡框架基于 Linux Virtual Server (IPVS) 内核模块来提供网络四层的负载均衡,它实现了一组检查器(Checkers)来根据它们的健康状态动态地和自适应地维护和管理被均衡的服务器池。</li>     <li>高可用(HA)是使用 VRRP 来实现的,Keepalived 是 VRRP 的一个非常好的开源实现。它是一个基于 VRRP 协议来实现的 WEB 服务高可用方案,可以利用其来避免单点故障。一个 WEB 服务至少会由两台台物理服务器运行 Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟 IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性。</li>    </ul>    <p>1.2.2 软件架构和功能</p>    <p>(本部分内容来自 Keepalived 官网)</p>    <p><img src="https://simg.open-open.com/show/585b5230e43dad51d47f07a09eb3ed93.png"></p>    <p>Keepalived 使用三个进程,其中 Watchdog 是控制进程,VRRP Stack and Checkers 是它的两个子进程。</p>    <ul>     <li>Watchdog 通过心跳机制来确保子进程处于运行状态。</li>     <li>Checkers:负责真实服务器的健康检测,用于负载均衡。</li>     <li>VRRP Stack:实现 VRRP 协议,提供 HA。</li>    </ul>    <p>主要模块:</p>    <ul>     <li>System call : 用于启动用户添加的脚本。它可以被 Checkers 和 VRRP Stack 使用。它向 VRRP 框架提供了一种能力,即在 VRRP 协议状态变化时可以运行用户指定的脚本。</li>     <li>SMTP : 使得 Keepalive 能够使用邮件来通知管理员。</li>     <li>NETLINK Interface: 用于 VRRP。Keepalive 通过它来设置或者删除 VIP。</li>    </ul>    <p>VRRP Stack 模块:</p>    <p><img src="https://simg.open-open.com/show/cdeeed079cf6dd5bd3a5b2ee42236a04.png"></p>    <p>VRRP Stack 是独立于 LVS的,它可以被单独使用。它主要提供以下功能:</p>    <ul>     <li>Failover:实现 VRRP协议的核心功能,提供故障切换能力。</li>     <li>VRRP Instance synchronization:VRRP Group (组)之间的同步,比如保证两个 VRRP 组直接保持同样状态。</li>     <li>VRRP 广播:Master 实例通知 Backup 实例。</li>     <li>System call: 在 VRRP 状态变换时调用外部的脚本或者程序。</li>    </ul>    <p>它包括以下组件:</p>    <ul>     <li>Netlink:提供 VIP 操作。</li>     <li>Multicast:用于发送 VRRP 协议广播。</li>     <li>SYSLOG:所有 daemon 的通知消息都会通过该组件写入日志。</li>    </ul>    <p>用户可以使用配置文件 /etc/keepalived/keepalived.conf 来配置 Keepalived。本部分主要讲讲 keepalived 的概念,使用会在下文谈到。更多内容,参见 <a href="/misc/goto?guid=4958348121032788865" rel="nofollow,noindex">官网</a> 。</p>    <p>作者信息:刘世民(Sammy Liu),IBM 云架构师,十余年IT行业从业经历,在电信、企业软件、存储以及云计算等领域做过研发、管理和架构设计等工作。 2012 年开始学习 OpenStack,对其核心模块有较深入的了解;带领过团队开发OpenStack模块。</p>    <p>责编:陈晨 联系请添加微信:violace95 备注公司 职位 姓名。寻求报道或投稿,请请发送至邮箱:chenchenjs@csdn.net</p>    <p> </p>    <p>来自: <a href="/misc/goto?guid=4959673467650829974" rel="nofollow">http://geek.csdn.net/news/detail/74707</a></p>    <p> </p>