互联网架构设计漫谈 (3)

中小型互联网公司在并发量不高的情况下可以选用软件负载均衡作为代理层,他们通常和更靠外的“接入层”的硬件负载均衡器合作,为用户提供更好的服务。软件负载均衡的特点是并发1-2w,基于操作系统,容易上手,费用较低。

要点

什么是软件负载均衡?(了解)

有哪些流行的软件负载均衡器?(了解)

网络负载均衡的发展与技术选型(熟悉)

软件负载均衡的应用详解(重点)

什么是软件负载均衡?

软件负载均衡是指在一台或多台服务器的操作系统上安装一个或多个软件来实现负载均衡,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。

代理层通常起到承上启下的作用,上连“接入层”下接应用服务器(上游服务器),可以做反向代理,缓存,数据验证,限流。本文会一一为各位介绍。

流行的软件负载均衡器

目前比较流行的有LVS,Nginx 和 HAProxy,逐个看看他们的特点。

LVS(Linux Virtual Server) 是使用Linux内核集群实现的一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS特点是:

  • 仅作分发之用,即把请求直接分发给应用服务器,因此没有流量的产生,对资源的消耗低。
  • 配置简单,能够配置的项目少。
  • 工作在第四层(传输层),支持TCP/UDP,对应用的支持广泛。

HAProxy实现了一种事件驱动单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。

HAProxy特点是:

  • 支持虚拟主机。
  • 支持Session保持,Cookie引导
  • 通过指定的url来检测应用服务器的状态。
  • 支持TCP/HTTP协议转发。
  • 负载均衡策略:
  • roundrobin,轮询,每个应用服务器轮流响应请求;
  • static-rr,对每个应用服务器设置权重,根据权重来响应请求;
  • leastconn,最少连接先处理,连接数最少的服务器优先响应请求;
  • source,根据请求源IP响应请求,同一IP的请求放到Hash表中存储,这样同一IP的请求可以被分发到用一台应用服务器上处理,适合处理session的情况;
  • ri,根据请求的URI,发送到对应的应用服务器;
  • rl_param,根据请求的URl参数,发送到对应的应用服务器;
  • hdr(name),根据HTTP请求头,发送到对应的应用服务器;
  • rdp-cookie(name),把cookie记录到哈希表中,这样同一cookie的请求可以被分发到用一台应用服务器上处理。

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

Nginx特点是:

  • 工作在网络的7层,对http应用做负载均衡策略,如:域名、目录结构。
  • 对网络的稳定性依赖小,可以区分内网和外网的访问。
  • 安装和配置相对简单。
  • 能承受很高负载且稳定,处理的流量依赖于按照Nginx服务器的配置。
  • 可以检测服务器的问题,可以对服务器返回的信息进行处理和过滤,避免让无法工作的服务器响应请求。
  • 对请求可以进行异步处理。
  • 支持HTTP、HTTPs和EMAIL。

网络负载均衡的发展与技术选型

发展阶段:企业业务从0到1,从无到有,数据量和访问量都不大。Nginx或HAProxy进行单点的负载均衡就已经足够了。这阶段刚刚采用多台应用服务器、数据库,需要一定的负载均衡做支撑。由于业务量不大,所以没有专业的维护团队来维护,也没有大规模的网站部署的需求。因此Nginx或HAproxy是第一选择,因为其上手快, 配置容易,在七层之上利用HTTP协议就能满足要求了。

扩张阶段:随着业务量增大,用户访问和交易量也在逐步增加。这时单点的Nginx或HAProxy已经无法满足之前的需求了,使用LVS或者硬件负载均衡(F5/Array)就是架构师需要考虑的问题了,Nginx此时就作为LVS或者硬件负载均衡(F5/Array)的节点来处理。软件负载均衡+硬件负载均衡的架构配置在这个阶段就需要考虑了,也是对架构设计者的挑战。

成熟阶段:随着公司业务扩张到达顶峰,之前的网络服务已经升级成主流服务产品,需要考虑在开源产品上进行业务定制,所以开源的LVS,已经成为首选。其在深度定制之后依旧会和硬件负载均衡器配合完成业务服务。

软件负载均衡的应用详解

一提到负载均衡器,大家一定会想到反向代理,其实还有其他的功能,特别是技术发展到今天信息流转的速度越来越快,信息量以指数级的增长充满整个互联网。我们的技术架构也要随之变化,紧跟发展的脚步。这里以当下最流行的Nginx 为例给大家讲讲,如何在互联网架构设计中,把反向代理,缓存,验证,限流这些功能应用起来,让用户的请求得到更快的反馈。

