首先让我们来看看下面这张大家都非常熟悉的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. Java以指定格式输入数字

    package com.ylx; import java.text.DecimalFormat; public class Test { public static void main(String[ ...

  2. linux 文件夹-文件权限设置

    只设置文件夹权限为755 文件权限为644find -type d -exec chmod 755 {} \;  find -type f -exec chmod 644 {} \;  或者  fin ...

  3. dedecms织梦如何调用指定的多个栏目导航

    {dede:channelartlist row='2' typeid='1,2这里输入多个指定的栏目ID' } <li><a href='{dede:field name='typ ...

  4. laravel学习之路3 数据库相关

    读写分离之多个读? 有 'host' => $readHosts[array_rand($readHosts)], 上面的好像有缓存问题php artisan config:cache ] ); ...

  5. Hadoop环境搭建1_JDK+SSH

    1 前言: Hadoop 最早是为了在Linux 平台上使用而开发的,但是Hadoop 在UNIX.Windows 和Mac OS X 系统上也运行良好.不过,在Windows 上运行Hadoop 稍 ...

  6. phpcms控制器变量分配到模板

    跟TP.CI框架不同,phpcmsv9分配变量的方式是: 控制器中声明了变量$a='zrp'或$data=array('aa','bb'); 在模板中就可以直接输出: 字符串:{$a} 数组:遍历 { ...

  7. 验证-- email类型输入框(电子邮件地址)--multiple

    如果需要一个用来填写电子邮件地址的输入框,可以使用email类型.这样浏览器可以帮我们验证格式是否正确,而不需要自己写验证规则.原文:HTML5新控件 - email类型输入框(电子邮件地址) 1,只 ...

  8. 九度OJ 1351:数组中只出现一次的数字 (位运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3098 解决:906 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ...

  9. iOS 微信支付点击左上角返回解决方案

    在网了搜了一些解决方案,感觉并不是那么严谨,于是自己动手搞了一下,直接说思路 iOS调起第三方支付和安卓还不一样,安卓是把第三方的支付SDK直接镶嵌在自己的App中,而iOS由于沙盒机制,各个应用之间 ...

  10. 【python】-- SQLAlchemy操作MySQL

    ORM.SQLAchemy orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是类似python这种面向对象的程序来说一切皆对象,但是使用的数据库却都是 ...