虚拟IP原理

原文链接: http://xiaobaoqiu.github.io/blog/2015/04/02/xu-ni-iphe-ippiao-yi/                    http://www.cnblogs.com/crazylqy/p/7741958.html文中有两处用红色标记的文字,是博主认为错误的地方,故做了修改,若理解有误,还望指正。            …

大家好,又见面了,我是你们的朋友全栈君。

原文链接:  http://xiaobaoqiu.github.io/blog/2015/04/02/xu-ni-iphe-ippiao-yi/

                     http://www.cnblogs.com/crazylqy/p/7741958.html

文中有两处用红色标记的文字,是博主认为错误的地方,故做了修改,若理解有误,还望指正。

                                   虚拟IP和IP漂移

1.虚拟IP:

       在 TCP/IP 的架构下,所有想上网的电脑,不论是用何种方式连上网路,都必须要有一个唯一的 IP-address。事实上IP地址是主机硬件地址的一种抽象,简单的说,MAC地址是物理地址,IP地址是逻辑地址。

      虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供服务器的主机除了有一个真实IP外还有一个虚IP,使用这两个IP中的任意一个都可以连接到这台主机。

       虚拟IP一般用作达到HA(High Availability)的目的,比如让所有项目中数据库链接一项配置的都是这个虚IP,当主服务器发生故障无法对外提供服务时,动态将这个虚IP切换到备用服务器。

        一个网卡上是可以配置多个IP地址的。

2.虚拟IP原理:

        ARP是地址解析协议,它的作用很简单,将一个IP地址转换为MAC地址,然后给数据链路层使用。

        每台主机中都有一个ARP高速缓存,存储同一个网络内的IP地址与MAC地址的对应关 系,以太网中的主机发送数据时会先从这个缓存中查询目标IP对应的MAC地址,会向这个MAC地址发送数据。操作系统会自动维护这个缓存。

        在Linux下可以使用arp命令操作ARP高速缓存。

        比如存在物理机A(IP是172.25.0.1 )和物理机器B(IP是172.25.0.2),A作为对外服务的主服务器(比如web服务器),B作为备份机器,两台服务器之间的通信是通过 Heartbeat(心跳机制),即主服务器会定时的给备份服务器发送数据包,告知主服务器服务正常,当备份服务器在规定时间内没有收到主服务器的 Heartbeat消息后,就会认为主服务器宕机,则备份服务器就会升级为主服务器。假设物理机A的ARP缓存如下:

地址                     类型    硬件地址            标志  Mask            接口
172.25.0.1            ether   ec:f4:bb:49:xx:xx   C                     eth0
172.25.0.100          ether   ec:f4:bb:49:xx:xx   C                     eth0
172.25.0.2            ether   28:e3:47:c0:xx:xx   C                     eth0
...

         另外物理机器B(IP是172.25.0.2)的ARP缓存如下:

地址                     类型    硬件地址            标志  Mask            接口
172.25.0.2            ether   ec:f4:bb:49:xx:xx   C                     eth0
172.25.0.100          ether   ec:f4:bb:49:xx:xx   C                     eth0
172.25.0.1            ether   ec:f4:bb:49:xx:xx   C                     eth0
...

        很明显主机A和主机B除了配置自己的真实IP外,都同时配置了另外一个相同的ip,我们称之为VIP(虚拟IP)。

       当机器B通过BeatHeart得知机器A对外服务质量低于预期的时候(比如发生故障,服务无响应),会将自己的ARP缓存发送出去,让路由器或者交换机上的ARP缓存表修改相应的映射关系,告知虚拟地址应该指向我(物理机器B,172.25.0.2),这时候,外界再次访问虚拟IP的时候,机器B会变成主服务器,而A降级为备份 服务器。这就完成了主从机器的自动切换,这一切对外界是透明的。

      问题来了,当虚拟IP VIP在主机A上时,主机A的MAC地址为MAC_A某主机M的arp缓存中存放着一个映射关系:VIP —à MAC_A;当主机A宕机后,虚拟IP漂浮到了主机B,主机B的MAC地址为MAC_B,那么此时主机M想与虚拟IP通信时,是做不到,因为它的arp高速缓存中的虚拟IP VIP的映射还指向主机A的MAC地址。这个问题解决的思路就是当虚拟IP漂浮后,刷新所有其他主机的arp缓存,重新进行arp广播,得到最新的IP与MAC的映射关系。

     那么虚拟IP在实现漂浮后,是如何刷新所有其他主机的arp缓存的呢?

     这里就会引入另一个概念,garp()简称无端arp或者免费arp,主要是用来当某一个主机C开机时,用来确认自己的IP地址没有被人占用而做的一个检 测。广播发送这个arp,请求得到本机IP地址的MAC地址,主机C并不希望此次arp请求会有arp应答,因为应答意味着IP地址冲突了。当其他主机收 到这个arp请求后,会刷新关于这个arp请求源的主机IP地址的映射。

     免费arp的作用主要有两个:

