分布式初探
Why 分布式系统?
分布式系统(Distributed system)是相对集中式系统来讲的。集中式就是所有程序都运行在一个机器上。在这种情况下,当程序和数据变得越来越多、越来越大时,单个机器就得提高性能和存储容量,比如增加CPU核数和增加存储空间。但是在一个机器上扩展性能会有两个问题:
- 一是这个机器任何一个部件(硬件或软件bug)坏掉整个系统就崩溃,没有冗余性;
- 二是单个机器的性能扩展总会有极限
因此,为了使系统有扩展性(scalability) , 单机器系统要重新设计成分布式系统,说白就是多个机器(称为节点 node)通过网络连接在一起、共同执行某个任务。一个分布式系统可以进行分布式计算和/或分布式存储。多个机器可以执行相同的程序(此时称为集群 cluster),也可以执行不同的程序。
分布式 vs 并行计算
显然,分布式是具有并行特点,但与分布式相对的是集中式,而与并行相对应的则是sequence computing. 实际上,分布式计算都是并行计算,但并行计算不都是分布式的,例如一台电脑多核CPU,可并行计算,但就是集中式系统。
分布式计算主要是为了系统扩展性,而并行计算是为了提高运算效率;
分布式计算没有global的时钟,而并行计算有;
分布式的节点拥有相互独立的内存,或者说内存是不共享的,而并行计算共享内存。
分布式难点
为了使系统能解决更大size的问题,我们增加机器数量;但系统性能不一定随机器数量而线性增长。实际上,分布式系统存在如下难点:
- 数据如何拷贝到不同节点上?拷贝完了不同节点拥有的数据是否还有一致性?
- 不同节点间的通讯如何协调?
- 一个任务里的多个程序可能要有先后的执行顺序,但不同节点没有global的时钟,如何协调执行顺序?
- 不同节点上的机器不同的(硬件,操作系统…),如何处理这些差异?
- 有的数据在节点间是共享的,如何保障数据的安全性?
- …
一个分布式系统的好坏可以大致地由两个方面来衡量:
-
性能 / 延迟 (performance / latency)
就是给定时间/计算资源,系统能干多少活。可以通过相应时间/延迟、内存利用率等指标来衡量。 -
可用性 (availability)
就是系统可用的时间和总运行时间的比率。整个系统可用不必要说每个节点、每个节点间的链接都可用。实际上,分布式系统应该是可容错(fault tolerant)的,由于存在冗余,一个部分挂掉系统仍有可能正常运行。好的分布式系统其实不要求每个机器都质量超好、超可靠,只要组合起来的整个系统可靠就行。
当我们增加系统节点数时,可能会:
- 增加整个系统挂掉的可能性(降低可用性)
- 增加节点间的通讯需求(降低性能)
- 如果节点存在地理上的距离,还会增加信息传输的时间(降低性能)
所以,分布式系统设计将着力解决以上问题。
数据如何分发到不同节点?
两种基本技术:
- Partitioning
就是把数据分割成多个独立的不同子集,分发到不同节点上 - Replication
这个则是把相同的数据copy几份放在不同节点上
partitioning和replication都有利于提高系统的性能和可用性:
Availability improvement | Performance improvement | |
---|---|---|
partitioning | by limiting the amount of data to be examined and by locating related data in the same partition | by allowing partitions to fail independently, increasing the number of nodes that need to fail before availability is sacrificed |
replication | by making additional computing power and bandwidth applicable to a new copy of the data | by creating additional copies of the data, increasing the number of nodes that need to fail before availability is sacrificed |
实现partitioning和replication的算法有很多种,具体用哪一种视问题而定。
CAP定理
CAP定理说的是以下三件事最多只有两个能被同时被满足:
- Consistency 一致性:所有节点在同一时间看到的数据应该是一样的
- Availability 可用性:一个机器挂掉不会影响其余机器的运行
- Partition tolerance 分区容忍性:即使由于网络连接出现问题信息丢失,系统也应该能够正常运行
任何两个同时发生构成一种分布式模型,如下图的任意两个大圆相交的部分所示。但三个大圆交成的区域不代表任何模型,因为不可能发生。
在现实中,网络连接的可靠性不太高,因此在分布式系统中必须保证Partition tolerance. 因此剩下的一致性和可用性就只能2选1了。而这里的“一致性”还是指的是“强一致性”,即系统中只有一份copy. 为了满足一定可用性,一致性就得做出牺牲,变成“弱一致性”。
(to be continued)