拜托,别再问怎么深入学习分布式架构了!-程序员宅基地

技术标签: python  java  运维  

由于分布式系统所涉及到的领域众多,知识庞杂,很多新人在最初往往找不到头绪,不知道从何处下手来一步步学习分布式架构。

本文试图通过一个最简单的、常用的分布式系统,来阐述分布式系统中的一些基本问题。

  • 负载均衡
  • 分布式缓存
  • 分布式文件系统/CDN
  • 分布式RPC
  • 分布式数据库/Nosql
  • 分布式消息中间件
  • 分布式session问题 
    -总结

下图为一个中大型网站/App的基本架构: 
这里写图片描述

在这个架构中,涉及到以上所列的基本问题:

负载均衡

负载均衡是分布式系统中的一个最最基本的问题。在上图中:

网关需要把请求分发给不同的Tomcat; 
Tomcat需要把收到的请求,分发给不同的Service;

这都需要负载均衡。一句话:凡是请求从一个入口进来,需要分发给后端不同的机器时,就需要负载均衡。

局域网负载均衡

在上图中,负载均衡发生在局域网内部。在这里,常用的网关软件有Nginx/HAProxy/F5/LVS/各种云上的SLB等。

广域网负载均衡

在上图之外,还有广域网负载均衡。这通常发生在域名服务器上,而不是局域网内部。 
同1个域名,映射到不同的局域网集群。

负载均衡算法

常用的负载均衡算法:随机,轮询(Round Robin),最小资源数,hash。

分布式缓存

在上图中,当DB负载过高,我需要为Service机器加缓存时,就遇到一个基本问题: 
如果使用local的内存做缓存,则其他Service机器就没办法共用此缓存。 
因次,我需要一个可以让所有Service机器共享的缓存,这就是分布式缓存。

常用的分布式缓存组件:Memcached/Redis/Tair等

分布式文件系统

在上图中,当我要存储客户端上传的图片文件时,就会遇到另一个基本问题:我不能把图片存在每个Tomcat的本地文件系统里面,这样的话,其他机器就没办法访问了。我需要一个让所有机器可以共享的文件系统,这就是分布式文件系统。

常用的分布式文件系统:MogileFS/TFS/HDFS/Amazon S3/OpenStack Swift等

当使用了分布式文件系统,对外提供图片url访问服务时,就会遇到另一个基本问题:如果每次文件的访问,都要到分布式文件系统里面去取,效率和负载就可能成为问题。 
为此,就需要引入CDN。

常用的CDN厂商,比如ChinCache。当然,现在的各种云存储,比如七牛云,阿里云,腾讯云,已经自带了CDN。

分布式RPC

分布式系统的一个基本问题就是:机器与机器之间如何通信? 我们都知道底层原理是TCP/IP,Socket。

但一般很少有人会去裸写Socket,实现机器之间的通信。这里,最常用的组件就是RPC。

最简单的实现RPC的方式就是使用http。当然,业界有很多成熟的开源RPC框架,如Facebook的Thrift, 阿里的Dubbo,点评的Pigeon。。

在RPC内部,一般都自己实现了负载均衡。还有更复杂的,如多版本,服务降级等。

补充一句:虽然底层原理都是Socket,但使用不同框架/组件时,通常都有其自己的跨机器通信方式,比如MySQL JDBC,RPC, 消息中间件等。

分布式数据库

在上图中,DB是单一节点。当访问量达到一定程度,就会涉及到mysql的分库分表问题。

分库/分表之后,就会涉及到join的问题,分布式事务的问题。

关于分库分表,业界也早有成熟方案。对上层屏蔽分库分表,sql的执行,像是在单库一样。

还有像MongoDB这种Nosql数据库,天生是分布式的。但同样会面对Mysql分库分表所要面对的问题。

还有像阿里的OceanBase,有Mysql的强一致性保证,又是分布式的,还可以支持分布式事务。

分布式消息中间件