1.      检测IP地址是否有冲突

2.      刷新其他主机关于本次IP地址的映射关系

       集群管理软件Pacemaker里面的资源代理ocf:heartbeat:IPaddr2中,在虚拟IP漂浮后,会向网络内广播发送garp请求,以此来刷新其他主机的arp缓存

3.IP漂移

       上面的VIP自动切换的过程就称之为IP漂移。

       我们可以通过Keepalived来实现这个过程。 Keepalived是一个基于VRRP协议(Virtual Router Redundancy Protocol,即虚拟路由冗余协议)来实现的LVS(负载均衡器)服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行 Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外都表现为一个虚拟IP。主服务器会发送特定的消息给备 份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125269.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Could not find resource com.occupation.mapper/StudentsMapper.xml_小晓_同学__新浪博客

    Could not find resource com.occupation.mapper/StudentsMapper.xml_小晓_同学__新浪博客错误的原因:路径不能写为com.occupation.mapper需要用斜杠

    2022年7月11日
    21
  • db4o使用全解「建议收藏」

    db4o使用全解「建议收藏」db4o使用全解 db4o是一种纯对象数据库,相对于传统的关系数据库+ORM,db4o具有以下好处:1)以存对象的方式存取数据(不过你考虑一下完全以对象的方式去考虑数据的存取对传统的数据库设计思维来说是多么大的颠覆)2)无需数据库服务器,只需要一个数据文件,且dll大小仅为300多k,非常适合作为嵌入式数据库;3)提供QueryBySample,NativeQuery和S

    2022年7月21日
    9
  • html下划线 下移,css如何实现下划线滑动效果

    html下划线 下移,css如何实现下划线滑动效果本文主要讲述两种下划线动效效果,第一种悬停时X轴由内向外展开实现动画效果,第二种为左右自动展示,由左向右,或由右向左。实现的主要效果是利用伪类标签,以及hover,利用transfrommtrition实现动画效果。x轴由内向外展开利用贝塞尔曲线利用横线的动画实现,具体代码如下:ul{display:flex;padding:0;margin:0;list-style-type:non…

    2022年5月28日
    52
  • sql smallint与int_datetime数据类型

    sql smallint与int_datetime数据类型使用整数数据的精确数字数据类型。bigint数值范围从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据(所有数字)。存储大小为8个字节。int数值范围从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据(所有数字)。存储大小为4个字节。int的SQL-92同义字为integer。smallint数值范围从-2^15(-32,76

    2022年9月21日
    0
  • pve虚拟机单网口(虚拟机做软路由)

    PVE虚拟网口扩展实现一线多拨PVE网口设置可以看到这里有两个物理网口我的物理网口enp3s0没有对应的vmbr1,需要先创建LinuxBridge,步骤如下:ROS虚拟网口设置这是关键一步,需要创建四个虚拟网口对应一个LAN口设置四个虚拟网口,完成如下:完成!…

    2022年4月16日
    686
  • 请简述Map-Reduce算法的原理(通俗易什么成语)

    下面是我自己的微信公众号(不定期更新JAVA、大数据、个人成长等干货)1、公众号上有经典的技术电子书可以免费领2、大家有问题可以在公众号问我,只要你问了我就会回复(相互交流)也可以扫描下面二维码,加我个人微信,和我直接沟通Hadoop简介Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及…

    2022年4月13日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号