用大白话聊聊分布式系统

原文同步至https://waylau.com/talk-about-distributed-system/

一提起“分布式系统”,大家的第一感觉就是好高大上啊,深不可测,看各类大牛关于分布式系统的演讲或者书籍,也大多是一脸懵逼。本文期望用浅显易懂的大白话来就什么是分布式系统、分布式系统有哪些优势、分布式系统会面临哪里挑战、如何来设计分布式等方面的话题来展开讨论。

什么是分布式系统

关于“分布式系统”的定义,我们先看下老外是怎么说的。《分布式系统原理和范型》一书中是这样定义分布式系统的:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统”。

关于这个定义,我们直观的感受就是:

  • 首先,这种系统相对来说比较牛逼,起码由好几台主机组成。以谷歌、亚马逊等服务商而言,他们的数据中心都由上万台主机支撑起来的。
  • 其次,虽然很牛逼,但对于外人来说,是感觉不到这些主机的存在。也就是说,我们只看到是一个系统在运作。以最近的“亚马逊 S3 宕机事件”为例,平时,我们压根不知道亚马逊所提供的服务背后是由多少台主机组成,但是等到 S3 宕机才知道,这货已经是占了互联网世界的半壁江山了。

从进程角度看,两个程序分别运行在两个台主机的进程上,它们相互协作最终完成同一个服务(或者功能),那么理论上这两个程序所组成的系统,也可以称作是“分布式系统”。

当然,这个两个程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我们又可以称之为“集群”。所谓集群,就是将相同的程序,通过不断横向扩展,以提高服务能力的方式。

“分布式系统”和“集群”的定义够都简单吧。

分布式系统有哪些优势

那么,为啥我们要用分布式系统?

说起分布式系统,我们就不得不说下分布式系统的祖先——集中式系统。集中式系统跟分布式系统是完全相反的两个概念。集中式系统就是把所有的程序、功能都集中到一台主机上,从而往外提供服务的方式。

集中式系统最容易理解了。比如,我们主机的PC电脑,或者手机,我们把各种软件都安装在一台机子上,当我需要什么功能,我就从这台机子上去获取。再比如,我们在学生时代做的课程设计或者开发时的小应用,我们把Web服务器、数据库等都会安装到一台电脑上。好处是,易于理解、方便维护,想要的东西我都放到了一个地方,东西好找啊。当然弊端也是显而易见的,如果这台机子崩了,或者硬盘坏了,那相当与整个系统就奔溃了,而且如果备份也是在这个硬盘上,那相当于招了灭顶之灾。

所以巴菲特有个关于投资的名言,就是“不要把鸡蛋放在一个篮子里”。对于系统而言也是如此。厂商的机子不可能永远保证永远不坏,我们也无法保证黑客不会来对我们的系统搞基,最为关键的是,我们自己无法保证自己的程序不会出bug。所以问题无法避免,错误也不可避免。我们只能鸡蛋分散到不同的篮子里,来减轻一锅端的风险。这就是为什么需要分布式系统的原因。

使用分布式系统的另外一个理由是可扩展性。毕竟任何主机(哪怕是小型机、超级计算机)都会有性能的极限。而分布式系统可以通过不断扩张主机的数量以实现横向水平性能的扩展。大家也都了解到 Google 的服务器主机,大多是淘汰的二线机子拼凑的吧。

分布式系统会面临哪里挑战

毫无疑问,分布式系统对于集中式系统而言,在实现上会更加复杂。分布式系统将会是更难理解、设计、构建 和管理的,同时意味着应用程序的根源问题更难发现。

