点击上方“蓝字”关注,酷爽一夏

菜菜哥,上次你给我讲的分库分表策略对我帮助很大

有帮助就好,上次请我的咖啡也很好喝~

呵呵,不过随着访问量的不断加大,网站我又加了nginx做负载均衡

好呀,看来要进阶高级工程师啦~

负载均衡也很简单呀,一个nginx就搞定了,现在可以说我精通负载均衡了吧

其实负载均衡的内容还有很多

一个系统发展初期,往往都是单机系统。应用和数据库在一台服务器上,随着业务的发展,访问量的增大,一台服务器性能就会出现天花板,往往已经难以支撑业务量了。这个时候就要考虑把数据库和应用服务器分开,访问继续增加,就会考虑数据库分库分表,应用服务器做负载均衡,其实这也属于分布式系统的一个范畴。分布式系统的核心概念就是一个“分”字,一台服务器支撑不住,那就两台,三台,四台....当然分之后会带来其他问题,比如最常见的数据一致性问题,调用链监控等问题,这些不在今日的讨论范围内,有兴趣的同学请移步百度。

很多项目做“分布式”部署提高系统性能,首期采用的往往是负载均衡策略。

负载均衡

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。

负载均衡既然属于“分”策略的一种表现形式,就会涉及到任务的分配者,任务执行者,分配算法。这里的任务分配者就是我们常说的负载均衡器,任务执行者就是处理任务的服务器,分配算法就是常说的轮训等分配策略。这里把任务的分配者叫做负载均衡器其实是不正确的,负载均衡器这个概念注重的更多是均匀分配任务,让每个任务的计算单元的任务量达到均衡状态,而现实中任务的分配更多是出于每个计算单元的性能或者业务来考虑。让每个计算单元处理几乎相同数量的任务只是分布式均衡器其中的一部分内容。

以http请求为例,在一个http请求的过程中,其实会遇到有很多负载均衡的过程,一个系统在什么阶段做负载均衡取决于它的请求量,这和常说的QPS/TPS/DAU等有直接关系,假设系统的请求量非常少,其实完全没有必要做负载均衡,当然有时候为了达到高可用的目的也做负载均衡,这里不在展开讨论。那一个http请求到底可以经过哪些负载均衡器呢?http请求的过程如下图所示

DNS负载均衡

当一个client向一个url发起请求(这里不考虑直接请求IP地址的情况),第一步需要做的就是请求DNS服务器去做域名解析,把请求的域名转换成IP地址。DNS解析同一个域名可以根据来源返回不同的IP地址,利用这个特性可以做DNS负载均衡。client请求离自己最近的资源才是最快的,所以可以把系统部署在不同区域的机房,每个client经过DNS解析只请求离自己最近的机房资源,比请求异地的机房资源要快的多。例如:一个网站可以同时部署在北京机房和深圳机房,河北的用户请求网站的时候都会被导向北京机房,比访问深圳的速度要快的多。

DNS负载均衡仅限于解析域名的时机,所以它的力度是很粗的,相应的负载均衡算法也有限。但是这种方案实现起来比较简单,成本也很低,而且在一定程度了缩短了用户的响应时间,加快了访问速度。由于DNS信息都有很长时间的缓存,所以更新的时候会有一段时间的信息差异,会导致部分用户正常业务的访问的错误。

硬件负载均衡

当一个请求知道了要访问的目标IP,便会通过层层的网关和路由器到达目标IP的机房,在这之前属于网络传输的范畴,一般很难进行干预。有很多机房都通过硬件设施来实现负载均衡的目的,这和路由器、交换机类似,也可以理解为底层的设备。目前最常用的莫过于F5了,这样的硬件设备一般都出产于大公司,性能都经过严格测试,功能强大,但是很贵,一般的中小公司不会更没有必要使用这种土豪设备。

硬件负载均衡性能很强大,支撑的并发一般都在每秒几百万,而且支持的负载算法也很多,而且一般都配套的有安全防护措施,比如防火墙,防攻击等安全功能。

软件负载均衡

相比于硬件负载均衡,现在每个公司更常见的是软件负载均衡,基本过程就是独立出一个负载均衡服务器或者集群,安装上有负载均衡功能的软件来进行分发。最常用的4层负载均衡软件LVS,几乎所有应用层的负载均衡都可以做,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案。还有处于7层的nginx也可以实现负载均衡,Nginx 支持 HTTP、E-mail协议,当然现在有相应的nginx做4层负载均衡的模块。

与硬件想比,软件负载均衡的吞吐量要小很多,就算是4层的LVS的性能也只在几十万而已,nginx在几万,不过这对于一般公司的业务也足够了,当一个公司的业务量请求量达到几百万,估计也有钱买F5硬件了。软件负载均衡的最大优势在于配置灵活,可扩展性强,可定制性比较强,而且成本还很低。这也是中小公司首选的方案。

应用

说了这么多,其实以上几种方案是基于http请求的途经来解决问题,每种方案都有它自己的缺点和优点,设计一个系统的时候初期就把以上方案全部采用以达到高性能的要求,也许并不是什么好事,每一个系统都是随着业务的增长而逐渐改变架构形态,而这个过程采用的负载方案一般过程都是 软件负载->硬件负载->DNS负载,当然这里的硬件和DNS也许有时候会颠倒过来,但是软件肯定是首当其冲的。随着业务量的增大,以上三种方案更多的是互相配合,互相补充的,就像微信这种业务,不可能单独的使用硬件负载就能达到业务要求的。

至于什么阶段采用什么方案,还是要根据具体业务的请求量来决定,比如:当前我的QPS在 一万左右,完全可以用nginx或者LVS去解决,当上升到百万级别,可以尝试着用硬件+软件的方式去解决,当到达千万甚至更高,就要考虑多机房部署DNS负载均衡了,没有一种方案是完美的,但是可以采用多种方案混用的方式来达到近乎完美的情况。

