分布式架构 -- 学习路线图

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

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

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

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

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

负载均衡

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

网关须要把请求分发给不一样的Tomcat; 
Tomcat须要把收到的请求,分发给不一样的Service;数据库

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

局域网负载均衡

在上图中,负载均衡发生在局域网内部。在这里,经常使用的网关软件有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,业界早有成熟方案,在此再也不详述。

总结

本文罗列了分布式系统的各类基本问题和业界经常使用的技术,但愿创建起分布式系统的一个宏观图谱。

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