在上图中,没有提及到消息中间件。相对其他基本问题,这个需要一个更适合的业务场景来谈,在以后的章节中,会再详述。

常用的消息中间件,比如老一辈的ActiveMQ/RabbitMQ, 新一点的,阿里的RocketMQ,LinkedIn的Kafka等。

消息中间件的一个典型场景就是:通过最终一致性,解决上面的分布式事务问题。

分布式session问题

在传统的单机版应用中,我们经常使用session。而当单机扩展到多机,单机的session就没办法被其他机器所访问。

此时就需要使用分布式session,把session存放在一个所有Tomcat都可以访问的地方。

关于分布式session,业界早有成熟方案,在此不再详述。

总结

本文罗列了分布式系统的各种基本问题和业界常用的技术,希望建立起分布式系统的一个宏观图谱。

文中的内容有没有学习资料?

欢迎加裙725219329,一起学习,相互讨论。

群内已经有小伙伴将知识体系整理好(源码,PPT,学习视频),欢迎加群免费领取。

分享给喜欢的Java的,喜欢编程,有梦想成为架构师的程序员们,希望能够帮助到你们。

 

 

转载于:https://my.oschina.net/u/3779583/blog/2250935

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33690963/article/details/92409893

智能推荐

python 从文件中读取数字,并求取每一行相应的和_python读取txt文件,每一行的第一列和第二列相加输出到第三列-程序员宅基地

文章浏览阅读2w次,点赞4次,收藏33次。with open("2.txt","r") as f: sum=0 for line in f:#遍历每一行 wordlist=line.split()#将每一行的数字分开放在列表中 for a in wordlist:#遍历每一行的数字 number=int(a) sum=sum+number#求和 print("the ..._python读取txt文件,每一行的第一列和第二列相加输出到第三列

pandas DataFrame Series数据操作总结_series加名字-程序员宅基地

文章浏览阅读1.7k次。pandas库是一个专门为数据分析创建的库函数,分为DataFrame和Series两类数据的操作。DataFrame可是视为二维矩阵+label;Series可以视为列+label因此,所有的函数都是围绕数据+label展开的。1、Series相关操作Series是什么?其实就是值+索引的形式,和字典很像。因此,所有操作其实都是对值和索引的引申。1.1、 Series创建..._series加名字

测试基于STM32的ADIS16405评估板,并在匿名四轴上实时显示3轴陀螺仪+3轴加速度计+3轴磁力计 波形。本文最后还公开一个基于C# 的串口波形显示客户端源码。_adis16460 陀螺仪 评估板-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏19次。标题:测试基于STM32的ADIS16405评估板,并在匿名四轴上实时显示3轴陀螺仪+3轴加速度计+3轴磁力计 波形。本文最好还公开一个基于C# 的串口波形显示客户端源码。 这里附上该评估板的原理图和PCB图。图片可以放大看,看不清不要紧我把PDF格式附上去的:该评估板内部已经刷了固件。这里也分享下HEX固件可以自己在STM32CubeProgrammer用 STLI..._adis16460 陀螺仪 评估板

开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?-程序员宅基地

文章浏览阅读99次。As long as you can still grab a breath, you fight.只要一息尚存,就不得不战。有那么一段时间,我特别迷恋金山词霸的每日一句分享海报。因为不仅海报上的图片美,文字也特别美,美得让我感觉生活都有了诗意。就像文章开头的那句中英文对照,中文和英文都妙极了。最近,又有很多人迷恋上了流利说的小程序分享海报(朋友圈比比皆是)。但不管是金山词..._开源 海报 java

Android应用之间的跳转以及参数的传递_android 接手第三方 跳转参数-程序员宅基地

