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

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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

奇淫巧技-Flutter调用C#

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

.NET World——gPRC概览

官方的定义: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…

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

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

.net core redis的全套操作

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。Redis支持主从同步…

Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题,有时候需要查询的结果中有通俗的讲解,而且最好还能够带上代码 demo,但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术&#xff…

使用Kubectl部署应用

目录 使用Kubectl部署应用 Kubectl部署流程 部署一个简单的Demo网站 使用Kubectl部署应用一旦运行了Kubernetes集群,就可以在其上部署容器化应用程序。因此在开始之前,我们需要先确保集群已经准备就绪,无论是使用Minikube还是kubeadm创建的集…

Docker系列之.NET Core入门(三)

在Docker生态系统中除了上一节所讲解的基本概念,还有其他专业术语,本文我们将一笔带过,同时会开始陆续进入到在.NET Core中使用Docker。专业术语Docker Engine(Docker引擎):客户端 - 服务器应用程序。Docke…

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)通过Blazor使用C#开发SPA单页面应用程序(3)前面学习了Blazor的特点、环境搭建及基础知识,现在我们尝试的做个实际的组件。Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组…

Mercurial黄昏,Bitbucket宣布全面转向Git

源代码托管平台 Bitbucket 宣布将逐步放弃对版本控制系统 Mercurial 的支持。Bitbucket 推出于 2008 年,当时集中式版本控制是比较普遍的,Mercurial 是其中的典型代表,但是当前 Git 才是主流,它已经成为了大部分开源项目的首选版本…

使用 Azure DevTest Lab 搭建云端开发测试环境

点击上方蓝字关注“汪宇杰博客”导语程序员和测试工程师经常需要自己搭环境用于开发和测试目的,这些机器可能只会使用很短一段时间。通常我们会在本机使用 Hyper-V、VMWare 之类的虚拟机产品,或者使用企业IT管理员分配的虚拟机去完成这项工作。然而安装配…

dotNET Core WebAPI 统一处理(返回值、参数验证、异常)

现在 Web 开发比较流行前后端分离现在 Web 开发比较流行前后端分离,我们的产品也是一样,前端使用Vue,后端使用 dotNet Core WebAPI ,在写 API 的过程中有很多地方需要统一处理文档参数验证返回值异常处理本文就说说 API 的统一处理…

.net测试篇之单元测试/集成测试神器Autofixture

autofixture简介有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixture并且它能与moq,rhinomock等框架结合,对单元测试带来的便捷性,可维护性和扩展性更是难以言表,只有用用了…

DotNetCore 3.0 助力 WPF本地化

概览随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能。方便越来越多的国家使用我们中国的应用程序,基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了。实现思路现在…

开源题材征集 + MVCEF Core 完整教程小结

到目前为止,我们的MVCEF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点。下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目。现向园友征集题材,你提需…

对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起

看到一篇公众号文章《2020年什么编程语言最受欢迎,待遇最高?》,其中对C#的描述如下:点击阅读原文,看到这是一篇翻译文章:https://codinginfinite.com/top-programming-languages-2020-stats-surveys/这篇文…

ASP.NET Core on K8S深入学习(6)Health Check

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。预计阅读时间为10分钟。01—关于K8S中的健康监测所谓Health Check,就是健康检查,即防微杜渐。K8S是一个编排引擎可以帮助我们快捷地部署容器集…

关于 .Net Core runtimeconfig 文件说明

项目的bin\debug\netcoreapp${Version}下面能够找到这个${AppName}.runtimeconfig.json文件,简单来说,它就是用来定义应用程序所用的共享框架(.Net Core App)以及运行时选项 的一个文件。一个简单的例子{ "runtimeOptions&q…