OSPF DR 与 BDR:选举属于接口
一台路由器可以在自己的 LAN 上是指定路由器,在隧道的另一头却很普通。要按网段读角色,再检查隧道能否交付模型所需的东西。
OSPF 的角色附着在接口上,而不是机箱上。同一台设备可以在自己的 LAN 网段上是指定路由器,在隧道上却没有任何特殊身份,这两个事实并不矛盾。从错误的接口去读角色,正是中枢看起来配置错误、实际却完全按设计工作的最常见原因。
真正值得比较的是:同一网段上的角色与跨路由器的角色,以及备份做了什么、没做什么。
每个网段一次选举
RFC 2328 为每个广播或 NBMA 网络各选出一个指定路由器和一个备份指定路由器,不是为路由器选,也不是为区域选。参与这类网络的每个接口,都用各自的优先级和各自的邻居集合独立完成选举。一台带三个这种接口的机箱可以同时持有三个不同角色,所以在点名网段之前,说中枢就是 DR 是不完整的。要从那个接口自己的邻居输出里读角色。
同一区域里的两个接口仍然是两次选举。区域成员身份不会把它们合并。
备份在等待时做什么
备份指定路由器与所在网段的各个路由器处于完全邻接状态,并保持数据库同步,因此接管时无需重新建立邻接。它在备份角色下不做的事,是产生该网络的 network-LSA,那属于指定路由器。某些步骤里它的泛洪角色比指定路由器更窄,但这不等于沉默或空闲。把备份当成晋升前什么都不做的路由器,会得出非常自信也非常错误的解释。
有用的问题不是备份克制了什么,而是该网段能否交付模型所需的 OSPF 报文。如果某个参与者无法与其他参与者交换这些报文,选举结果就是可达性的症状,而不是原因。
隧道实际使用的是哪种模型
广播和 NBMA 网络会选举;点对点和点对多点网络不会,因为没有可供选举的共享网段。在 hub-and-spoke 叠加网络中,实际生效的模型取决于隧道接口如何配置,所以在解释任何角色之前先读它。像广播网段那样工作的隧道,和像一组点对点链路那样工作的隧道,邻居行为完全不同。
如果设计希望中枢承担指定角色,模型与可达性必须共同支持它。一个无法与每个参与者交换所需报文的中枢,不会仅因为优先级高就成为有用的指定路由器。先检查邻居状态和底层交付,再判断角色是错了,还是只是出乎意料。
资格按接口计算,抢占不是自动的
优先级按接口设置,优先级为零会把该接口排除在两次选举之外。在合格参与者之间,先按优先级、再按路由器 ID 决定胜者,但新加入的高优先级路由器不会顶掉现有的指定路由器。这种不抢占是刻意设计的,也常让期待最高优先级立刻取胜的人意外。如果某台路由器必须持有该角色,就要安排事件顺序,而不是假定改配置会自己生效。
在不提供另一个合格参与者的情况下把所有 spoke 都排除,也意味着可能根本没有备份。
诚实比较两种解释:从错误网段读到的角色,或成员之间无法互相到达的网段。前者是设计问题,后者是交付问题,而只有其中一种能靠修改优先级修好。