从一开始就要思考扩展的架构,所谓可扩展性指的是通过扩展规模提高承载能力的本领,往往体现在增加物理服务器或者集群节点。负载均衡是常见的水平扩展的手段。

目标:(1)减少单点故障(2)提升整体吞吐量(3)根据负载分配任务量

HTTP重定向

通过HTTP Location重定向,通过一定的策略(如地域就近)将主站URL转移到分站/镜像URL,分散主站工作量。实现负载均衡的同时,加快用户下载速度,适用于网络IO成为瓶颈时(如下载服务)。

HTTP重定向通常采用随机策略。如果使用轮询(RR),需要记录最后一次重定向的服务器序号,给通常无状态的HTTP带来额外开销;由于需要锁机制保证任何时刻只有一个请求能修改它,对并发性也有一定影响。

根据概率统计理论,随着吞吐率的增加,随机调度也会逐渐趋近于顺序调度的均衡效果。

多数情况,重定向负载均衡不好控制,无法阻止用户直接访问真实服务器。只有类似文件下载、广告展示等一次性的请求适合重定向。

DNS

DNS提供域名解析服务,即域名到ip的映射,这种映射可以是一对多的,这时DNS便起了负载均衡的作用。DNS服务器软件提供了丰富的调度策略,最常用的是根据用户IP进行智能解析,从所有可用的A记录中找到离用户最近的一台服务器。利用动态DNS,可以实现故障转移,但因为DNS的层级缓存,会存在一定延迟。

除了因为缓存带来的更新延迟,由于负载均衡工作在DNS层面,调度灵活性较差,无法将HTTP请求的上下文引入调度策略。

反向代理

反向代理服务器的核心工作是转发HTTP请求,所以又叫七层负载均衡。相比HTTP重定向和DNS,反向代理是转发请求,而前者是转移。所有请求都经过反向代理,等待实际服务器(也叫后端服务器)的响应,再反馈给用户。这样可以将调度策略落实到每一个HTTP请求,从而实现更加可控的负载均衡策略。

反向代理的扩展能力,一方面是自身并发处理的能力,当反向代理服务器吞吐率接近极限时,无论添加多少后端服务器也无济于事。另一方面,转发操作本身需要一定开销,如创建线程、与后端服务器建立TCP连接、接收后端返回的处理结果、分析HTTP头信息、用户空间和内核空间的频繁切换等,通常这部分时间不长,但当后端服务器处理请求时间非常短时(如静态资源),转发的开销就显现出来。

反向代理一般都有监控后端服务器的功能,可以简单配置健康探测,调度器会自动放弃异常的后端服务器。实际应用可以部署一定数量的备用服务器,当一些后端服务器异常时接替它们的工作,保证整体性能。

如果后端服务器是有状态的,如在session中保存了用户数据,需要使用粘滞会话(Sticky Sessions)。一种方法是使用用户的IP地址作为标识,将IP地址做散列计算映射到后端服务器上。还可以利用Cookie,反向代理将后端服务器的编号追加写到用户的Cookie中,这样便知道下次请求该发给哪个后端服务器。粘滞会话可能会破坏负载均衡策略,使得后端服务器个性化,尽量避免在后端服务器存储状态,采用分布式Session或分布式缓存来替代。

IP

反向代理本身的开销制约了其扩展性,考虑将调度器工作在应用层以下,网络数据包从内核缓冲区进入用户地址空间之前,Linux内核就将其转发到实际服务器上。

NAT工作在传输层,可以修改数据包的IP地址和端口,所以也叫四层负载均衡。NAT服务器负责连接外部网络和内部网络,实际服务器必须将NAT服务器作为默认网关。当数据包到达NAT服务器,NAT服务器将目标地址从NAT的地址修改为实际服务器地址的IP和端口,然后指定内部网卡将数据包投递到内部网络;实际服务器收到数据包进行处理,数据包到达默认网关,即NAT服务器,NAT服务器再修改数据包,将源地址从实际服务器地址改为NAT服务器。Linux使用NetFilter/iptables维护数据包路由规则。使用IPVS(LVS)配置基于NAT的负载均衡。由于在内核转发的低开销,吞吐率比反向代理高,转发能力主要取决于NAT服务器的网络带宽。

