IP地址漂移的实现与原理
    当前备份软件比较流行,其中用到的关键技术是IP 地址漂移, 实际上IP地址漂移技术是利用共享的“虚拟”IP地址,当本地进行节点切换与路由切换,使另一端的发送和收方端没有感觉到本地节点地址有变化,保证了通信的连续性,起到断点保护的功效。
    举例说明:假设最简单的主从方式、单网卡的情况下,双机系统要占用3个网络地址。主机一地址为,主机二的地址为, 同时,还应该有一个“虚拟”IP地址,该地址为工作IP地址,用来做“漂移”,即工作地址为 在分配IP地址时,要分清工作IP地址和主机自有地址。正常情况下,工作主机的自有地址是被工作地址取代的(若主机一在工作,主机一的地址由,主机一的地址恢复为,而主机二的地址会由,这就是我们所说的地址漂移。
采用地址漂移技术, 利用虚拟IP地址来绑定主服务器,可有效解决不能利用组播的情况下多台服务器集之间的信息交互问题。此方法具有一定的代表性,在很多行业可以采用双机集方式广泛应用于工业控制、重要事件的备份。两台中心服务器通过网络构成一套高可靠性双机热备份系统,同步工作、互为备份,当主机发生故障时,自动切换到备机工作,系统不间断运行。而地址漂移技术是当其中一台主机有故障时,另一主机接管故障主机的网络IP地址,
使网络仍能正常运行。
通常系统采用双机热备软件或双活技术,具有负载均衡功能,将信息处理、数据库记录、进程监控等各项功能在两台服务器间进行动态分配,主服务器主要负责完成信息处理、进程监控等,备用服务器完成数据库的记录工作。当主服务器发生故障后,能够进行检测并告警,自动将主服务器上的信息处理和进程监控等应用转移到备用服务器上继续处理,备用服务器切换为主服务器,先前的数据库记录应用仍然保留。双服务器主要用来工业控制数据采集或SCADA系统的数据通信与处理。
一般情形下,双服务器都有各自的IP地址,如果选择其中一台服务器IP地址进行通信,当此服务器出故障将无法接收信息时,这就为通信之间采用哪一个IP地址来交换信息造成选择困难。解决多台服务器集间信息交互的办法有三个: 一是采用组播,该方法最简单。只要将两台计算机加入一个组播地址,则发送方将目的地址设置为此组播的IP地址即可,双服务器都能够收到包文,但对于双向系统而言,在应用层要解决的问题比较多,人为地将系统复杂化,简单的应用可以采用,但复杂的情形下此方法不可行。二是采用一份数据分别多次传递相应的多台服务器,虽然这样能够保证多台服务器均能够收到数据,但是对网
络的占用时间、数据的同步性和实时性带来了新的问题,如果在传输数据量大时,造成带宽浪费,信道无法承受。  三是采用地址漂移技术,假设两地A节点与B节点要进行通信业务,每个节点有三台服务器做集,先给A节点与B节点分配相应的虚拟IP 地址ab,两地AB之间传递数据采用ab地址,A节点的主服务器与a地址绑定,B节点的主服务器与b地址绑定。同时在主服务器启动一个三通进程,所谓三通进程是指此进程负责接收信息,然后将收到的信息分别转发到集内两台服务器。主服务器收到数据后,送往局域网内主服务器和备服务器的接收进程。当主机切换为备机时,此服务器卸载此虚拟IP地址,切换为主机的服务器加载虚拟IP地址,并启用三通进程 负责接收和分发数据。虚拟IP地址在主备服务器之间漂移,也称之为地址漂移技术,目前很多集软件也采用此技术来解决集内多台计算机只有惟一IP地址的问题。
技术实现地址漂移需要涉及一些关键技术。
当主机加载虚拟IP地址后,必须利用ARP协议包通知路由器,告诉路由器虚拟IP地址在哪台主机上,这样当路由器收到目的地址为虚拟IP时,会自动将数据包传递给主用计算机。  有两种方式可产生ARP 数据包: 一是通过程序生成ARP数据包,并由链路层接口发送给路
由器,这需要对网络编程、特别是链路层编程有一定经验的技术人员才可以实现。二是利用ARP命令,在程序中执行system(arp)即可,将本计算机的ARP表发送给局域网内的路由器。
路由器收到ARP数据包后,将MAC地址和IP地址的配对更新,当路由器接收到数据后,根据ARP表来寻虚拟IP地址所在计算机的MAC地址,重新指定路由。
建立三通进程,负责接收数据,并将接收的数据分发给备份服务器。通常将三通进程作为系统守侯进程,这样它随着操作系统的启动而自动执行,增强其可靠性。
如何实现IP地址漂移,假设在Unix操作系统下,首先需要随着操作系统的启动而自动启用三通进程,在/etc/rc2.d目录下建立脚本文件,如下
#!/bin/sh
findproc() { # 查询进程ID
  pid=`/usr/bin/ps -e | 
/
usr/bin/grep " $1" | 
/usr/bin/grep -v "$$" | 
/usr/bin/grep -v grep | 
/usr/bin/awk '{ print $1 }'`  }
case $1 in
start)  /usr/Tprocess& #启动三通进程
;;
stop) #关闭三通进程
汽车漂移原理findproc Tprocess; 
if [ "$pid" < > "" ]; then 
/bin/kill -15 $pid 
Fi 
;;
*)
esac
三通进程的实现步骤为: 首先是要脱离开原有进程组,单独建立进程组并成为进程组的首进程,建立守护进程; 其次是接收到报文后增加报文头格式,后续紧跟网络发送方IP地址,然后紧跟为原始数据。其数据格式如表所示最后是将组合后的数据报文在局域网内发送给双服务器的接收进程。下面介绍三个步骤的实现方法。