首先让我们来看看下面这张大家都非常熟悉的TCP/IP协议族的分层图:
                  
关于每层在网络数据包传输过程中所起到的作用不是本文的重点,本文主要是讲解如何在网络层中使用IP来做服务器集群的负载均衡,为什么可以在这一层来做负载均衡。下面在来看IP协议的报头格式:
                
内红色框内的源地址和目的地址是IP负载均衡功能的关键所在,IP负载均衡又可以称之为网络层负载均衡,其核心原理就是通过内核驱动更改IP的目的地址来完成数据负载均衡的,如下图:
                   
    如上图所示,用户请求数据包(源地址为200.110.50.1)到达负载均衡服务器114.100.20.200后,负载均衡服务器在内核进程获取网络数据包,根据一定的负载均衡算法得到一台内部的真实服务器192.168.1.1,然后将数据包的目的IP修改为192.168.1.1,此后数据包将会被发往192.168.1.1的服务器上,服务器处理完后,将向负载均衡服务器返回相应的数据包,负载均衡服务器在把源地址修改为114.100.20.200后将数据包传输给用户浏览器。在这一整个过程中,数据包没有通过用户的应用进程,因此该负载均衡的性能是非常之高的。
    根据以上的图和上文的讲解,大家可能会觉得这很容易实现,其实不然,在这里需要处理关键的地方就是如何将集群内部服务器处理完后的数据返回给负载均衡服务器。因为,用户请求的数据包到达负载均衡服务器前的目的地址是114.100.20.200,源地址是200.110.50.1,通过负载均衡服务器修改后的目的地址是192.168.1.1,源地址还是200.110.50.1,所以处理后返回的数据包目的地址将是200.110.50.1,源地址是192.168.1.1,最终返回的数据包要回到负载均衡服务器就成了问题。解决的办法大概有如下两种:一、负载均衡服务器使用双网卡,一个对内一个对外,在修改请求数据包的目的IP的同时也修改源地址,将源地址设为自身的IP,即源地址转换(SNAT),这样内部集群服务器响应会再回到负载均衡服务器;二、将负载均衡服务器作为真实物理服务器集群的网关服务器,这样所有的响应都将通过负载均衡服务器。
    IP负载均衡在内核进程完成数据分发,处理性能得到了很好的提高。但是由于所有请求和响应都要经过负载均衡服务器,集群的最大响应数据吞吐量将受到负载均衡服务器网卡带宽的限制,对于提供下载服务或者视频服务等需要大量传输数据的站点而言,这是难以满足需求的。要是能让响应数据包绕过负载均衡服务器直接发往用户机器上就好了,有什么办法可以做到呢?当然有,那就是链路层的负载均衡,这将在下一博文中讲解。  

负载均衡之IP的更多相关文章

  1. Nginx负载均衡使用ip

    upstream test1{ server 192.168.1.213; server 192.168.1.37; } server { listen 80; # default backlog=2 ...

  2. nginx反向代理本地 两台web负载均衡 使用ip+端口代理

    环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...

  3. Nginx负载均衡的4种方式 :轮询-Round Robin 、Ip地址-ip_hash、最少连接-least_conn、加权-weight=n

    这里对负载均衡概念和nginx负载均衡实现方式做一个总结: 先说一下负载均衡的概念: Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法. 我们知道单台服务 ...

  4. Nginx作为负载均衡把客户端真实IP发送给后端配置

    Nginx作为负载均衡获取到客户端的真实IP,但是后端获取到的IP为nginx负载均衡的IP,需要修改配置使后端获取到客户端的真实IP 修改nginx配置增加3行 proxy_set_header H ...

  5. 某云负载均衡获取客户端真实IP的问题

    某云负载均衡真实IP的问题,我们这边已经遇到过两次了.而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会 ...

  6. 负载均衡的几种算法Java实现代码

    轮询 package class2.zookeeper.loadbalance; import java.util.ArrayList; import java.util.HashMap; impor ...

  7. linux负载均衡总结性说明(四层负载/七层负载)

    在常规运维工作中,经常会运用到负载均衡服务.负载均衡分为四层负载和七层负载,那么这两者之间有什么不同?废话不多说,详解如下: 一,什么是负载均衡1)负载均衡(Load Balance)建立在现有网络结 ...

  8. Nginx的负载均衡 - 整体架构

    Nginx的负载均衡 - 整体架构 Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd Nginx目前提供的负载均衡模块: ngx_http_upstre ...

  9. LB 高可扩展性集群(负载均衡集群)

    一.什么是负载均衡 首先我们先介绍一下什么是负载均衡: 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载, ...

随机推荐

  1. spring boot日志配置

    spring boot的application.properties提供了日志的配置,但我还是习惯于老的logback的使用方式.以下内容介绍如何在springboot中使用自定义的logback. ...

  2. Linux下tar解压缩命令

    1.打包命令: 命令格式:tar  -zcvf   压缩文件名.tar.gz   被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解包命令: 命令格式:tar  -zx ...

  3. hihoCoder #1388 : Periodic Signal

    NTT (long long 版) #include <algorithm> #include <cstring> #include <string.h> #inc ...

  4. php配置opcache

    官网地址:http://php.net/opcache 使用下列推荐设置来获得较好的 性能: opcache.memory_consumption=128 opcache.interned_strin ...

  5. 解决ubuntu无法进入unity模式

    终端输入如下命令: 1.sudo add-apt-repository ppa:gnome3-team/gnome3 2.sudo apt-get update 3.sudo apt-get inst ...

  6. 自定义circleindicator

    在此申明,并不是自己写的,只是为了方便日后使用 我使用的circleindicator是从大神的gitHub中弄来的, 使用如下: 一.在配置中导入 compile 'me.relex:circlei ...

  7. sgu Theodore Roosevelt【判断点是否在凸多边形内模板】

    链接: http://acm.sgu.ru/problem.php?contest=0&problem=253 http://acm.hust.edu.cn/vjudge/contest/vi ...

  8. Generally a good method to avoid this is to randomly shuffle the data prior to each epoch of training.

    http://ufldl.stanford.edu/tutorial/supervised/OptimizationStochasticGradientDescent/

  9. Bootstrap学习-导航条-分页导航

    1.导航条基础 导航条(navbar)和上一节介绍的导航(nav),就相差一个字,多了一个“条”字.其实在Bootstrap框架中他们还是明显的区别.在导航条(navbar)中有一个背景色.而且导航条 ...

  10. Delphi窗体研究,留个爪,以后回来研究

    Delphi - 窗体创建过程   来自大富翁. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...