一种分布式交换机的双主控热备冗余设计*
2021-12-23唐乙双
胡 洋,唐乙双,向 伟
(1.中国电子科技集团公司第三十研究所,四川 成都 610041;2.南部战区海军参谋部15 号,广东 湛江 524001)
0 引言
网络设备的一个重要的特点是能够长期、可靠的运行。分布交换机一般位于整个网络的汇聚层或核心层,所以如何提高分布式交换机的高可靠性对于整个网络至关重要。主控板作为分布交换机的关键核心部件,相比较双机热备技术而言,其热备冗余技术具有数据实时性强、切换时间短用户体验感高的优点[1]。本文主要从主备选举、主备切换、热备同步通道、文件同步以及表项同步几个方面展开分析,设计双主控热备冗余方案。
1 主备选举
分布式交换机一般采用双主控板板设计,即插入两张主控板,一张角色为主(master),一张为备(standby)。作为主角色的主控板处于工作状态,维护整个交换机的管理平面和控制平面。作为备角色的主控板处于待命状态,不参与整个管理平台和控制平面的维护。一旦主出现异常(软件宕机、硬件IO 故障或掉电),备将在最短的时间内升级为主角色,接管异常的主的工作。
一般主备角色的选举有几种方式。
(1)上电时间先后顺序。先上电者为主,后上电者为备。如何定义先后顺序,可以做如下规定:如果两者上电时间差在30 s 以内,可视为同时上电;如果上电时间差大于30 s,则先上电者为主,后上电者为备。
(2)版本号选举。对于处于不同软件版本号的主控板,若两者同时上电,选取版本号更高的为主,版本号低的为备。
(3)槽位号选举。每张主控板工作时候是插入机箱的某个固定槽位,分别对应与MPU-0 槽位和MPU-1 槽位。若两者同时上电,可将MPU-0 作为主,MPU-1 作为备。
(4)系统mac 选举。两张主控板在出厂时候会预先设置一个系统mac,若两者同时上电可将系统mac 值大的作为主,系统mac 值小的作为备[2]。
综合考虑设计的复杂性,本文采用的主备选举采用第1 种方式和第3 种方式。它的优先级为上电时间先后顺序选举高于槽位选举。
主备角色选举的流程如图1 所示。
图1 主备选举流程
图1 中,如何判断主控板上电初始化完成的关键在于如下内容。
(1)Watchdog 进程加载顺序位于所有进程加载顺序的最后,Watchdog 进程通过周期型对与本板CPLD IO 相连的GPIO 管脚进行喂狗操作。复杂可编程逻辑器件(Complex Programmable Logic Device,CPLD)检测到周期型的喂狗信号,认为软件已经初始化完成。
(2)主备之间的CPLD 通过机框背板互发周期性的心跳信号收到对端的心跳信号,根据自己的槽位号选举出主备角色,并将各自的主备角色写入本板的CPLD 寄存器。
(3)CPLD 通过专用的IO 管脚产生GPIO 中断给本板处理器,本板处理器在中断服务程序中通过I2C 总线读取本板CPLD 寄存器来获取主备角色。
2 主备同步通道的设计
本文采用透明进程通信协议(Transparent Inter-Process Communication,TIPC)作为主备同步通道。原因有以下几点。
(1)主备之间的物理通道可以多种多样,但常用的还是以太网接口,软件协议层面是基于以太网的协议。主备互联的以太网接口为整机内部接口,一般不会选择传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol,TCP/IP)协议,因为TCP/IP 是基于IP 地址的通信,主控板一般会再提供一路网口作为整机的管理网口。如果内部接口也配置IP 地址,那么IP 地址可能会与管理口IP 地址冲突。
(2)TIPC 是进程间通信的一种协议,一般用于集群/分布式系统。它允许设计人员能够创建可以和其他应用快速可靠地通信应用,无须考虑在其他需要通信的应用在集群环境中的IP 位置。使用TIPC,在创建socket 的时候在内核中注册自己的服务类型/实例号,在发送端只需要指定服务类型/实例号就可以由内核路由到相应的socket。这时对应用层来讲,对端地址仅仅是一个服务类型/实例号。显然内核维护着这样一张路由表,可以根据服务类型去找到对应的socket。每台设备都有这样的路由表,它们的信息能够像普通路由表一样共享到整个集群网络中,所有设备都可以进行socket 查找。因此有了TIPC,无需关心socket 使用哪个IP 哪个端口,而这非常符合主备通信的特点。
(3)TIPC 网络地址是和整个物理结点相关联的,地址模式映射到逻辑网络拓扑。<Z,C,N>方式重,Z(Zone,8 位),C(Cluster,12 位),N(Node,12 位),共32 位。一个网络可包括255 个域(Zone),主备主控板各自对应一个网络地址,可将Z、C设为同一个值,N值与对应的槽位号绑定,这样每张主控板就对应一个唯一的可识别的网络地址[3]。
(4)如图2 所示,TIPC 将两张主控板的进程统一到一个平面。对于开发者而言,不关心你的进程是在主或者备,每个进程只要分配一个唯一的实例号,与目的进程通信只要知道对方的实例号即可。
图2 TIPC 统一平面
3 主备切换
主备切换有两种方式。
(1)手工切换。通过命令或插拔强制主下线。
(2)故障感知自动切换。当主发生软硬件故障时,如核心软件进程挂掉或操作系统内核宕机[4]。
如图3 所示,主下线将导致主不能即使发送喂狗信号给本地CPLD,本地CPLD 将不再发送心跳给备CPLD,备CPLD 没有收到主CPLD 周期性发送过来的心跳信号,便发送一个GPIO 中断给备CPU,告诉备主控板需要将自己的角色升级为主。如果故障主控板恢复正常后,重新发送心跳信号给对端主控板,重新协商自己的角色。由于已经对方是主,便主控将自己的角色变为备,不会再次发生一次主备切换。
图3 主备切换流程
4 文件同步
主备之间需要文件的同步,如交换机的命令配置文件。每当配置更新后,命令配置文件将会更新,需要将更新后的配置文件实时同步到备,以保证主备切换后,备的配置为当前的最新配置。
本文采用Inotify+xfer 的方式设计文件同步。Inotify 是Linux 内核2.6.13 版本之后新增的一个子系统,提供了一种监控文件系统(基于inode)事件的机制,可以监控文件系统的变化,如文件修改、新增、删除等,并可以将相应的事件通知给应用程序[5]。Inotify 既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录和目录中的各子目录及文件。此外,Inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O 操作select、poll 和epoll 来监视文件系统的变化。
xfer 借鉴简单文件传送协议(Trivial File Transfer Protocol,TFTP)的方式进行,用TIPC 协议代替TCP/IP 协议。TFTP 分为客户端和服务端。xfer 同样分为客户端和服务端。其中,主为客户端,备为服务端。本文采用xfer 而不是TFTP,原因在于热备之间的通道不能基于IP 地址,而是采用TIPC 的无IP 方式。Inotify 将文件变化信息通知xfer客户端进程,xfer 客户端进程将变化的文件推送给xfer 服务端。
设计xfer 需要注意以下几点。
(1)如何设定目的地址?TFTP 传输文件需要设置对端的目的IP 地址,而xfer 是不能基于IP 的。由于每张主控板都有唯一的槽位号,可将槽位号定位自己的唯一地址,再调用TIPC 的套接字进行文件传输。
(2)主备谁作为客户端,谁作为服务端?因为文件的变化在主,主知道何时需要文件推送,主具有文件传输的主动权。客户端和服务端两者之间,客户端相比服务端具有更高的行为主动权。所以,将主设置为客户端,备设置为服务端更合适。
如图4 所示,先创建一个文件列表,将需要监控的文件放在文件列表,一旦被监控的文件内容更新,将触发Inotify 进程获取更新的文件名,同时启动xfer 将更新后的文件通过TIPC 通道传输到备的某个文件路径。
图4 Inotify+xfer 进行文件同步
5 表项同步
交换机有ARP 表、路由表、mac 表等各种表项,这些表为交换机2、3 层转发的核心。主备表项的一致性是保证主备切换后业务快速恢复,甚至不丢包,是热备冗余的核心。以mac 表项为例,mac 表项同步分为实时同步和批量同步两种情况。
5.1 实时同步
如图5 所示,如果当前有两张主控板,且主备协商已经完毕。当接收到的报文的转发表项不存在与接口板的硬表,接口板的交换芯片会触发mac 学习流程产生新的mac 表项,同时表项通过TIPC 套接字传输到主主控板产生对应的软表项。由于备主控板在线,主学到的mac 软表项通过TIPC 套接字同步到备主控板,在备上也产生同样的一个软表项。
图5 主备实时mac 同步流程
5.2 批量同步
如果当前只有一张主控板,后续再插入一张主控板,新插入的成员角色将被选举成备。备由于刚上电不久,没有任何mac 软表项,那么需要主将当前的软表项进行一次批量同步到备,才能保持主备之间的mac 表同步。
如图6 所示,备在启动过程中,会向主发送一个板上线请求信号。主收到该信号后,回复应答信号给备,备进入接收批量同步状态,同时发送请求开始同步给主。主收到该信号后,便开始进行批量传输,其同步通道仍是TIPC 通道。
图6 主备批量mac 同步流程
6 结语
本文介绍了分布式交换机的主控板之间的热备冗余技术,从主备选举、主备切换,主备同步通道、文件同步以及表项同步几个方面进行设计。实践证明:本方案合理可靠运行,效果良好,可应用于高可靠的网络环境。