●程序员修神之路--做好分库分表其实很难之一(继续送书)

●程序员修神之路--做好分库分表其实很难之二(送书继续)

●程序员过关斩将--你为什么还在用存储过程?

●程序员过关斩将--小小的分页引发的加班血案

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐量?

●程序员修神之路--?分布式高并发下Actor模型如此优秀?

●程序员过关斩将--论商品促销代码的优雅性

●程序员过关斩将--你的面向接口编程一定对吗?

●程序员修神之路--高并发下为什么更喜欢进程内缓存

●程序员修神之路--高并发优雅的做限流

程序员修神之路--高并发系统设计负载均衡架构相关推荐

  1. 程序员修神之路--高并发优雅的做限流(有福利)

    点击上方蓝色字体,关注我们 菜菜哥,有时间吗? YY妹,什么事? 我最近的任务是做个小的秒杀活动,我怕把后端接口压垮,X总说这可关系到公司的存亡 简单呀,你就做个限流呗 这个没做过呀,菜菜哥,帮妹子写 ...

  2. 程序员修神之路--高并发下如何缩短响应时间

    点击上方"蓝字"带你去看小星星 菜菜哥,请你看电影呀,但是得帮我一个忙 好呀,看什么? 哥斯拉2:怪兽之王 看过了~ X战警:黑凤凰 看过了 追龙2和黑衣人呢? 都看过了,你说帮什 ...

  3. 程序员修神之路--高并发下为什么更喜欢进程内缓存

    菜菜哥,告诉你一个好消息 YY妹子,什么好消息,你有男票了? 不是啦,我做的一个网站,以前经常由于访问量太大而崩溃,现在我加上了缓存,很稳定啦 加的什么缓存呢? 我用的redis,号称业界最快的缓存组 ...

  4. 多个容器一起打包_程序员修神之路容器技术为什么会这么流行(记得去抽奖)

    菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗 docker可很流行呀 kubernetes是容器编排技术,容器不就是指的docker吗? docker可不等于容器哦, ...

  5. 程序员修神之路--晦涩难懂的CAP,是否完全正确?

    微信搜一搜 架构师修行之路 菜菜哥,帮忙解决一个问题 是不是面试又被虐了? 是的呢,这次面试官问我什么是CAP? 这个可就说来话长了...... 01 PART CAP 说到CAP,首先不能不说分布式 ...

  6. 程序员修神之路--简约而不简单的分布式通信基石

    点击"蓝字"关注,领取架构书籍 菜菜哥,请教一个问题呗 面试又被卡住了? 还是你了解我呀,tcp协议面向连接是怎么回事呢? 这个说详细起来,那本好几百页的tcp协议的书籍你倒是可以 ...

  7. 程序员修神之路--分布式系统设计理念这么难学?

    点击"蓝字"关注我们吧 福利:有件小事想和大家说一下 菜菜哥,问你个问题,为什么现在的系统都设计为分布式系统呢? 这个问题问得好,就像为什么程序员会慢慢脱发一样神奇 01 PART ...

  8. 程序员修神之路--打通Docker镜像发布容器运行流程

    菜菜哥,我看了一下docker相关的内容,但是还是有点迷糊 还有哪不明白呢? 如果我想用docker实现所谓的云原生,我的项目该怎么发布呢? 这还是要详细介绍一下docker了 Docker 是一个开 ...

  9. 程序员修神之路--容器技术为什么会这么流行(记得去抽奖)

    菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗 docker可很流行呀 kubernetes是容器编排技术,容器不就是指的docker吗? docker可不等于容器哦, ...

最新文章

  1. 开源人工智能使用卷积网格自动编码器生成3D面部
  2. TextView及其子类
  3. android复制链接到粘贴板,Android复制粘贴到剪贴板
  4. head first python 第二版 中文版-Head First Python 中文版
  5. Windows性能查看器:系统的性能信息(I/O,IIS最大连接数,Sql) ,以及解决 asp.net IIS 一二百多用户并发...
  6. PHP的构成及生命周期
  7. lucene学习之helloworld(简单实例)
  8. php属于复合型人才,【PHP】我国薪水上涨最快的行业
  9. how to get keyboard key with non blocking in terminal
  10. Docker容器中安装JDK
  11. 微型计算机应用领域思维导图,思维导图作用和应用领域有哪些
  12. Android USB Camera(2) : UVC协议分析
  13. TeeChart基础使用手册
  14. [现代控制理论]6_稳定性_李雅普诺夫_Lyapunov
  15. Elasticsearch写入webshell漏洞(WooYun-2015-110216)
  16. 三年级计算机帮助我们学本领,三年级作文学本领40
  17. Unity5 UI.Text 引发Canvas.SendWillRenderCanvases很卡的问题
  18. AllenNLP—笔记—json
  19. XLORE2:大规模跨语言知识图谱构建与应用
  20. C语言的va_list使用方法

热门文章

  1. c语言 程序延时 校准,c语言实现系统时间校正工具代码分享
  2. ubuntu列出所有磁盘_列出Ubuntu上的磁盘空间使用情况
  3. centos proftp_在CentOS上禁用ProFTP
  4. 如何使用智能铃声避免在Android中令人尴尬的大声铃声
  5. 汉克尔变换matlab,HankelTransform
  6. CentOS 7安装nginx+php+mysql环境
  7. 《Hadoop大明白》【1】Hadoop的核心组件
  8. 解决windows系统80端口被占用问题
  9. WiFi行业将走向何方?
  10. leetcode 104. Maximum Depth of Binary Tree