本文转自: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等。

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

参考文献:

  • 《分布式 Java》:https://github.com/waylau/distributed-java
  • 《分布式系统常用技术及案例分析》:https://github.com/waylau/distributed-systems-technologies-and-cases-analysis

用大白话聊聊分布式系统相关推荐

  1. 转载:用大白话聊聊分布式系统

    转载:http://blog.csdn.net/zhousenshan/article/details/71304922?locationNum=10&fps=1 转载于:https://ww ...

  2. 兄弟,用大白话告诉你小白都能看懂的Hadoop架构原理

    本文来自:石杉的架构笔记 目录 一.前奏 二.HDFS的NameNode架构原理 一.前奏 Hadoop是目前大数据领域最主流的一套技术体系,包含了多种技术. 包括HDFS(分布式文件系统),YARN ...

  3. 用大白话彻底搞懂 HBase RowKey 详细设计

    来源 | 且听_风吟 来源 | CSDN 博客,责编 | Carol 封图 | CSDN 付费下载于东方 IC 前言 RowKey作为HBase的核心知识点,RowKey设计会影响到数据在HBase中 ...

  4. 用大白话彻底搞懂 HBase RowKey 详细设计!

    来源 | 且听_风吟 来源 | CSDN 博客,责编 | Carol 封图 | CSDN 付费下载于东方 IC 前言 RowKey作为HBase的核心知识点,RowKey设计会影响到数据在HBase中 ...

  5. 从k8s集群主节点数量为什么是奇数来聊聊分布式系统

    从k8s集群主节点数量为什么是奇数来聊聊分布式系统 前言 今天简单聊一聊一个小问题,即为什么k8s的集群主节点数量通常是奇数,且3或5个居多? 我们先抛出答案 2467等数量的主节点也是可以的,但是不 ...

  6. 【面向对象】用大白话扯扯那神奇的面向对象编程思维(一)

    前言:每当提到面向对象的时候,初学者肯定都是一脸懵逼的状态,到底什么是面向对象?会用面向对象后有什么牛逼之处吗?不会用是不是就会死掉?答案肯定不会死掉,我们可以来简单的举一 个栗子 1.当你想到熊猫的 ...

  7. 兄弟,用大白话给你讲小白都能看懂的分布式系统容错架构

    点击上方"蓝字", 右上角选择"设为星标" 周一至周五早11点半!精品文章准时送上! 本文来自石杉的架构笔记 目录 (1)TB级数据放在一台机器上:难啊! (2 ...

  8. 左耳朵耗子:聊聊分布式系统架构

    点击关注 InfoQ,置顶公众号 程序员的 8 点技术早餐 作者|陈皓 编辑|杨爽 学习任何技术,善于提纲挈领总是事半功倍.学习分布式系统架构也是如此,只要找到这张网的纲,就能更有效率地做好架构和工程 ...

  9. 干货!用大白话告诉你什么是Mock测试

    初识mock 作为一个动词,mock是模拟.模仿的意思:作为一个名词,mock是能够模仿真实对象行为的模拟对象. 在软件测试中,mock所模拟的对象是什么呢? 它一定不是我们所测试的对象,而是 SUT ...

  10. 用大白话讲解RxJava原理

    近日外媒报道称,Google 其应用商店 Play Store 一次下架了超过 600 个违规 App:其中中国.印度以及新加坡为本次大规模下架 App 开发者前三的国家,来自中国的猎豹移动所开发的 ...

最新文章

  1. 上拉电阻和下拉电阻_硬件基础:下拉电阻和上拉电阻如何工作
  2. jQuery ajax 传递JSON数组到Spring Controller
  3. 厉害了!这支获得国家级荣誉的智能车队
  4. 固定资产的完全报废接口
  5. oracle--number
  6. HDU2178 猜数字【数学计算+水题】
  7. 测试oracle的存储过程,测试技能:在oracle中自用存储过程进行测试数据构造
  8. 增强型的for循环linkedlist_38. 为什么千万别用for循环迭代LinkedList
  9. 饥荒如何修改服务器人数上限,《饥荒联机版》房间人数上限修改图文教程
  10. C++ Primer Plus学习:第十三章
  11. PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space翻译
  12. 阿里企业云邮箱怎么申请?企业云邮箱登录界面在哪?
  13. Airtest网易自动化测试工具
  14. Flan-T5: One Model for ALL Tasks
  15. 【python】RuntimeError: Set changed size during iteration 问题解决
  16. 企业混合多云“芯”体验,上云、用数、赋智“组合拳”
  17. 量化交易 实战第一课 策略入门
  18. MinGW安装包下载及下载失败解决
  19. 基金定投收益计算公式和复利计算公式
  20. 14_JavaScript数据结构与算法(十四)图

热门文章

  1. java的小于等于符号怎么打_「小于符号」mybatis的一些特殊符号标识(大于,小于,等于,不等于) - seo实验室...
  2. 悉尼大学计算机工程专业世界排名,悉尼大学世界排名及专业排名汇总(QS世界大学排名版)...
  3. 北航计算机专硕学硕区别,专硕是什么意思啊?和学硕一样吗?
  4. 【物理】半导体物理 西安电子科技大学 柴常春等主讲-[笔记P11-P14]
  5. [FAQ06649] Latin输入法怎么默认勾选几种语言?
  6. c语言max函数和min,使用函数获取值,查找max,查找min并以C语言显示
  7. 【PCIe总线】-- PCI、PCIE基础知识
  8. PageHelper.startPage()动态排序问题
  9. 中英文电子书下载:https://sobooks.cc/
  10. 计算机教育课题申请报告,课题结项申请报告