您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

为什么要有分布式系统?

时间:2019-11-26 13:56:27  来源:  作者:

1

无论是我们在学校刚开始学编程,还是在刚参加工作开始处理实际问题,写出来的程序都是很简单的。因为面对的问题很简单。

以处理数据为例,可能只是把一个几十 K 的文件解析下,然后生成一个词频分析的报告。很简单的程序,十几行甚至几行就搞定了。

直到有一天,给你扔过来 1000 个文件,有些还特别大,好几百 M 了。你用之前的程序一跑,发现跑的时间有点长。于是想要去优化下。

1000 个文件,互相还没业务联系,用多线程呀,一个线程处理一个文件,结果再汇总就搞定了。总算把学校里学的操作系统知识和编程语言里的多线程库都运用起来了。你很高兴,老师知道了也会很欣慰。

如果多线程效果不够好,比如像 Python 的多线程,没法利用多核的威力,那就用多进程。

如果嫌线程和进程切换开销太大,大到影响整体性能 -- 通常就是所谓的 I/O bound 的场景,还可以用协程这类技术。

无论是线程、进程,还是协程,本质上,目的都是为了计算的并行化,解决的是算的慢的问题。

而如果计算量足够大,就算榨干了机器的计算能力,也算不过来,咋办?

一台机器不够,那就多搞几台机器嘛。所以就从多线程/进程/协程的「计算并行化」,进化到了「计算的分布式化」(当然,分布式一定程度上也是并行化)。

漫谈分布式系统:为什么要有分布式系统?

 

2

这还没完,另一方面,如果处理的数据有 10T,而你手上的机器只有 500G 的硬盘,怎么办?

一种办法是纵向扩展,搞一台几十 T 硬盘的机器;另一种是横向扩展,多搞几台机器,分散着放。前者很容易到瓶颈,毕竟数据无限,而一台机器的容量有限,所以在大数据量的情况下,只能选后者。

把数据分散到多台机器,本质上解决的是存不下的问题。

同时,刚才提到计算分布式化后,总不能所以程序都去同一台机器读数据吧,这样效率必然会受到单台机器性能的拖累,比如磁盘 IO、网络带宽等,也就逼着数据存储也要分散到各个机器去了。

基于这两个原因,数据存储也分布式起来了。

3

前面说计算的分布式化的时候,有这么一句话:

一个线程处理一个文件,结果再汇总就搞定了

先做任务的拆分,然后再做结果的合并。本质上就是分治的思想。很显然,分治是个非常通用和应用无关的方法,没有必要每个应用都去实现一遍,做个通用的库就行了,或者装逼点,我们叫它框架

解决这个问题之后,再做好抽象,丰富下功能,定义好 API,基本的样子就出来了。

于是,我们有了一个分布式的计算框架。

 

4

而说存储的分布式化的时候,忽略了一些问题,比如:

  • 怎么拆分数据?以什么粒度拆?
  • 使用方怎么知道哪些数据在哪里?

这些问题的答案也不难:

  • 像前面说的那样以文件为单位去拆分,恐怕不妥。文件大小差距可能很大,不利于数据的均衡分布,需要拆的更细。
  • 为了让使用方知道该去哪台机器拿想要的数据,尤其在数据的切割粒度不再是使用方能理解的文件之后,需要维护一个数据单元和机器/服务位置的映射关系。

当然,问题不只这些,只是举例而已。解决这些问题之后,再加以完善,封装好 API 和服务,一个能存海量数据的框架就有了,或者装逼点,我们叫它引擎。

于是,我们有了一个分布式的存储引擎。

5

分布式存储引擎和分布式计算框架,就是一个分布式系统最基础的组成部分。

广义的分布式系统,当然不只包含这两个东西。但它们是最基础和核心的东西。有了它们,我们就能对海量数据做最基本和通用的处理,而不再被单台机器束缚住。

是的,分布式系统很强大、很有用。但什么时候该用,什么时候又不要高射炮打蚊子呢?

其实也很简单。和分布式系统尝试解决的问题对应起来,就一目了然了:

  • 当你尝试了各种优化方法,还是不能把计算时间降低到一个可接受的程度的时候
  • 当你发现找不到硬盘更大的机器来装下你的数据,或者无法承担这个成本的时候

那很有可能,你需要考虑分布式系统了。

至于多慢叫慢,多大叫大,就区别于应用场景了。

老板每天早上要看的报表,凌晨跑几个小时都能接受;全平台的准实时监控数据,就等不了几个小时了。

