<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[IP地址漂移技术-全部重启后好了。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Wed, 10 Aug 2016 03:27:34 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：阿里私有云呐，出现Agent异常，查各种配置均没有问题，后把EDAS的agent服务器均重启了又好了（重启6台中的一台还是有问题），东软哥们问阿里说是给他来了句，叫什么地址漂移，不知道什么鬼高科技。查一下了解了解。<br/><br/>&nbsp;&nbsp; 采用地址漂移技术，利用虚拟IP地址来绑定主服务器，可有效解决不能利用组播的情况下，多台服务器集群之间的信息交互问题。此方法具有一定的代表性，在很多行业可以采用。&nbsp;&nbsp;双机集群方式广泛应用于各级航空飞行管制中心，两台中心服务器通过网络构成一套高可靠性双机热备份系统，同步工作、互为备份，当主机发生故障时，自动切换到备机工作，系统不间断运行。而地址漂移技术是当其中一台主机有故障时，另一主机接管故障主机的网络IP地址，使网络仍能正常运行。 <br/>三是采用地址漂移技术，给管制中心分配一个航空管制中心虚拟IP 地址，航空管制中心之间传递情报采用此IP地址，然后由各航空管制中心的主服务器与此IP地址绑定，负责接收和发送情报。同时在主服务器启动一个三通进 程，所谓三通进程是指此进程负责接收信息，然后将收到的信息分别转发到集群内两台服务器，类似于水龙头的三通，因此称之为三通进程。主服务器收到一份情报 后，送往局域网内主服务器和备服务器的接收进程。当主机切换为备机时，此服务器卸载此虚拟IP地址，切换为主机的服务器加载虚拟IP地址，并启用三通进程 负责接收和分发情报。虚拟IP地址在主备服务器之间漂移，也称之为地址漂移技术，目前很多集群软件也采用此技术来解决集群内多台计算机只有惟一IP地址的 问题。<br/>文中有说ARP+Socket实现的。详情如下：<br/><br/><br/>&nbsp;&nbsp; IP地址漂移技术 <br/>&nbsp;&nbsp;关于IP地址漂移，我所找到的关于其描述如下： <br/>&nbsp;&nbsp;由于通常情况下，两台服务器都具有一块以上的网卡，每块网卡都应该有一个IP地址，同时，还应该有一个漂移IP地址，该地址为工作IP地址。因此，最简单的主从方式下，双机系统要占用3个网络地址。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;在分配IP地址时，要分清工作IP地址和主机自有地址。如在主从方式、单网卡的情况下，主机一地址为200.10.10.1,主机二的地址为200.10.10.2,工作地址为200.10.10.3,正常情况下，工作主机的自有地址是被工作地址取代的（若主机一在工作，主机一的地址由200.10.10.1变为200.10.10.3）。在发生主机切换的情况下，主机一的地址恢复为200.10.10.1，而主机二的地址会由200.10.10.2变为200.10.10.3，这就是我们所说的地址漂移 <br/> <br/>漂移一词有很多的应用，我在看录像中看到了汽车狂奔中的漂移技术，看到周杰伦表演的漂移过弯的精彩表演，不知是特技还是他已经真的练就了这个本事，一般的漂移是指物体悬浮于水面整体运动而相互的关系不变，现在又有了新的用处，IP地址漂移。&nbsp;&nbsp;<br/>采用地址漂移技术，利用虚拟IP地址来绑定主服务器，可有效解决不能利用组播的情况下，多台服务器集群之间的信息交互问题。此方法具有一定的代表性，在很多行业可以采用。&nbsp;&nbsp;双机集群方式广泛应用于各级航空飞行管制中心，两台中心服务器通过网络构成一套高可靠性双机热备份系统，同步工作、互为备份，当主机发生故障时，自动切换到备机工作，系统不间断运行。而地址漂移技术是当其中一台主机有故障时，另一主机接管故障主机的网络IP地址，使网络仍能正常运行。&nbsp;&nbsp;系统背景&nbsp;&nbsp;<br/>系 统采用双机热备软件，具有负载均衡功能，将信息处理、数据库记录、进程监控等各项功能在两台服务器间进行动态分配，主服务器主要负责完成信息处理、进程监 控等，备用服务器完成数据库的记录工作。当主服务器发生故障后，能够进行检测并告警，自动将主服务器上的信息处理和进程监控等应用转移到备用服务器上继续 处理，备用服务器切换为主服务器，先前的数据库记录应用仍然保留。采用CS结构(Client Server)。双服务器主要用来对航管雷达情报进行融合处理，并对飞行管制情报、异类传感器情报进行多元数据融合，响应并显示控制台的人工干预命令。&nbsp;&nbsp;存在问题&nbsp;&nbsp;<br/>在 集群的双服务器内，当收到航管雷达或其他管制中心通过网络或串口送过来的信息后，会转入信息处理进程，并将情报送往显示控制台进行显示，工作人员通过显示 控制台来观察监视空中目标，并对目标进行人工干预。在航空管制中心之间需要相互交换情报，便于情报共享。在管制中心内有两台服务器，每个服务器具有一个IP地址，采用其中一台服务器IP地址进行通信，如果此服务器出故障将无法接收信息，这就为中心之间采用哪一个IP地址来交换信息造成选择困难。&nbsp;&nbsp;虚拟IP地址&nbsp;&nbsp;<br/>解决多台服务器集群间信息交互的办法有三个: 一是采用组播，该方法最简单。只要将两台计算机加入一个组播地址，则发送方将目的地址设置为此组播的IP地址即可，航空管制中心的两台计算机均能够收到，但在航空管制中心间网络拓扑关系复杂，很多区域网络内禁止采用组播的方式，所以此方法不可行。&nbsp;&nbsp;<br/><br/><br/>二是采用一份情报分别传递两次给两台双机服务器的方式，能够保证两台服务器均能够收到信息，但是造成带宽浪费，并加大双服务器接收情报时间不一致的可能性，使双服务器的信息处理不能同步，如果在情报量大时，信道可能无法承受，此方法不可取。&nbsp;&nbsp;<br/>三是采用地址漂移技术，给管制中心分配一个航空管制中心虚拟IP 地址，航空管制中心之间传递情报采用此IP地址，然后由各航空管制中心的主服务器与此IP地址绑定，负责接收和发送情报。同时在主服务器启动一个三通进 程，所谓三通进程是指此进程负责接收信息，然后将收到的信息分别转发到集群内两台服务器，类似于水龙头的三通，因此称之为三通进程。主服务器收到一份情报 后，送往局域网内主服务器和备服务器的接收进程。当主机切换为备机时，此服务器卸载此虚拟IP地址，切换为主机的服务器加载虚拟IP地址，并启用三通进程 负责接收和分发情报。虚拟IP地址在主备服务器之间漂移，也称之为地址漂移技术，目前很多集群软件也采用此技术来解决集群内多台计算机只有惟一IP地址的 问题。 <br/><br/> 技术实现&nbsp;&nbsp;<br/>上述的第三种方法的实现需要以下几个关键技术:&nbsp;&nbsp;<br/>1．当主机加载虚拟IP地址后，必须利用ARP协议包通知路由器，告诉路由器虚拟IP地址在哪台主机上，这样当路由器收到目的地址为虚拟IP时，会自动将数据包传递给主用计算机。&nbsp;&nbsp;有两种方式可产生ARP 数据包: 一是通过程序生成ARP数据包，并由链路层接口发送给路由器，这需要对网络编程、特别是链路层编程有一定经验的技术人员才可以实现。二是利用ARP命令， 在程序中执行system(“arp”)即可，将本计算机的ARP表发送给局域网内的路由器。值得注意的是: 航空管制中心的IP地址必须一直与主机绑定，需要IP地址的加载与双机程序相关联。所以在双机切换或者主机故障、退出时要在即将成为主机的服务器上加载虚 拟IP地址。加载IP地址的命令为: ifconfig eth0 alias 192.168.1.1 netmask 255.255.255.0，卸载IP地址的命令为: ifconfig eth0 －alias 192.168.1.1。&nbsp;&nbsp;<br/><br/>2． 经过实验表明，主机切换为备机后，曾经加载的虚拟IP 地址不卸载，不会造成网络冲突。经分析，其原因为: 当路由器收到ARP数据包后，将MAC地址和IP地址的配对更新，当路由器接收到情报数据后，会根据ARP表来寻找虚拟IP地址所在计算机的MAC地址， 因此路由器接收到航管情报后自动将报文发送给主计算机，然后由主机的三通进程将情报通过局域网内的组播方式发送给主备计算机的信息接收进程。&nbsp;&nbsp;<br/><br/>3．建立三通进程，负责接收情报，并将接收的情报分发给两台计算机。需要将三通进程作为系统守侯进程，这样它随着操作系统的启动而自动执行，增强其可靠性。下面对三通进程的实现进行简单介绍。 <br/><br/>在Unix操作系统下，首先需要随着操作系统的启动而自动启用三通进程，在/etc/rc2.d目录下建立脚本文件，如下:<br/><textarea name="code" class="php" rows="15" cols="100">
 #!/bin/sh&nbsp;&nbsp;
findproc() &#123; # 查询进程ID&nbsp;&nbsp;pid=`/usr/bin/ps -e &#124;&nbsp;&nbsp;/usr/bin/grep &quot; $1&quot; &#124;&nbsp;&nbsp;/usr/bin/grep -v &quot;$$&quot; &#124;&nbsp;&nbsp;/usr/bin/grep -v grep &#124;&nbsp;&nbsp;/usr/bin/awk &#039;&#123; print $1 &#125;&#039;`&nbsp;&nbsp;&#125;&nbsp;&nbsp;case $1 in&nbsp;&nbsp;start)&nbsp;&nbsp;
/usr/Tprocess&amp; #启动三通进程 ;;&nbsp;&nbsp;
stop) #关闭三通进程 findproc Tprocess;&nbsp;&nbsp;if [ &quot;$pid&quot; &lt; &gt; &quot;&quot; ]; then&nbsp;&nbsp;/bin/kill -15 $pid&nbsp;&nbsp;Fi&nbsp;&nbsp;;;&nbsp;&nbsp;*)&nbsp;&nbsp;esac&nbsp;&nbsp;
</textarea><br/>三通进程的实现步骤为: 首先是要脱离开原有进程组，单独建立进程组并成为进程组的首进程，建立守护进程; 其次是接收到报文后增加报文头格式，后续紧跟网络发送方IP地址，然后紧跟为原始数据。其数据格式如表所示:&nbsp;&nbsp;<br/>最后是将组合后的数据报文在局域网内发送给双服务器的接收进程。下面介绍三个步骤的实现方法。&nbsp;&nbsp;<br/>步骤1: 脱离开原有进程并建立守护进程。程序如下:&nbsp;&nbsp;pid = fork(); //建立进程 if ( pid&lt; 0 ) return&nbsp;&nbsp; <br/>if ( pid!=0 ) exit(0); //父进程退出 setsid (); //建立对话期 <br/>setpgrp(); //建立进程组，并成为进程组的首进程 chdir(&quot;/&quot;); //更换工作目录为根目录 umask(0);&nbsp;&nbsp;<br/>步骤2: 三通进程负责接收远程航空管制中心的数据。&nbsp;&nbsp;//建立socket&nbsp;&nbsp;<br/>Sid = socket (AF_INET, SOCK_DGRAM, 0);&nbsp;&nbsp;if (sid &lt; 0) &#123;&nbsp;&nbsp;<br/>perror(&quot; n IN distribute.c create socket41432:&quot;);&nbsp;&nbsp;exit(1);&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>//从/etc/services文件中获得服务名称，得到服务端口号。&nbsp;&nbsp;sp = getservbyname (&quot;head&quot;, &quot;udp&quot;);&nbsp;&nbsp;if (sp == NULL) &#123;&nbsp;&nbsp;<br/>printf(&quot;: head not found in /etc/servicesn&quot;);&nbsp;&nbsp;exit(1);&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>addr.sin_port = sp-&gt;s_port;&nbsp;&nbsp;addr.sin_family = AF_INET;&nbsp;&nbsp;addr.sin_addr.s_addr = INADDR_ANY;&nbsp;&nbsp;//打开地址重用机制 on = 1;&nbsp;&nbsp;<br/>setsockopt(sid, SOL_SOCKET,SO_REUSEADDR,&amp;on,sizeof(on) );&nbsp;&nbsp;//绑定此服务名 <br/>if ( bind ( sid, (struct sockaddr *)&amp;addr, sizeof(struct sockaddr_in) )&lt; 0 ) &#123;&nbsp;&nbsp;perror ( &quot; n bind addr&quot;);&nbsp;&nbsp;exit(0);&nbsp;&nbsp; <br/><br/>&#125;&nbsp;&nbsp;<br/>addrLen=sizeof(struct sockaddr_in);&nbsp;&nbsp;//设定目的地址为组播地址 local_net.sin_family = AF_INET;&nbsp;&nbsp;<br/>local_net.sin_addr.s_addr = inet_addr(multicast_ip);&nbsp;&nbsp;sp = getservbyname (&quot;mult_portt&quot;, &quot;udp&quot;);&nbsp;&nbsp;if (sp == NULL) &#123;&nbsp;&nbsp;<br/>printf(&quot;: hjff_port not found in /etc/servicesn&quot;);&nbsp;&nbsp;exit(1);&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>local_net.sin_port = sp-&gt;s_port;&nbsp;&nbsp;//循环等待接收和处理数据 for(;;) &#123;&nbsp;&nbsp;<br/>memset ( buff,0,2048 );&nbsp;&nbsp;<br/>num = recvfrom ( sid, buff,2048,0, (struct sockaddr *)&amp;srcAddr, &amp;addrLen);&nbsp;&nbsp;if ( num&lt; 0 ) &#123;&nbsp;&nbsp;perror ( &quot;n recvfrom &quot;);&nbsp;&nbsp;continue;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>步骤3: 收到报文后，组织和封装数据并在局域网内利用组播来将数据转发给双服务器。&nbsp;&nbsp;链接：ARP协议&nbsp;&nbsp;<br/>ARP，全称Address Resolution Protocol，中文名为地址解析协议，它工作在数据链路层，在本层和硬件接口联系，同时对上层提供服务。&nbsp;&nbsp;<br/>IP数据包常通过以太网发送，以太网设备并不识别32 位IP地址，它们是以48位以太网地址传输以太网数据包。因此，必须把IP目的地址转换成以太网目的地址。在以太网中，一个主机要和另一个主机进行直接通 信，必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢？它就是通过地址解析协议获得的。ARP协议用于将网络中的IP地址解析为硬件 地址（MAC地址），以保证通信的顺利进行。<br/><br/>摘自：http://blog.csdn.net/xiaomin1991222/article/details/50980508
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] IP地址漂移技术-全部重启后好了。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>