分布式学习路线

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

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

  • 负载均衡
  • 分布式缓存
  • 分布式文件系统/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,但使用不同框架/组件时,通常都有其自己的跨机器通信方式,比如MySQLJDBC,RPC, 消息中间件等。

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

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

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

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

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

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

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

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

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

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

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

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

后续,会针对各个领域,逐个剖析!

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

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

相关文章

洛谷p2704 炮兵阵地

典型的状态压缩题&#xff0c;只是要定义dp[i][j][k]&#xff0c; #include<bits/stdc.h>using namespace std;int n,m,state[1<<10],tot0;int dp[110][66][66],sum[1<<10],mp[110];int getsum(int x){ int cnt0; while(x){ if(x&1) cnt; …

Flask 框架app = Flask(__name__) 解析

1 #!/usr/local/bin/python2 # codingutf-83 4 from flask import Flask5 app Flask(__name__)6 7 app.route(/)8 def hello_world():9 return Hello World! 10 11 if __name__ __main__: 12 app.run(host0.0.0.0,port9000) 第4行&#xff0c;引入Flask类&#x…

发布订阅

发布订阅 在软件架构中&#xff0c;发布订阅是一种消息范式&#xff0c;消息的发送者&#xff08;称为发布者&#xff09;不会将消息直接发送给特定的接收者&#xff08;称为订阅者&#xff09;。而是将发布的消息分为不同的类别&#xff0c;无需了解哪些订阅者&#xff08;如果…

ps 命令

ps 为我们提供了进程的一次性的查看&#xff0c;它所提供的查看结果并不动态连续的&#xff1b;如果想对进程时间监控&#xff0c;应该用 top 工具。kill 命令用于杀死进程。linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的…

python练习题-day8

1、有如下文件&#xff0c;a1.txt&#xff0c;里面的内容为&#xff1a; 老男孩是最好的培训机构&#xff0c; 全心全意为学生服务&#xff0c; 只为学生未来&#xff0c;不为牟利。 我说的都是真的。哈哈 分别完成以下的功能&#xff1a; a,将原文件全部读出来并打印。 with o…

消息中间件应用场景

消息中间件应用场景

IDEA开发vue.js卡死问题

在执行cnpm install后会在node_modules这个文件下面生成vue的相关依赖文件&#xff0c; 这个时候当执行cnpm run dev命令时&#xff0c;会导致IDEA出现卡死的问题&#xff0c;解决方法如下&#xff1a; 转载于:https://www.cnblogs.com/heqiuyong/p/10301925.html

[BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

差分之后就是求多串LCS。 对其中一个串建SAM&#xff0c;然后把其它串放在上面跑。 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度&#xff0c;res[x]是对每次的f[x]取最小值。答案就是res[]的最大值。 考虑f[x]的求法&#xff0c;把s[]放在SAM上跑时&#xff…

点对点

数据传输的可靠性是通过数据链路层和网络层的点对点和传输层的端对端保证的。点对点是基于MAC地址或者IP地址&#xff0c;是指一个设备发数据给另外一个设备&#xff0c;这些设备是指直连设备包括网卡&#xff0c;路由器&#xff0c;交换机。端对端是网络连接&#xff0c;应用程…

none

module.exports {root: true,env: {node: true},extends: [plugin:vue/essential, vue/prettier],rules: {no-console: process.env.NODE_ENV production ? error : off,no-debugger: process.env.NODE_ENV production ? error : off,prettier/prettier: [error,{// tab缩…

MQ消息中间件介绍

消息队列技术是分布式应用间交换信息的一种技术&#xff0c;消息队列可驻留在内存或者磁盘上&#xff0c;队列存储消息直到它们被应用程序读走&#xff0c;通过消息队列&#xff0c;应用程序可以独立的执行—它们不需要知道彼此的位置&#xff0c;或者继续执行前不需要等待接收…

22 块级元素和行内元素

学习的初期&#xff0c;我们就要知道&#xff0c;标准文档流等级森严。标签分为两种等级&#xff1a; 行内元素块级元素比如h1标签和span&#xff0c;同时设置宽高&#xff0c;来看浏览器效果&#xff0c;那么你会发现&#xff1a; 行内元素和块级元素的区别&#xff1a;&#…

节流防抖

https://www.cnblogs.com/fsjohnhuang/p/4147810.html 转载于:https://www.cnblogs.com/smzd/p/10943002.html

P3796 【模板】AC自动机(加强版)

题目描述 有 NNN 个由小写字母组成的模式串以及一个文本串 TTT 。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串 TTT 中出现的次数最多。 输入输出格式 输入格式&#xff1a;输入含多组数据。 每组数据的第一行为一个正整数 NNN &#xff0c;表示共有 NNN…

访问数据库优化

例如&#xff1a;工资表里面有全公司人员的工资信息。 现在我需要把这些工资信息打印成工资条。因此需要访问数据库。 1.把整个表全部读取出来&#xff0c;内存处理每个人的工资信息。 2.按照人员单个查询每个人的工资信息。 分析&#xff1a;第一种情况是将所有的人员全部查询…

psql 命令

&#xff08;1&#xff09;使用命令行连接数据库psql -U postgres -h localhost -p 5433 &#xff08;2&#xff09;列出所有的数据库\l -- 查看所有数据库&#xff08;3&#xff09;进入某个数据库\c name -- name是表名(4)列出数据库的所有数据表和视图\d -- 列出所有的数据…

各种缓存介绍

说起缓存相关技术&#xff0c;老多了&#xff0c; memcache、redis、squid、varnish、web cache、 CDN等等。缓存技术五花八门&#xff0c;但这些技术间有什么共性的地方&#xff0c;又有什么不同的地方呢&#xff1f;答案肯定是有的&#xff0c;这次为大家分享及整理一下缓存方…

CentOS6.8 安装node.js npm

环境&#xff1a;CentOS6.8_X64系统 一、到官方下载最新的编译好的安装文件&#xff0c;目前是6.9.4。 $>cd /usr/local/src #定位到这个目录&#xff0c;下载的文件会在这个目录#使用wget下载&#xff08;这个内置命令&#xff09; $>wget https://nodejs.org/dist/v8.1…

[上下界网络流][二分] Bzoj P2406 矩阵

题目描述 输入输出格式 输入格式&#xff1a; 第一行两个数n、m&#xff0c;表示矩阵的大小。 接下来n行&#xff0c;每行m列&#xff0c;描述矩阵A。 最后一行两个数L&#xff0c;R。 输出格式&#xff1a; 第一行&#xff0c;输出最小的答案&#xff1b; 输入输出样例 输入样…

记录自己的nest学习之旅

.a r 转载于:https://www.cnblogs.com/smzd/p/10978807.html