反向代理与负载均衡

先看图,了解一下客户端请求是如何到达服务器端的。

  1. 客户端请求URL给DNS
  2. DNS将URL转化成对应的IP
  3. 通过IP找到服务器
  4. 服务器接受到请求的报文,转交给接入层处理,接入层由于采用了硬件负载均衡器,所以能够扛住大数据量
  5. 接入层把报文再次转交给代理层(并发在1-2w),代理层的Nignx收到报文再根据反向代理的策略发送给上游服务器(应用服务器)

负载均衡的算法

以Nignx 为例,介绍三个算法。

  • round-robin: 轮询算法,默认算法。对上游的服务器进行挨个轮询,这个算法是可以配合weight(权重)来实现的。
  • ip-hash:这个算法可以根据用户IP进行负载均衡,同以IP的用户请求报文是会被同一台上游服务器响应的。
  • hash key:这个算法是对hash算法的补充,主要是考虑当出现上游服务器增加/删除的情况,请求无法正确的被同一服务器处理。所以对每个请求都设置hash key这样就算服务器发生了变化,key的值没有变,也可以找到对应的服务器。

动态负载均衡

一般上游服务器都采用微服务的架构,那么负载均衡会把数据报发给哪个服务呢?如果服务出现了问题如何通知负载均衡器呢?有新的服务注册怎么办呢?

  1. 微服务首先会注册到“服务注册发现”中心,这里的实现方式很多有Consul,Eureka,以后会为各位一一讲解。
  2. 注册中心有所有微服务的信息,Nignx 会定期从这里拉取服务信息。
  3. 获取微服务信息以后,Nignx 收到数据报的时候就可以根据策略把这些信息传递给对应的服务了。

限流

限流的工作可以在接入层用硬件负载均衡器来完成,也可以在代理层来完成。限流的算法也不少,有令牌桶算法,漏桶算法,连接数限制等等,这里我们就介绍两个在实际中的应用。一般实现可以通过Nignx+Lua 来实现,如果大家有兴趣专门开篇给大家讲解。

连接数限流:通过ngx_http_limit_conn_module 模块实现。设置最大的连接数以及共享内存的区域大小,请求的时候判断是否超过了最大连接数,如果超过最大连接数就被限流,否则针对连接数就+1,请求结束以后会将连接数-1.

漏桶算法:通过ngx_http_limit_req_module 模块实现。一个固定容量的桶,数据报按照固定的速度流出。数据报可以按照任意的速度流入桶中,如果数据报的容量超过了桶的容量,再流入的数据报将会被丢弃。按照这个规则,需要设置限流的区域以及桶的容量,以及是否延迟。

缓存

Nignx 做缓存可以利用Nignx 本地缓存机制,先看图。

接入层发送请求,如果能够再Nignx本地缓存命中,直接返回缓存数据,如果没有命中回源到应用服务器。缓存更新服务器定时更新Nignx本地缓存信息。这些需要考虑数据的一致性,合适更新以及何时失效等情况。

还需要需求注意的是,哪些数据可以放在Nignx本地缓存的,一般是更新频率不太高但是访问频率比较高的数据。例如:用户基本信息,以及一些静态信息。一般HTTP HEAD 中都带有一些信息更新的信息。Nignx 也可以通过epires,etag,if-modified-since 来实现浏览器缓存的控制。

超时重试

  • 客户端超时重试
  • DNS超时重试
  • 代理超时重试

其他

  • 失败重试
  • 心跳检测
  • 配置上游服务器

总结:代理层中软件负载均衡起到的作用,目前市面上有哪些常用的负载均衡器,他们的特点是什么?作为用的比较多的Nignx的功能有哪些,在负载均衡,反向代理,限流,缓存等方面的表现如何。