设计分布式系统时,经常需要考虑如下的挑战:

  • 异构性:分布式系统由于基于不同的网络、操作系统、计算机硬件和编程语言来构造,必须要考虑一种通用的网络通信协议来屏蔽异构系统之间的差异。一般交由中间件来处理这些差异。
  • 缺乏全球时钟:在程序需要协作时,它们通过交换消息来协调它们的动作。紧密的协调经常依赖于对程序动作发生时间的共识,但是,实际上网络上计算机同步时钟的准确性受到极大的限制,即没有一个正确时间的全局概念。这是通过网络发送消息作为唯一的通信方式这一事实带来的直接结果。
  • 一致性:数据被分散或者复制到不同的机器上,如何保证各台主机之间的数据的一致性将成为一个难点。
  • 故障的独立性:任何计算机都有可能故障,且各种故障不尽相同。他们之间出现故障的时机也是相互独立的。一般分布式系统要设计成被允许出现部分故障而不影响整个系统的正常使用。
  • 并发:分布式系统的目的,是为了更好的共享资源。那么系统中的每个资源都必须被设计成在并发环境中是安全的。
  • 透明性:分布式系统中任何组件的故障、或者主机的升级、迁移对于用户来说都是透明的,不可见的。
  • 开放性:分布式系统由不同的程序员来编写不同的组件,组件最终要集成成为一个系统,那么组件所发布的接口必须遵守一定的规范且能够被互相理解。
  • 安全性:加密用于给共享资源提供适当的保护,在网络上所有传递的敏感信息,都需要进行加密。拒绝服务攻击仍然是一个有待解决的问题。
  • 可扩展性:系统要设计成随着业务量的增加,相应的系统也必须要能扩展来提供对应的服务。

如何来设计分布式

设计分布式系统的本质就是“如何合理将一个系统拆分成多个子系统部署到不同机器上”。所以首要考虑的问题是如何合理的将系统进行拆分。由于拆分后的各个子系统不可能孤立的存在,必然是通过网络进行连接交互,所以它们之间如何通信变得尤为重要。当然在通信过程要识别“敌我”,防止信息在传递过程中被拦截和窜改,这就涉及到安全问题了。分布式系统要适应不断增长的业务需求,那么就需要考虑其扩展性。分布式系统还必须要保证可靠性和数据的一致性。

概况起来,在设计分布式系统时,应考虑以下几个问题:

  • 系统如何拆分为子系统?
  • 如何规划子系统间的通信?
  • 通信过程中的安全如何考虑?
  • 如何让子系统可以扩展?
  • 子系统的可靠性如何保证?
  • 数据的一致性是如何实现的?

实际上,上面的每一个问题都不是简单的问题。还好,我们要感谢开源,让这个时代的技术可以共享,让实现复杂系统的成本越来越低。比如,我们在设计通信时,我们可以采用面向消息的中间件,比如Apache ActiveMQ、RabbitMQ、Apache RocketMQ、Apache Kafka等,也有类似与 Google Protocol Buffer、Thrift等 RPC框架。在设计分布式计算时,我们分布式计算可以采用 MapReduce、Apache Hadoop、Apache Spark 等。在大数据和分布式存储方面,我们可以选择 Apache HBase、Apache Cassandra、Memcached、Redis、MongoDB等。在分布式监控方面,常用的技术包括Nagios、Zabbix、Consul、ZooKeeper等。

当然,本文也只是抛砖引玉,不可能面面俱到。望各位读者有不同的见解,欢迎讨论。

参考文献

时间: 2024-12-29 07:42:02

用大白话聊聊分布式系统的相关文章

用大白话告诉你啥是Java开发

Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现均支持Java applet. 经过了多年的发展,Java早已由一门单纯的计算机编程语言,演变为了一套强大的技术体系.是的,什么是Java,我想技术体系四个字应该是最好的概括了吧. 用大白话

用大白话扯扯那"神奇"的面向对象编程思维

前言: 每当提到面向对象的时候,初学者肯定都是一脸懵逼的状态,到底什么是面向对象?会用面向对象后有什么牛逼之处吗?不会用是不是就会死掉?答案肯定不会死掉,我们可以来简单的举一 个栗子 1.当你想到熊猫的时候你想到了什么? 答:"国宝" 2.当你看到"国宝"穿上衣服的时候你想到了什么名字? 答:"功夫熊猫"; 其实你可以理解成面向对象就是一种武功!你可以想象一下会武功和不会武功的人有什么区别?"走路带风.飞檐走壁.不食人间烟火.让妹子一看