文章浏览阅读2.6k次。/** * @param v 设置按钮点击事件 */ @Override public void onClick(View v) { super.onClick(v); switch (v.getId()) { case R.id.tv_content://跳转点击事件 //ComponentName 做..._android 接手第三方 跳转参数

c#面向对象与程序设计第三版第三章例题代码_实用C语言编程(第三版)高清PDF...-程序员宅基地

文章浏览阅读129次。编写C 程序不仅仅需要语法正确,最关键的是所编代码应该便于维护和修改。现在有很多介绍C 语言的著作,但是本书在这一方面的确与众不同,例如在讨论C中运算优先级时, 15种级别被归纳为下面两条原则:需要的朋友关注后私信我,大量优质电子资料分享!关注我,为你提供更多电子学习资料!如果感觉好记得点赞哦!- 先乘除,后加减;- 在所有该加括号的地方都加上括号第三版除介绍UNIX上的编程工具之外,还介绍了流行..._c#实用第三版

随便推点

过分!虾皮被曝大范围毁约;深度学习技巧全辑;MongoDB开源替代 4.7K★;剑指Offer解题代码;大数据算法笔记汇总;前沿论文 | ShowMeAI资讯日报-程序员宅基地

文章浏览阅读9.6k次。ShowMeAI资讯日报 08-27 期,lm-debugger 检查和调整基于transformer的语言模型、camviz 对单目深度估计结果进行可视化、surgeon-pytorch 检视PyTorch模型中间层、xh 发送HTTP请求、FerretDB 完美替代MongoDB的开源工具、大数据算法基础课·笔记集锦、剑指 Offer解题代码·Python&Java&C++、MedMCQA 医学入学考试问答数据集、深度学习过程加速技巧集、前沿论文…点击获取全部资讯...

vue3 + crypto-js加密解密(普通版本/TS版本)_vue3 crypto-js-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏17次。前言:在vue中使用crypto-js 来实现对密码的加密和解密。vue3:1、安装:npm install crypto-js2、封装方法 aes.jsimport CryptoJS from 'crypto-js'/** * AES 加密 * @param word: 需要加密的文本 * KEY: // 需要前后端保持一致 * mode: ECB // 需要前后端保持一致 * pad: Pkcs7 //前端 Pkcs7 对应 后端 Pkcs5 ..._vue3 crypto-js

AJax+XML+HTML+CSS+DIV+PHP+MYSQL创建网站--Java免费学习网-程序员宅基地

文章浏览阅读654次。AJaxAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML),AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术。使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的

deepin使用crontab自动更换壁纸_deepin系统改变壁纸-程序员宅基地

文章浏览阅读1.2k次。文章目录起因解决方法python脚本crontab无效解决方法个人文件配置示例起因deepin下有自动更换壁纸功能,但是最多间隔1小时且最多自动更换范围为15张图片。解决方法用python脚本更换壁纸,再利用crontab定时执行python脚本完成自动更换壁纸功能。crontab也可定时执行其他sh脚本、python脚本。我也是第一次接触crontab,后将其用于github博客每天自动..._deepin系统改变壁纸

网络安全概论——防火墙原理与设计_描述状态检测防火墙的设计思想与方法-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏5次。防火墙是一种装置,它是由软件/硬件设备组合而成,通常处于企业的内部局域网与 Internet 之间,限制 Internet 用户对内部网络的访问以及管理内部用户访问 Internet 的权限。换言之,一个防火墙在一个被认为是安全和可信的内部网络和一个被认为是不那么安全和可信的外部网络(通常是 Internet)之间提供 一个封锁工具。如果没有防火墙,则整个内部网络的安全性完全依赖于每个主机, 因此,所有的主机都必须达到一致的高度安全水平, 这在实际操作时非常困难。_描述状态检测防火墙的设计思想与方法

feign设置header的正确方式_feign.headers-程序员宅基地

文章浏览阅读2k次。如何正确设置feign header@GetMapping("/xxx")@Headers( {"yyy: 1", "888-666: [email protected]"})DataResponse<zzz> queryxxx(@RequestParam String zz);正确设置:新增配置类import feign.RequestInterceptor;import feign.RequestTemplate;import org.apache.c_feign.headers

推荐文章

热门文章

相关标签