用大白话聊聊分布式系统
来源:互联网 发布:蚁群算法的实现 编辑:程序博客网 时间:2024/06/16 09:07
什么是分布式系统一提起“分布式系统”,大家的第一感觉就是好高大上啊,深不可测,看各类大牛关于分布式系统的演讲或者书籍,也大多是一脸懵逼。本文期望用浅显易懂的大白话来就什么是分布式系统、分布式系统有哪些优势、分布式系统会面临哪里挑战、如何来设计分布式等方面的话题来展开讨论。
关于“分布式系统”的定义,我们先看下老外是怎么说的。《分布式系统原理和范型》一书中是这样定义分布式系统的:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统”。
关于这个定义,我们直观的感受就是:
首先,这种系统相对来说比较牛逼,起码由好几台主机组成。以谷歌、亚马逊等服务商而言,他们的数据中心都由上万台主机支撑起来的。
其次,虽然很牛逼,但对于外人来说,是感觉不到这些主机的存在。也就是说,我们只看到是一个系统在运作。以最近的“亚马逊 S3 宕机事件”为例,平时,我们压根不知道亚马逊所提供的服务背后是由多少台主机组成,但是等到 S3 宕机才知道,这货已经是占了互联网世界的半壁江山了。
从进程角度看,两个程序分别运行在两个台主机的进程上,它们相互协作最终完成同一个服务(或者功能),那么理论上这两个程序所组成的系统,也可以称作是“分布式系统”。
当然,这个两个程序可以是不同的程序,也可以是相同的程序。如果是相同的程序,我们又可以称之为“集群”。所谓集群,就是将相同的程序,通过不断横向扩展,以提高服务能力的方式。
“分布式系统”和“集群”的定义够都简单吧。
(图片选自《分布式系统常用技术及案例分析》)
分布式系统有哪些优势
那么,为啥我们要用分布式系统?
说起分布式系统,我们就不得不说下分布式系统的祖先——集中式系统。集中式系统跟分布式系统是完全相反的两个概念。集中式系统就是把所有的程序、功能都集中到一台主机上,从而往外提供服务的方式。
集中式系统最容易理解了。比如,我们主机的PC电脑,或者手机,我们把各种软件都安装在一台机子上,当我需要什么功能,我就从这台机子上去获取。再比如,我们在学生时代做的课程设计或者开发时的小应用,我们把Web服务器、数据库等都会安装到一台电脑上。好处是,易于理解、方便维护,想要的东西我都放到了一个地方,东西好找啊。当然弊端也是显而易见的,如果这台机子崩了,或者硬盘坏了,那相当与整个系统就奔溃了,而且如果备份也是在这个硬盘上,那相当于招了灭顶之灾。
所以巴菲特有个关于投资的名言,就是“不要把鸡蛋放在一个篮子里”。对于系统而言也是如此。厂商的机子不可能永远保证永远不坏,我们也无法保证黑客不会来对我们的系统搞基,最为关键的是,我们自己无法保证自己的程序不会出bug。所以问题无法避免,错误也不可避免。我们只能鸡蛋分散到不同的篮子里,来减轻一锅端的风险。这就是为什么需要分布式系统的原因。
使用分布式系统的另外一个理由是可扩展性。毕竟任何主机(哪怕是小型机、超级计算机)都会有性能的极限。而分布式系统可以通过不断扩张主机的数量以实现横向水平性能的扩展。大家也都了解到 Google 的服务器主机,大多是淘汰的二线机子拼凑的吧。
分布式系统会面临哪里挑战
毫无疑问,分布式系统对于集中式系统而言,在实现上会更加复杂。分布式系统将会是更难理解、设计、构建 和管理的,同时意味着应用程序的根源问题更难发现。
设计分布式系统时,经常需要考虑如下的挑战:
异构性:分布式系统由于基于不同的网络、操作系统、计算机硬件和编程语言来构造,必须要考虑一种通用的网络通信协议来屏蔽异构系统之间的差异。一般交由中间件来处理这些差异。
缺乏全球时钟:在程序需要协作时,它们通过交换消息来协调它们的动作。紧密的协调经常依赖于对程序动作发生时间的共识,但是,实际上网络上计算机同步时钟的准确性受到极大的限制,即没有一个正确时间的全局概念。这是通过网络发送消息作为唯一的通信方式这一事实带来的直接结果。
系统如何拆分为子系统?
如何规划子系统间的通信?
通信过程中的安全如何考虑?
如何让子系统可以扩展?
子系统的可靠性如何保证?
数据的一致性是如何实现的?
当然,本文也只是抛砖引玉,不可能面面俱到。望各位读者有不同的见解,欢迎讨论。
参考文献
《分布式 Java》:https://github.com/waylau/distributed-java
《分布式系统常用技术及案例分析》:https://github.com/waylau/distributed-systems-technologies-and-cases-analysis
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊分布式系统
- 用大白话聊聊JavaSE
- 聊聊分布式系统
- 聊聊分布式事务&分布式系统事务一致性解决方案
- 聊聊分布式事务&分布式系统事务一致性解决方案
- 聊聊Python用rpc实现分布式系统调用的那些事
- 聊聊Python用rpc实现分布式系统调用的那些事
- 聊聊分布式事务
- 聊聊分布式事务
- 聊聊分布式事务
- 制作nginx+php的docker镜像方法
- Java中抽象类和接口中有构造方法吗?
- CAReplicatorLayer的使用
- Java实现-最小子串覆盖
- CentOS7安装mysql
- 用大白话聊聊分布式系统
- 一个好的PS笔刷(笔触)下载论坛
- python 读取并显示图片的两种方法
- SVN clean up失败或是lock等问题解决方案
- Qt基本图形绘制
- java的thsi关键字用法
- linux下 段错误的定位
- Error:ProGuard: (Unsupported class version number [52.0] (maximum 51.0, Java 1.7)))
- char数组初始化