用大白话揭开Ajax长轮询(long polling)的神秘面纱

在看这篇Ajax长轮询之前可以先看看Ajax轮询技术(没有长),有助于理解: Ajax长轮询属于Ajax轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快. "不间断的通过Ajax查询服务端". 来,小二,先上代码~: Reception.html //客户端 <html> <head> <title></title> <script src="http://lib.sinaapp.com/js/jqu

【面向对象】用大白话扯扯那&quot;神奇&quot;的面向对象之属性继承(三)------【凡尘】

1.继承概念 说到继承我们第一时间想到的是什么东西? 我第一时间想到的是继承父亲的亿万家产,从小我就一直在暗示自己,我是一个来自全国排行前100的首富家庭,我现在受的所有的苦和所有的坎坷都是父亲给我安排的,都是为了让让更好的磨练,今后好让我继承家业!直到现在,我还坚信这个想法,如果父亲还没有让我继承家业只是时机还未到.....好了我们先不意淫,当第一想到继承的时候肯定我们想到的是继承父亲已有的东西. 那么代码里面的东西我们也可以理解成子级继承父级已有的属性和方法 今天我们首先说下属性继承,方法继

用大白话告诉你ArrayList的底层原理

一.ArrayList的数据结构 ArrayList的底层数据结构就是一个数组,数组元素的类型为Object类型,对ArrayList的所有操作底层都是基于数组的. 二.ArrayList的线程安全性 对ArrayList进行添加元素的操作的时候是分两个步骤进行的,即第一步先在object[size]的位置上存放需要添加的元素:第二步将size的值增加1.由于这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境下是线程不安全的. 具体举例说明:在单线程运行的情况下

用大白话讲一致性Hash算法在Redis分布式中的使用

在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景. 1 .场景描述 假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号.1号.2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力.也就是说,我们希望每台服务器能够缓存1万张左右的图片,那么,我们应该怎样做呢?如果

用大白话告诉你 :Java 后端到底是在做什么?

阅读本文大概需要 6 分钟. 作者:黄小斜 新手程序员通常会走入一个误区,就是认为学习了一门语言,就可以称为是某某语言工程师了.但事实上真的是这样吗?其实并非如此. 今天我们就来聊一聊,Java 开发工程师到底开发的是什么东西.准确点来说,Java后端到底在做什么? 大家都知道 Java 是一门后端语言,后端指的就是服务端,服务端代码一般运行在服务器上,通常我们运行Java 程序的服务器都是 Linux 服务器. 这些服务器在互联网公司中一般放在一个叫做机房的地方里,于是像我们这类 Java 程

3分钟Tips:用大白话告诉你什么是低耦合|高内聚

1.高内聚 首先我们来看看内聚的含义:软件含义上的内聚其实是从化学中的分子的内聚演变过来的,化学中的分子间的作用力,作用力强则表现为内聚程度高.在软件中内聚程度的高低,标识着软件设计的好坏. 我们在进行架构设计时的内聚高低是指,设计某个模块或者关注点时,模块或关注点内部的一系列相关功能的相关程度的高低. 例如:下单模块: 一般情况下,下单模块都会有如下的信息,订单的信息,产品的信息及谁下的单(买家信息).这是基本的,那么我们设计的时候就要把相关的功能内聚到一起.当然这是从大功能(下单管理)上来说

分布式领域攻与伐(0/9)(切开分布式)

我最初接触到分布式是菜鸟网络的一个高级技术管理人员的.... 抱歉,最烦这类废话,直接跳过.(who cares? 直接上重点) 困惑 不知道从哪里下口?! 看了好些知乎学院派对于 "分布式" 领域(注意是笼统的分布式)的介绍与"抛砖引玉",然后我发现自己更不理解了,不是论文就是研究,其实我只是关心工程方面的技术实践,说白了我想要的是落地的方案,实践,是真金白银相关的,商业项目相关的,而不是还停留在理论研究上的. 当然也有大佬,小姥们讲解了工程技术相关的,比如分布式