发展历史
开始之前
在开始介绍分布式系统之前,我们需要对软件所做的事情进行一个抽象,将其处理的请求、执行的命令称为任务,而完成一个任务需要读取数据 - 处理数据 - 写入数据。这个过程我们在抽象出两个概念:计算和数据。所以我们可以这样理解:
任务 = 计算 + 数据
单机应用程序角度来看:
- 计算:是使用CPU和内存进行运行时数据处理的过程
- 数据:是使用磁盘、网络进行数据读写的操作
分布式应用程序角度来看:
- 计算:是应用程序整体的处理过程,比如一个用户管理模块的应用代码处理部分就是计算
- 数据:是应用程序依赖的各种数据库处理的部分
如果仅从应用程序的视角来看,对数据的读取就是对不同数据源的IO,这个概念模型也可以转换为:
任务 = 计算 + IO
这几种视角都有独特的作用不是简单的概念转换:
在做宏观架构时,应该使用任务 = 计算 + 数据
模型,因为数据本身也代表着一种程序,但特性是IO密集型,可以根据与之匹配的任务的读写特性(读多写少/写多读少)进行选型和架构优化。
在思考对应用程序进行优化时,应用使用任务 = 计算 + IO
,这样思考的着眼点就可以从提高计算效率(比如优化算法复杂度、CPU使用率)和IO效率(优化IO模型、减少IO次数)考虑。
带着这个模型我们可以继续往下看。
单机模式
概念:单机模式就是应用程序和数据库部署在一台服务器上,计算和数据不分离
优点:易于维护
缺点:1)单点失效问题 2)性能存在瓶颈
计算并行 + 数据并行
目的:为了解决性能瓶颈和单点失效问题
概念:首先将数据库和应用代码进行拆分,实现计算和数据分离。然后将相同的应用程序代码部署在不同的服务器上,实现计算并行。将数据库部署在另一个服务器上,并通过读写分离的方式将数据并行。
引出的问题:
- 同步问题:使用读写分离需要考虑主从同步方案
- 负载均衡问题:计算并行后需要一个请求分配规则来决定请求哪个应用程序实例
- 热点数据问题:当有热点数据出现,仍然可能超出数据库的IO上限,需要通过缓存解决
优点:可以利用多个服务器的硬件来提高单位时间内应用整体能够处理的任务数量
缺点:由于同一应用程序中的不同业务模块仍使用同一套硬件资源,因此对于单个复杂请求计算效率较低
子任务并行
目的:提高单个复杂请求的计算效率
概念:将应用程序中的业务模块拆解部署到不同服务器上,将部署了同一业务模块的服务器们视为一个集群。同时将数据库根据业务模块拆分成多个库,部署到不同机器上。这样相当于将一个任务的执行拆解成多个子任务交给不同的应用处理,对于单个请求或者说单个任务就也可以使用多个服务器的硬件资源,实现子任务并行。
优点:提升了性能、扩展性、可用性
缺点:带来了设计上、服务治理上的复杂性
什么是分布式?
将相同或相关的程序放在多台计算机上,实现特定目标的方式。它发展的内驱力是对性能、扩展性、可用性的追求。核心思想是在现有的计算机体系结构下,通过多机部署使用更多的硬件资源
分布式和传统并行计算的区别?
传统并行计算:是从单机角度出发,基于一台服器单个CPU多核心进行并行计算,技术手段是:依托操作系统的多进程和多线程技术
分布式:是从多机角度出发,基于多个服务器的多个CPU进行并行计算,技术手段是:网络 + 分布式协同 + 分布式调度
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。