同样是做指标统计,几百 G 的用户注册数据可能不算大,但几百 G 的用户行为数据可能就很大了。后者比前者更有可能需要分布式系统,因为增长速度会快一两个数量级。
 

6

一个乍看起来很无厘头,细想又挺值得思考的问题:微服务是不是分布式系统?

类似的问题还有:分库分表+访问中间件的数据库是不是分布式系统?

广义来讲,都可以算是。

狭义来讲,也是从这个系列关注的角度来看,分布式系统是指大数据领域下,以处理海量数据为目的的系统。

当然,分布式系统远不止这么简单的两个分类,也远不止表面上看起来这样随便弄弄就能用好,还有非常多需要考虑和解决的问题,其中很多恰恰是分布式本身带来的问题(听起来很无奈吧),这也是这个系列后面会花大量篇幅去讲的内容。

这样,我们就对开头提到的 What -- 这个东西是什么,也有了基本的认识。

(看吧,先讲 Why,再讲 What,也没有影响我们学习这个东西。我这么组织,也是想借这点来强调开头提到的多思考 Why 的重要性。)

总结:

这个系列文章关注的分布式系统,是指以处理海量数据为目的的多机系统。

我们之所以需要分布式系统,是为了摆脱单机资源的束缚。再具体点,是为了解决这两个问题:

  • 单台机器算的慢,哪怕协程、多线程、多进程全用上
  • 单台机器装不下,哪怕你有再多的钱

实际应用中,分布式系统最基础核心的是两种:

  • 分布式计算框架,用来解决算的慢的问题
  • 分布式存储引擎,用来解决存不下的问题

知道了为什么要有分布式系统,以及什么时候应该用分布式系统。紧接着一个问题就是,分布式系统都是怎么来的,又是谁做出来的呢?



Tags:分布式系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  Tags: 分布式系统  点击:(23)  评论:(0)  加入收藏
分布式一致性算法概要随着各种高并发访问、海量数据处理等应用场景越来越多,为了应对这些使用场景,分布式系统应运而生。分布式系统得以发展,得益于诸多优点,比如:可以避免 单点...【详细内容】
2021-04-13  Tags: 分布式系统  点击:(238)  评论:(0)  加入收藏
分布式系统的经典理论分布式系统从诞生到现在已经有几十个年头了,其中伴随着一些很重要的基础理论,正是这些影响深远的基础理论,奠定了分布式系统的坚实基础,造就了分布式领域的...【详细内容】
2021-04-13  Tags: 分布式系统  点击:(263)  评论:(0)  加入收藏
分布式理论知识1、分布式系统架构1.1基础概念分布式 : 将一个单体项目分成很多个模块,各个模块协同工作,各个模块构成了分布式系统集群:针对单个模块或者单个系统在多台服务器上...【详细内容】
2021-01-28  Tags: 分布式系统  点击:(111)  评论:(0)  加入收藏
一致性问题一致性问题是分布式领域最重要、最基础的问题。一致性/Consistency,是说在有多个服务节点的情况下,执行一些列操作,在约定协议的保障下,使得他们对外的处理结果,能达...【详细内容】
2020-12-15  Tags: 分布式系统  点击:(149)  评论:(0)  加入收藏
在分布式系统,尤其是微服务系统中,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的。在这种情况...【详细内容】
2020-12-11  Tags: 分布式系统  点击:(158)  评论:(0)  加入收藏
现如今可谓是微服务、分布式、IoT(物联网)横行的时代,作为一名开发者始终还是要保持一定的危机意识,特别是在日常的项目开发中,若是有机会接触到一些关于微服务、分布式下的应用...【详细内容】
2020-12-01  Tags: 分布式系统  点击:(114)  评论:(0)  加入收藏
分布式系统如何寻址?通过 RPC 框架,能够解决服务之间的跨网络通信问题,是微服务改造的基础。服务拆分之后,需要维护更多细粒度的服务,这样就涉及到 RPC 客户端服到服务端的 部署...【详细内容】
2020-11-04  Tags: 分布式系统  点击:(103)  评论:(0)  加入收藏
上一篇《CAP》写完之后,我又反复回看了多次,发现最后的一部分表达CAP、ACID、BASE、“BACP(自造)”关系时有一些问题,并且不是很严谨,但是无奈已经发送过的内容,无法支持修改,并且有挺多小伙伴都在私聊我确认细节,这里我来重...【详细内容】
2020-09-16  Tags: 分布式系统  点击:(46)  评论:(0)  加入收藏
介绍OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth...【详细内容】
2020-08-18  Tags: 分布式系统  点击:(65)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条