前言

最近在学习MIT6.824的分布式系统课程,正在看Raft的论文,Raft是一种共识算法(Consensus algorithms),共识算法是用来保证分布式系统里数据的一致性的算法,所以也可以说是一个一致性算法。

在学习这个课程的过程中,发现其实对分布式系统这个概念很模糊,好像知道是什么却又好像说不出来,不禁思考起来,究竟什么是分布式系统?为什么我们需要分布式系统?这个问题也许很简单,但是还是想通过自己的语言去表达,加深印象,希望我能阐述清楚。

单机系统遇到的问题

为什么我们需要分布式系统而不是单机系统呢?一个概念或者理论的出现,都是为了解决问题,单机系统遇到的问题是什么呢?分布式系统要解决的问题主要是单机系统中系统容量不足及提高系统可用性。

提高系统容量

随着业务越来越复杂,服务也会变得越来越复杂,单台机器的CPU、内存已经无法满足部署一个庞大系统的性能要求。当然可以通过提高系统配置暂时解决问题,但是不管如何提高系统的配置,单台机器总会达到性能瓶颈的时候,所以需要多台机器才能应对这些扩张的功能。通过水平(加机器)和垂直(拆分为多个子系统)拆分系统,变成了一个分布式架构。

解决单点故障

在单台机器上部署服务,如果机器出现故障导致服务挂了,那么整个系统就会崩溃了。因此就要提高系统的可用性,系统的高可用性意味着一群服务器运行时与单台机器运行时没区别。这意味着要解决系统架构中的单点故障问题,通过引入分布式架构来增加冗余,从而提高系统的可用性,即使单台机器挂了也能保证服务正常运作。

基于上面两个原因,我们就需要分布式系统来解决系统容量不足和系统高可用问题。

分布式系统是什么

看看维基百科上的定义:

A distributed system is a system whose components are located on different networked computers, which communicate and coordinate their actions by passing messages to one another.[1] The components interact with one another in order to achieve a common goal. Three significant characteristics of distributed systems are: concurrency of components, lack of a global clock, and independent failure of components.[1] Examples of distributed systems vary from SOA-based systems to massively multiplayer online games to peer-to-peer applications.

在计算机科学里,分布式系统是一个组件/软件分布在网络中不同服务器,服务器之间通过传递信息来通信和协作的系统。

分布式架构

举一个例子,来看看一个分布式系统架构:

理解Java8中的时间API

如图所示,A、B、C三台机器,机器A部署了服务AA、BB,机器B部署了BB、CC,机器C部署了AA、CC,AA需要调用BB,BB需要调用CC,即AA与BB通信,BB与CC通信。

一个接口rpcA调用AA,AA调用BB,BB调用CC,调用路径如图(1->2->3),每一个调用所到达的机器都有可能为服务部署的机器之一。

图所表示的分布式系统架构有很多细节没有展示出来,但这是一个比较简单的分布式架构例子。

分布式系统中,要实现调用服务能到达部署的机器之一,就要用到负载均衡,可以分发集中的流量。像例子中的rpcA接口,调用链路rpcA->AA->BB->CC,整个链路较长,可以把全部的调用都写到rpcA接口中,但是如果某一步失败了,整个接口就失败了,因此可以将流程拆分到多个小的服务,微服务化,提高系统性能。

以上就是分布式系统的介绍及分布式系统诞生的原因,分布式系统的性价比很高、处理能力强、可靠性高、也有很好的扩展性,能为系统带来很好的性能和可用性。但是,分布式系统中还有很多不确定的问题存在。

分布式系统遇到的问题

做了负载均衡和微服务,是不是就可以高枕无忧,安心等待下一步的扩容扩展服务?很遗憾,分布式系统中还有很多的不确定性,比如应用架构引入了分布式系统之后,还有可能带来下面这些问题:

  • 系统的吞吐量会变大,但是响应时间会变长。
  • 某个非核心服务出现故障,为了不影响主流程,要加入服务降级和熔断策略
  • 同一个请求可能被服务集群里面的多台机器处理,然后保证幂等性

这些问题都需要引入其他手段解决来提高系统的稳定性,而加入了这些技术之后,还会衍生出更多的子问题,这就需要我们不断地用各式各样的技术和手段来解决这些问题。这些问题会在后面文章再做介绍。

总结

分布式系统领域里,还有一大片浩瀚的海洋可以探索,上面的例子只是从分布式应用角度介绍了这个概念,分布式系统里面还有分布式计算、分布式数据与存储等等领域。每一个领域都值得深入探索,这是一条漫长的学习之路。

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,顺手点个赞吧,谢谢

更多精彩内容,请关注个人公众号。