互联网架构设计漫谈 (3)相关推荐

  1. 互联网架构设计漫谈 (6)-90%的架构师都知道的工作流原理

    互联网架构设计漫谈 (6)-90%的架构师都知道的工作流原理 工作流是互联网中常见的应用场景,目前国内有很多厂商提供各种各样的工作流引擎.在国际也有一些知名的工作流引擎,比如:jBPM 和 Activ ...

  2. 互联网架构设计漫谈 (5)-搞清SpringCloud

    互联网架构设计漫谈 (5)-搞清SpringCloud 微服务发展至今有许多公司都提供了架构来协助搭建微服务平台,比较著名的有 Dubbo,DubboX,Spring Cloud.今天带大家来了解一下 ...

  3. 互联网架构设计漫谈 (4)-你知道微服务的“分与合”

    互联网架构设计漫谈 (4)-你知道微服务的"分与合" 业务高速发展的今天,单应用已经无法支撑庞大/复杂的业务系统.所以需要根据业务进行拆分,方便业务做扩容,并且增加大系统的团队协作 ...

  4. 互联网架构设计漫谈 (2)

    互联网架构设计漫谈 (2) 应用的接入层通常需要承载大量的网络请求,有些互联网企业几十万PV请求,在软件负载均衡无法支撑的情况下会考虑采用硬件负载均衡的技术帮助控制流量,然后再转发给软件负载均衡进行进 ...

  5. 互联网架构设计漫谈 (1)-概述

    互联网架构设计漫谈 (1)-概述 互联网已经在中华大地兴起多年,各种互联网架构也是层出不穷,抱着学习的态度在这里分享一下对互联网架构的一些理解,漫谈互联网架构设计. 系统架构图 上图想必大家都不陌生了 ...

  6. flowable工作流 流程变量_互联网架构设计漫谈 (6)-90%的架构师都知道的工作流原理...

    工作流是互联网中常见的应用场景,目前国内有很多厂商提供各种各样的工作流引擎.在国际也有一些知名的工作流引擎,比如:jBPM 和 Activiti. 他们都老牌的工作流引擎.同时都遵循BPMN 2.0的 ...

  7. 互联网服务架构设计漫谈(一)—设计考量点总览

    互联网服务架构设计漫谈(一)--设计考量点总览 1    概述 本文着重介绍在互联网应用服务器端的架构设计中需要关注的设计考量点,提供一个总览性认知.首先我们需要知道:不同类型的应用.不同用户规模和阶 ...

  8. 大型互联网架构设计踩坑

    下面是我总结的在大型互联网架构设计中实际踩过的坑简单总结,希望能给大家带来思考,避免重复踩坑: •参数未做校验导致内存溢出 •数据库死锁 •数据库/ Redis连接被打满 •数据库事务问题 •Redi ...

  9. 互联网架构设计中的poll和push

    poll方式 poll方式,也称为轮询,是大家都比较熟悉的一种数据同步方式,客户端定期去ping查询服务器,确定是否有需要的数据.例如,软件更新模块,客户端软件需要定期去查询官方网站,判断当前是否有更 ...

最新文章

  1. vs项目移植到linux运行,VS2008项目移植到Linux
  2. python安装流程-Python安装与卸载流程
  3. 新瓶装旧酒,贴着区块链标签的QunQun社交平台真能讲个好故事?
  4. 浅谈ICA算法的概念、本质和流程
  5. 如何把nodejs应用和SAP云平台上的Redis实例做绑定
  6. 一句话征服了美国人,这位饱受争议的数学博士竟从未上过学?
  7. 如何启动多个WebLogic托管服务器
  8. 计算机体系结构数据库论文,信息管理中计算机数据库系统研究论文
  9. 图片上传限制文件类型
  10. javascript跑马灯效果
  11. word导出PDF,彩色无故变成黑色的解决办法。
  12. 8根网线的排序和作用
  13. postMan请求下载接口添加参数
  14. 微软亚洲研究院多模态模型NÜWA:以自然语言创造视觉内容
  15. 学生表mysql查询语句
  16. mac文件反选_【PS反选键是什么?】Photoshop该如何进行反向选择?
  17. 国外网络推广的方式有哪些?海外自媒体平台推广你真的会做吗?
  18. CGI实现文件的上传和下载
  19. 如何看待简书大V饱醉豚 写的《为什么程序员是出轨率最高的群体》?
  20. 33-viper 配置文件加载

热门文章

  1. python 定时执行_python定时执行任务 轻量级
  2. 【电路】LM293D电机驱动芯片
  3. Nandflash 驱动深度分析(基于S3C2410)
  4. linux指令 sed,Linux命令sed
  5. ios 按钮图片拉伸_#UIButton#背景图片的拉伸
  6. 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列
  7. 【JUC】第六章 Fork/Join 框架、CompletableFuture
  8. 【高校宿舍管理系统】第九章 寝室编号设置和宿舍初始化以及预选设置
  9. 浅入深出Vue:注册
  10. 2018-04-08Java编程夯实学习心得(2)