对于下载或视频等站点,NAT服务器的带宽会成为瓶颈。LVS提供了直接路由(Direct Router)的方式,它的负载均衡工作在数据链路层,通过修改数据包的MAC地址,将数据包转发到实际服务器,而且响应数据包直接发给用户端,不用经过调度器,所以实际服务器必须直接接入外部网络,也不能将调度器设为默认网关。直接路由使用IP别名,需要给实际服务器添加和调度器IP地址相同的IP别名,这样可以正常将请求数据包转发到实际服务器。通常响应数据包比请求数据包大的多,所以LVS-DR的优势就是响应数据包不用经过调度器,避免了调度器的带宽瓶颈。

HTTP服务负载均衡总结的更多相关文章

  1. 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)

    转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...

  2. Windows服务器nginx+tomcat服务负载均衡

    一.安装两个tomcat服务自启动 1. 解压两个tomcat,名称为分别1,2 2. 配置环境变量 3. 修改文件server.xml中的三个端口号,使得两个tomcat不冲突 (1)<Ser ...

  3. 【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon

    对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可 ...

  4. springcloud第四步:ribbon搭建服务负载均衡

    使用ribbon实现负载均衡 启动两个会员服务工程,端口号分别为8762.8763,订单服务 使用负载均衡策略轮训到会员服务接口. 什么是ribbon ribbon是一个负载均衡客户端 类似nginx ...

  5. SpringCloud微服务负载均衡与网关

    1.使用ribbon实现负载均衡ribbon是一个负载均衡客户端 类似nginx反向代理,可以很好的控制htt和tcp的一些行为.Feign默认集成了ribbon. 启动两个会员服务工程,端口号分别为 ...

  6. 微服务负载均衡 —— ribbon

    负载均衡是系统高可用.缓解网络流量和处理能力扩容的重要手段,广义的负载均衡指的是服务端负载均衡,如硬件负载均衡(F5)和软件负载均衡(Nginx).负载均衡设备会维护一份可用的服务器的信息,当客户端请 ...

  7. SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign

    1.Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的-套客户端―负载均衡的工具. 简单的说,Ribbon是Netlix发布的开源项目,主要功能是提供客户端的 ...

  8. WCF Routing服务,负载均衡

    WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发,能对服务做负载功能: 二.WC ...

  9. 小迪安全 Web安全 基础入门 - 第八天 - 信息打点-系统篇&端口扫描&CDN服务&负载均衡&WAF防火墙

    一.获取网络信息-服务厂商&网络架构 1.通过whois查询获取. 2.nmap.goby等扫描工具扫描获取. 3.https://www.netcraft.com/等网站查询获取. 二.服务 ...

随机推荐

  1. vsftpd,tftp安装配置

    一. 对比共同点:都包含ftp不同点:1)vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.你可以通过ftp客户端上传下载软件.可设置访问用户名密码,或匿名anonymous登陆.默认 ...

  2. 护肤品总结 Skin Care (1)

    很久没有更博了,最近过年在家,就写些生活上面的总结吧- 从护肤品开始,接下来陆陆续续会有化妆品,北美生活购物等. 因为是学生党,所以此帖中的东西基本都是价钱适中.因为经常买买买,所以用的好的坏的都会在 ...

  3. DPDK2.1开发者手册3-4

    环境抽象层EAL 环境抽象层的任务对访问底层资源例如硬件和内存提供入口.它提供了隐藏应用和库的特殊性性的通用接口.它的责任是初始化分配资源(内存,pci设备,定时器,控制台等等). EAL提供的典型服 ...

  4. [LeetCode] 110. Balanced Binary Tree 解题思路

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  5. C++图结构的图结构操作示例

    示例代码: /* By qianshou 2013/10/5明天就要开学了~哎~ */ #include<iostream> using namespace std; /********* ...

  6. pojo的序列化和反序列化

    实例代码: package com.lky.pojo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStrea ...

  7. 使用GULP打包、压缩与打版本号

    这篇文章讲我整理的一种打包项目的方式,以下是我的依赖清单 "devDependencies": { "gulp": "^3.9.1", &q ...

  8. socket编程2

    package tcp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOExceptio ...

  9. css链接

    css code: a:link{ color:#FF0000; } a:visited{ color:#00FF00; } a:hover { color:#0000FF; } a:active{ ...

  10. Failed to start SYSV: Nginx is an HTTP(S) server, HTTP(S) reverse

    在centos7上安装nginx时,有时会遇见如题所示的nginx启动报错,一般会出现在编写完nginx启动脚本以后试着启动nginx时出现 这里其实没什么什么问题,只是很多时候我们都先用/usr/l ...