动态主机设置协议 (DHCP) 用于为用户提供网络参数配置,其最重要的功能就是动态分配 IP 地址。作为一种核心的网络服务,要求其具有高鲁棒性,高灵活性,简单说就是具有冗余备份功能。传统的简单冗余实现,往往会带来 IP 地址空间不足,无法实现在线切换等问题。目前由 ISC (Internet Software Consortium) 提供的开源 DHCP 软件实现了 Failover( 灾难备份 ) 的功能 , 很好地解决了传统方法带来的问题,在业界得到广泛地应用,特别是 Linux 平台,很早就采用了该实现方法。但实践中由于客户对该功能的理解不够深入,影响了工程中使用,本文归纳了灾难备份中的几个主要概念:服务器状态机转 移,IP 地址绑定状态的变更等 , 着重对灾备的原理进行详细介绍 , 有利于用户在工程中充分发挥灾备的强大功能,另外在文末也给出了灾备的简单配置。本文作者参与了 ISC DHCP 在 IBM 平台上的开发和测试工作,希望能够通过本文给读者一定的帮助。
灾备中 DHCP 服务器的状态机切换
IETF 的 draft-ietf-dhc-failover-07.txt 文档中描述了 DHCP 灾备协议,ISC DHCP 4.1 服务器对这一协议进行了实现,它允许两台服务器共享公共地址池,每个服务器可以分配地址池中一半的地址,这时候我们说两个服务器都处于 NOMAL 状态下。如果其中一台服务器 S1 出现故障,虽然两台机子的通信失败,但另外一台 S2 的 DHCP 服务不会有任何影响,他可以响应已分配地址客户端的 renew 消息,也可以接收新客户端的 discovery 消息,然后基于自己管理的一半地址池,分配给他们可用的地址,这种情况下 S2 会自动切换到 COMMUNICATION-INTERRUPTED 状态。
如果故障服务器 S1 长期无法恢复,我们就需要将 S1 宕机的消息告知 S2(通常是向 S2 发送 omshell 外部命令), 这时候 S2 会等待一个安全期(由配置文件中的 MCLT 定义),保证 S1 服务的 IP 地址都已过期,然后 S2 将会回收先前由 S1 管理的另外一半地址池,对整个地址池进行管理和分配,同时 S2 会自动切换到 PARTNER-DOWN 状态。之后当 S1 恢复时,它会自动检测网络,与 S1 进行通信,然后向 S1 发出同步地址数据库的请求,等同步完成后,两个服务器就会像以前一样各自管理一半的地址池,自动进入 NORMAL 状态。
总之,NORMAL, COMMUNICATION-INTERRUPTED, PARTNER-DOWN 是 DHCP 灾备机制中的三种主要状态机,事实上,灾备切换是一个复杂的过程,其中还包含很多中间状态,比如,RECOVER 状态、RECOVER-DONE 状态、 POTENTIAL-CONFLICT 状态,等等。下图是灾备中主要状态机的切换。
图 1. 灾备中的主要状态机切换
DHCP 地址数据库中 IP 地址的状态切换
大多数 DHCP 服务器中,一个 IP 地址能呈现多种状态。灾备工作模式下,对于管辖范围内的所有 IP, 一个服务器和它的 PARTNER 需要共同维护了一份信息一致的地址池数据库,因此在两个服务器之间会进行很多的数据同步工作。一个服务器 S1 的任何地址状态发生变化,比如租约更新,地址过期,地址释放等,都需要 PARTNER S2 同步变化,具体的流程是:S1 将更新消息(BNDUPD)发送到 S2,S2 根据消息对数据库进行相应的更新,完成后再向 S1 回复确认消息(BNDACK)。以下是主要地址状态机的简介以及状态机切换。
ACTIVE– 客户端已经获取了该 IP 的租约。 EXPIRED– 意味着该 IP 的租约已经过期。在这种状态下,服务器会向 PARTNER 发送更新信息,当收到 PARTNER 端的确认消息(BNDACK)后,服务器把该 IP 的状态进一步置为 FREE,这样就可以对它重新分配了。 RELEASED– 意味着客户端向服务器发送了 DHCPRELEASE 的消息。在这种状态下,服务器会向 PARTNER 发送更新信息,当收到 PARTNER 端的更新确认消息(BNDACK)后,服务器把该 IP 的状态进一步置为 FREE。 FREE– 当 DHCP 服务器通过 ICMP 探测到某 IP 地址未被使用,并且也不是刚刚被释放或过期的地址,它就将该 IP 设置为 FREE,然后向 PARTNER 发送同步请求,这样该 IP 就可以重新分配了。(注意:如果在 PARTNER-DOWN 状态下,需要等待 MCLT (Maximum Client Lead Time, 该延迟确保其 PARTNER 上维护的地址租约已经过期 ),然后将其 PARTNER 所维护的地址置为 FREE)。
图 2. IP 地址的状态转换