什么是分布式系统?如何设计和保证高可用?面临哪些挑战?
什么是分布式系统
“分布式系统就是若干的独立的计算机的集合,而这些计算机对于用户来讲就是单个计算机系统”
这其中有两个比较关键的点
- 硬件独立
- 软件统一
那么什么是硬件独立呢?硬件独立是指机器本身的独立。一个大型的分布式系统,是由若干的计算机组成。而软件统一,是指对于用户来讲,在面对这些机器的时候就像是面对着一个系统一样。就好比我们现在经常用到的各地的健康码系统,对于每个人来讲,健康码系统就是一个系统,至于它背后是如何运作的、部署了几台服务器、每台服务器都是干什么的,这些对于用户来讲都是不需要关心的。用户只关心健康码能不能用。
另外,软件的统一是指分布式系统的扩展和升级都比较容易,分布式系统中的某些节点发生故障的时候并不会影响整体系统的可用性。用户和应用程序交互的时候,用户会感觉到某个节点的错误。
集中式系统与分布式系统
集中式系统主要是指一些部署在HP、IBM等小型机器上的服务器中的系统。其将所有的功能都部署到一个主服务器上。这个系统有一个特点就是宕机率很低。这种系统主要用在一些政府类、企业类部门。
这种集中式系统主要流行于20世纪,现在有些企业或者是政府部门使用的这种系统都是沿用原来的软件。这种系统最大的特点就是便于维护、操作简单。但这种系统有个最大的问题就是不出问题还好,一出问题就会造成很大的故障。所有的功能都不能用了。另外这种集中式的系统相关的技术体系都是被少数厂商掌握在手中。这或许也是阿里为什么要去IOE的原因,就是不想依赖与HP、IBM等一些国外的企业。
分布式系统则通过中间件技术对现有的计算机的硬件能力和软件能力进行重新的资源整合。是一种多处理器的计算机系统,各处理器通过网络构成了统一的系统。系统采用分布式计算架构。将原来的中央处理器处理的任务分给各个对应的处理器进行处理。实现不同功能不同的处理器处理,这些处理器之间相互协调,共享系统资源,加快了系统的处理时间和处理速度,同样简化了主机的处理逻辑。如图所示。
如何设计分布式系统?
设计分布式系统,其本质工作就是以一种合理的方式将大的系统拆分成小的系统,并且部署到不同的机器上。所以这样做第一个需要解决的问题就是如何进行系统拆分。因为是将一个大系统进行拆分,所以说各个子系统是不可能独立存在的,势必要通过网络的方式进行交互。所以这些系统之间的交互就变得尤为重要。既然要进行子系统的交互那么就需要这些子系统之间能相互识别。这样可以防止信息被拦截,信息被篡改等问题。既然需要进行系统拆分,那么不得不考虑的一点就是系统的扩展性问题。概括起来就是如下一些问题。
- 如何将系统拆分成子系统?
- 如何规划子系统之间的通信?
- 如何考虑通信过程中的安全问题?
- 如何进行系统扩展
- 如何高正高可用?
- 如何保证数据一致性?
分布式系统面临的挑战
分布式系统最难的点就是如何进行设计?设计好之后如何进行实施?实施之后如何进行管理。因为引入众多机器,所以造成的系统复杂性提升。使得遇到一个问题之后,问题的查找就成了最大的问题。另外就是如何保证高可用?
- 差异性:由于分布式系统是基于不同的OS环境、不同的网络环境、不同的编程语言所构建的,所以就必须用一种统一的协议将其联通起来,不然做分布式系统也就没有意义了。一般就通过中间件技术来处理系统差异。
- 一致性:在分布式系统中,数据被拆分到不同的机器上进行处理,那么如何保证各个机器之间的数据一致性就成了分布式系统最大的问题。
- 故障的独立性:这个有点类似于分区容错,在整个的分布式系统的所有部分都有可能发生故障,一般来讲,分布式系统是允许出现故障的,但是出现故障之后不能影响整个系统的正常使用。
- 并发问题:由于分布式系统各个系统之间的资源是共享的,所以说每个系统的资源都必须在并发环境下是安全的。不会出现线程安全问题。
- 不可见性:分布式系统中任何组件的故障、或者是升级操作,对于用户来讲都是不可见的。
- 开放性:由于分布式系统是由不同的程序员来开发,组件最终要集成到一个大的系统中,所以组件的发布规范、接口规范都必须是相互之间能够被理解的。
- 安全性:对于共享资源进行加密保护,在网络之间传递的信息都需要进行加密保护。
- 可扩展性:分布式系统的设计要预留对于功能、业务逻辑的扩展内容。