如何搞定高并发系统设计?
作者 | 菜菜
责编 | 郭芮
YY妹:菜菜哥,上次你给我讲的分库分表策略对我帮助很大。
菜菜:有帮助就好,上次请我的咖啡也很好喝。
YY妹:不过随着访问量的不断加大,网站我又加了Nginx做负载均衡。
菜菜:哇哦,看来要进阶高级工程师啦。
YY妹:负载均衡也很简单吧,一个Nginx就搞定了!现在可以说我精通负载均衡了吧:)
菜菜:其实负载均衡的内容还有很多......
一个系统发展初期,往往都是单机系统。应用和数据库在一台服务器上,随着业务的发展,访问量的增大,一台服务器性能就会出现天花板,往往已经难以支撑业务量了。这个时候就要考虑把数据库和应用服务器分开,访问继续增加,就会考虑数据库分库分表,应用服务器做负载均衡,其实这也属于分布式系统的一个范畴。
分布式系统的核心概念就是一个“分”字,一台服务器支撑不住,那就两台,三台,四台......当然分之后会带来其他问题,比如最常见的数据一致性问题、调用链监控等问题,不过限于篇幅,这些不在今日的讨论范围内。
很多项目做“分布式”部署提高系统性能,首期采用的往往是负载均衡策略。
负载均衡
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
负载均衡既然属于“分”策略的一种表现形式,就会涉及到任务的分配者,任务执行者,分配算法。这里的任务分配者就是我们常说的负载均衡器,任务执行者就是处理任务的服务器,分配算法就是常说的轮训等分配策略。这里把任务的分配者叫做负载均衡器其实是不正确的,负载均衡器这个概念注重的更多是均匀分配任务,让每个任务的计算单元的任务量达到均衡状态,而现实中任务的分配更多是出于每个计算单元的性能或者业务来考虑。让每个计算单元处理几乎相同数量的任务只是分布式均衡器其中的一部分内容。
以HTTP请求为例,在一个HTTP请求的过程中,其实会遇到有很多负载均衡的过程,一个系统在什么阶段做负载均衡取决于它的请求量,这和常说的QPS/TPS/DAU等有直接关系。假设系统的请求量非常少,其实完全没有必要做负载均衡,当然有时候为了达到高可用的目的也做负载均衡。
那一个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负载均衡了。没有一种方案是完美的,但是可以采用多种方案混用的方式来达到近乎完美的情况。
作者:菜菜,一个奔走在通往互联网更高之路的工程师,热衷于互联网技术。目前就职于某互联网教育公司,应用服务端主要负责人。拥有10年+互联网开发经验,热衷于高性能、高并发、分布式技术领域的研究,主要工作语言为C#和Golang。
声明:本文为作者投稿,版权归其个人所有。
【END】
Python爬虫 | 一条效率高的学习路径
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
热 文 推 荐
☞仅用10天设计的JavaScript,凭什么成为程序员最受欢迎的编程语言?
☞如何攻克 C++ 中复杂的类型转换?
☞马云马斯克激辩:AI 是威胁还是被低估了?
程序员易踩的 9 大坑!
☞99年少年12岁时买下100枚比特币, 如今却将所有积蓄压在一个不知名的代币上,还放话将超越Libra!
强推!阿里数据科学家一次讲透数据中台
☞冠军奖3万元!CSDN×易观算法大赛开赛啦
可惜了,你们只看到“双马会”大型尬聊
☞如何写出让同事无法维护的代码?
你点的每个“在看”,我都认真当成了喜欢
如何搞定高并发系统设计?相关推荐
- linux 网络编程 51cto,Linux服务器开发,2小时搞定高并发网络编程
一.使用多线程处理高并发的弊端 多线程处理高并发是常用同时处理多个并发用户请求的方式,但线程数过多会增加系统的资源消耗(线程本身占用的资源+线程切换带来的系统开销),同时因硬件和软件的限制,操作系统支 ...
- 搞定高并发,岂能不懂Synchronized底层原理?
Synchronized 是 Java 中解决并发问题的一种最常用的方法,也是最简单的一种方法.本文作者将全面剖析 Synchronized 的底层原理. Synchronized 的基本使用 Syn ...
- 面试:高并发系统设计
面试:高并发系统设计 总览 在高并发的情景下进行系统设计, 可以分为以下 6 点: 系统拆分 熔断 降级 缓存 MQ 分库分表 读写分离 ElasticSearch 系统拆分 将一个系统拆分为多个子系 ...
- 高并发系统设计六(池化技术)
来想象这样一个场景,一天,公司 CEO 把你叫到会议室,告诉你公司看到了一个新的商业机会,希望你能带领一名兄弟,迅速研发出一套面向某个垂直领域的电商系统. 在人手紧张,时间不足的情况下,为了能够完成任 ...
- 惨遭腾讯面试官吊打高并发系统设计,回来学习2400小时后成功复仇!
去年的金九银十,我和大多数的同行一样加入了升职涨薪的潮水,我早在2个月前就开始准备,我觉得自己在技术方面完全没有问题,于是这两个月我每天在公司摸鱼2小时,回家刷2小时,前前后后刷了几千到面试题,Lee ...
- 高并发系统设计十六(消息队列削峰)
在前面章节,我们了解了高并发系统设计的三个目标:性能.可用性和可扩展性,而在提升系统性能方面,我们一直关注的是系统的查询性能.也用了很多的篇幅去讲解数据库的分布式改造,各类缓存的原理和使用技巧.究其原 ...
- 高并发系统设计:通用的设计方法及架构分层
1.通用设计方法 高并发系统通用的设计方法为拓展.缓存及异步. Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和 ...
- 接招吧,最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者
接招吧!最强 "高并发" 系统设计 46 连问,分分钟秒杀一众面试者! 谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂 ...
- 接招吧!最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者
谈起 "高并发" 系统设计 相关知识,我想你必须要认知到的一个问题是:它是你获取一线大厂Offer 必不可少的利器!!对于各大公司(比如阿里.腾讯.今日头条等)来说,仅仅懂得CRU ...
最新文章
- XML 特殊字符处理和 CDATA
- 从几十人小药厂走出的惊天抗癌神药
- UVa 1590 - IP Networks
- 不要让中国孩子买的玩具都变成外国货!
- Python应用实战案例-Python协程管理精讲万字长文(建议收藏)
- UART串口通信浅谈之(一)--基础概述
- opencv进阶学习笔记4:ROI和泛洪扩充
- 微型计算机的应用特点,微型计算机的特点及应用
- Parallels Toolbox for mac(PD工具箱合集)
- Python 中Python 为什么要继承 object 类
- 统信UOS家庭版使用体验
- 用一套键盘鼠标同时控制两台电脑
- 有效解决鼠标问题的驱动工具-罗技G502游戏鼠标驱动程序提供下载
- 安卓一键新机_新机速递:vivo S7,如7而至;更有Nokia携手一键直达登场
- openbsd_OpenBSD与Linux,Gentoo与Microsoft相遇
- WDAGUtilityAccount和defaultaccount
- 技能分享 | 麦肯锡教给我的写作武器:如何讲好一句话
- Bootstrap插件(一)——模态框(modal.js)
- 2019年小程序发展优势
- Mybatis测试运行异常之Type interface com.testmybatis.dao.bill.BillMapper is not known to the MapperRegistry.
热门文章
- [SSH] Permissions 0644 for ‘.ssh/id_rsa‘ are too open.
- python--笔记
- 【绘图】matlab绘制图形
- 矩池云通过rsync指令上传文件到服务器网盘
- 第二章 比特币的去中心化的方式
- Dart云平台-DartPad
- 2021-2025年中国云托管服务行业市场供需与战略研究报告
- 计算机中的基础元素,数据结构基础
- 当开源奔向物流,阿里云 PolarDB-X 数据库与韵达携手的背后
- 维基媒体宣布采用 Vue.js 进行前端开发