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

640?wx_fmt=png

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

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

640

640?wx_fmt=jpeg

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

640

640?wx_fmt=jpeg

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

640

640?wx_fmt=jpeg

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

640

640?wx_fmt=jpeg

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

640

640?wx_fmt=jpeg

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

640

640?wx_fmt=jpeg

640?wx_fmt=png

640

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

640?wx_fmt=png

640?wx_fmt=png

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

640?wx_fmt=png

640

负载均衡

640

640?wx_fmt=png

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

640?wx_fmt=png

640

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

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

640?wx_fmt=png

 DNS负载均衡

640

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

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

硬件负载均衡

640

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

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

软件负载均衡

640

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

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

640

应用

640

640

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

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

640?wx_fmt=png


640?wx_fmt=gif

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

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

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

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

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

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

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

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

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

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

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

640?wx_fmt=jpeg

640?wx_fmt=gif


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类欧几里得算法详细推导过程(附带模板)

类欧几里得算法推导 初识 给出三种形式: f(a,b,c,n)∑i0n⌊aibc⌋f(a, b, c, n) \sum_{i 0} ^{n} \lfloor\frac{ai b}{c}\rfloorf(a,b,c,n)∑i0n​⌊caib​⌋g(a,b,c,n)∑i0ni⌊aibc⌋g(a, b, c, n) \sum_{i 0} ^{n}i \lfloor \frac{ai b}{c}\rfloorg(a,b,c…

【Luogu3768】简单的数学题(莫比乌斯反演/杜教筛/欧拉函数)

【Luogu3768】简单的数学题 https://www.cnblogs.com/cjyyb/p/8298339.html

【学习笔记】Docker - 01. Docker是啥

我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。。。1.1 啥是Docker?Docker 是一个开源项目,它被用来做构建、打包和运行程序。它是一个命令行程序,一个后台进程,也是一组使用逻辑方法来解决常见软件问…

使用 .NET CORE 创建 项目模板,模板项目,Template

场景:日常工作中,你可能会碰到需要新建一个全新的解决方案的情况(如公司新起了一个新项目,需要有全新配套的后台程序),如果公司内部基础框架较多、解决方案需要DDD模式等,那么从新起项目到各种依…

【BZOJ4916】神犇和蒟蒻(杜教筛)

【BZOJ4916】神犇和蒟蒻(杜教筛) https://www.cnblogs.com/cjyyb/p/8297338.html 杜教筛技巧

E. Number Challenge

E. Number Challenge 推式子 ∑i1a∑j1b∑k1cσ(ijk)∑i1a∑j1b∑k1c∑x∣i∑y∣j∑z∣k(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑x1a∑y1b∑z1c⌊ax⌋⌊by⌋⌊cz⌋(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑d1aμ(d)∑x1⌊ad⌋⌊adx⌋∑y1⌊bd⌋⌊bdy⌋∑z1c⌊cd⌋(gcd(x,z)1)(gcd(y,z…

时间表(日记)

2021/1/14 今天白天学习还算成功,但是晚饭后拿起手机就开始颓废了,特别是因为听相声实在是无聊而且低俗,所以又忍不住诱惑下载了b站,相比于相声b站的确是有营养的多,但是一旦激起了我的好奇心,尤其是吸引了…

谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

一、前言surging是基于.NET CORE 服务引擎。初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务架构的技术栈,覆盖了从服务注册、服务发现、中…

2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)

K Sum 推式子 Fn(k)∑l11n∑l21n⋯∑lk1n(gcd(l1,l2,…,lk))2∑d1nd2∑l11nd∑l21nd⋯∑lk1nd(gcd(l1,l2,…,lk)1)∑d1nd2∑l11nd∑l21nd⋯∑lk1nd∑t∣gcd(l1,l2,…,lk)μ(t)∑d1nd2∑t1ndμ(t)(ntd)2另Ttd∑T1n(nT)k∑d∣Td2μ(Td)∑i2nFn(i)∑T1n∑i2k(nT)i∑d∣Td2μ(Td)到…

【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)

【BZOJ4028】[HEOI2015]公约数数列 https://www.luogu.com.cn/problem/P4108 求解最靠前的一个位置前缀gcd和前缀异或的乘积恰好等于x,并且要求支持单点修改 首先我们可以发现这个问题没法使用线段树维护,因为不仅前缀没有单调性,而且修改也…

GuGuFishtion(2018 Multi-University Training Contest 7)

GuGuFishtion 推式子 ∑a1m∑b1nϕ(a,b)ϕ(a)ϕ(b)∑a1m∑b1ngcd(a,b)ϕ(gcd(a,b))∑d1mdϕ(d)∑a1md∑b1mdgcd(a,b)1∑d1mdϕ(d)∑a1md∑b1md∑k∣gcd(a,b)μ(k)我们约定n,m&#xff0c;满足n<m∑d1ndϕ(d)∑k1ndμ(k)⌊nkd⌋⌊mkd⌋\sum_{a 1 } ^{m} \sum_{b 1 } ^{n} …

奇淫巧技-Flutter调用C#

前言众所周知&#xff0c;Xamarin应该是.net下的跨平台开发工具。2016年之前还处于收费状态&#xff0c;后被微软收购后开源。但似乎有个现象&#xff0c;开源后的Xamarin发展似乎有些停滞&#xff0c;而且维护Xamarin的团队又很固执不愿变通。社区多次建议UI层应该统一绘图引擎…

【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

【UOJ#33】【UR #2】树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演&#xff0c;那么利用倍数形式&#xff0c;我们只需要求解是i的倍数的对数。 考虑枚举lca&#xff0c;这个问题就和深度有关&#xff0c;那么可以长链剖分&…

.NET World——gPRC概览

官方的定义&#xff1a;gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authen…

51NOD 1220 约数之和(杜教筛)

1220 约数之和 推式子 ∑i1n∑j1nd(i,j)∑i1n∑j1n∑x∣i∑y∣j(gcd(x,y)1)xjy∑d1ndμ(d)∑i1nd∑x∣iix∑j1nd∑y∣jj∑d1ndμ(d)(∑i1nd∑x∣ix)2∑d1ndμ(d)(∑x1nx∑x∣i)2∑d1ndμ(d)(∑x1nxnx)2接下来就是杜教筛求dμ(d)的前缀和&#xff0c;然后再直接分块求∑x1nxnx&…

P4151 [WC2011]最大XOR和路径(线性基)

P4151 [WC2011]最大XOR和路径 对于求解最大异或和路径&#xff0c;首先边可以重复走&#xff0c;最终的结果一定是一条路径和许多环的异或和&#xff0c;因为路径和环之间的边会被走两次&#xff0c;不会被计算&#xff0c;所以我们可以通过dfs树求解所有的环的线性基&#xf…

P6222 「P6156 简单题」(反演 + 积性函数线性筛)

P6156 简单题 推式子 ∑i1n∑j1n(ij)kf(gcd(i,j))gcd(i,j)∑i1n∑j1n(ij)kμ2(gcd(i,j))gcd(i,j)∑d1nμ2(d)dk1∑i1nd∑j1nd(ij)k(gcd(i,j)1)∑d1nμ2(d)dk1∑p1ndp2μ(p)∑i1npd∑j1npd(ij)ktpd,f(n)∑i1n∑j1n(ij)k∑t1nf(nt)tk∑d∣tμ2(d)μ(td)d\sum_{i 1} ^{n} \sum_{…

推荐高质量的公众号,值得跟进学习!

为大家推荐几个高质量的公众号&#xff1a;当你迷茫的时候刷刷这些大公司的牛人所运营的公众号&#xff0c;就可以知道自己的不足&#xff0c;不是仅仅局限于.NET技术之下&#xff0c;通过他们扩展我们的知识宽度&#xff0c;我们可以一起来学习。人工智能爱好者社区专注人工智…

P3733 [HAOI2017]八纵八横(线性基/线段树分治)

P3733 [HAOI2017]八纵八横 这是那道线性基的加强版&#xff0c;现在要求从1节点出发的一条路径异或和最大&#xff0c;并且还要支持修改权值和加边删边。 我们可以直接线段树分治然后将所有修改用vector存下来&#xff0c;然后最后dfs一遍整个线段树&#xff0c;然后每次类似…

.net core redis的全套操作

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。Redis支持主从同步…