什么是分布式系统
分布式系统就是一个由通过消息传递来完成彼此通信、协调的多个网络计算机组成的系统。分布式系统中的节点通过交互来完成一个共同的目标。在分布式系统中运行的程序被称为分布式程序,而编写这样的程序的过程被称为分布式编程。分布式系统中的节点一般通过HTTP、RPC和消息队列来完成消息传递。
一个分布式系统通常具有以下特征:
- 能够容忍一定数量的机器故障。例如在Raft集群中,5台机器能够容忍至多2台机器故障。
- 系统的具体结构(包括网络拓扑,网络时延,节点数量等)是不可预见的,在系统运行中会发生变化。
- 单个节点能够对系统的认识是不完全的,它只具有系统的局部数据或状态。
现在,分布式系统被广泛使用。具体的实例包括但不限于:分布式数据库管理系统Spanner,分布式文件系统HDFS,分布式消息系统Apache Kafka,分布式存储Apache BookKeeper。
为什么需要分布式系统
设计与实现一个分布式系统比设计与实现一个单体系统比起来,实现非常复杂,系统的正确性难以被保证。在确定我们需要的系统是分布式系统还是单体系统时,我们需要考虑为什么需要分布式系统。以下是主要的原因:
分布式系统提供更高的可用性: 在单体系统中,例如单体的WebServer,如果这个WebServer所在的机器出现了宕机、网络出现了不可用等问题而导致这个机器不能对外服务,那么这个WebServer所服务的网站就不能被用户请求,从而导致整个系统不可用。相反地,在分布式系统中,当这台WebServer故障时,另外的备份机器可以接管故障机器,从而持续对外提供服务,系统仍然可用。
分布式系统提供更高的效率: 当一个WebServer面临着很大的压力时,WebServer对用户的响应时间就会变长。通过增加额外的WebServer,现有的WebServer的压力可以被分担,同时用户的响应时间也会变短,系统效率变得更高,
分布式系统提供更高的持久性: 在单体系统中,如果出现地震等自然灾害,那么这个系统的数据就会丢失,根据业务类型的不同带来不同程度的损失。相反地,在分布式系统中,不同的数据库可以存放在地理上隔离很远的数据中心中,例如一个数据中心在中国北京,另一个数据中心在美国纽约。这一,当其中一个地方发生自然灾害时,只会让一个地方的数据丢失,备份数据依然存在,系统的持久性更高。
分布式系统提供更高的可扩展性: 在单体系统中,如果内存出现不足,那么就只能通过扩展内存来解决,但内存大小是有上限的,一般不会太高。相反地,在分布式系统中,通过加入另外的机器就可以解决内存扩展的问题。在分布式系统中,无状态的机器扩展容易实现,而有状态的机器扩展由于需要考虑如何迁移状态等复杂问题而变得难以实现。
挑战
分布式系统的七个经典挑战问题如下:
异质性(Heterogeneity): 系统中的机器具有不同的硬件配置,不同服务使用不同的编程语言或者通信协议。管理和协调系统中各种各样的节点具有挑战性。
安全(Security): 分布式系统中的安全确保了数据的完整性、可信性和私密性。在分布式系统中为了安全需要实现数据加密、身份验证和识别安全问题。
容错(Fault-tolerant): 为了提供更高的可用性,分布式系统需要提供容错机制,也就是当一个或多个节点故障时,系统需要仍然可用。如何保持数据同步和如何解决分区问题为分布式系统设计带来了额外的挑战。
并发(Concurrency): 分布式系统由多个机器组成共享资源对外提供服务,它自然就是一个需要解决并发问题的系统,并发问题本身就是一个不简单的问题。
可扩展性(Scailability): 可扩展性指的是如果为新增资源,那么系统的性能就会得到提升。例如增加N个节点,系统的吞吐量提升N倍。高可扩展性需要优秀的架构才能提供。
开放(Openness): 开放性指的是分布式系统是开放的、可拓展的、可交互操作的,能够与其他的系统或者技术进行交互。分布式系统需要提供标准的客户端API让系统能够很容易的被集成。服务发现也需要被提供用于客户端与系统中的服务进行交互。
迁移与负载均衡(Mitigration and Load Balance): 迁移和负载均衡都涉及到动态地重分配系统中节点的资源,从而优化系统的性能和资源利用率。
总结
分布式系统通过协调多台网络计算机来实现目标。与单体系统比起来,分布式系统能够提供更高的可用性、更高的持久性、更高的效率和更高的可扩展性。但这些优点都是由分布式系统的设计与实现非常复杂这一不菲的代价换来的。七个经典的挑战问题包括异质性、可扩展性、容错、安全、并发、开放、迁移与负载均衡。