分布式系统
A Thorough Introduction to Distributed Systems
什么是分布式系统?
简单来说,就是系统由一组计算机一起运行,但在用户看来就像一台计算机而已。这些计算机共享一个状态,可以并发操作,且单机故障后不影响整个系统的运行。
对于分布式的数据库,用户能够与系统中的任何一台机器交互并记录数据,且能够从任何一台机器获取记录。
为什么需要分布式系统?
分布式系统能够实现水平扩展。对于运行在单机上的传统数据库,提高服务能力的唯一办法是升级硬件设备,也就是垂直扩展,但在一定程度后便会到达瓶颈。
水平扩展需要新增计算机,但相比于在垂直扩展到了瓶颈后继续升级设备,还是要便宜多的。更重要的是水平扩展没限制,性能下降时新增机器就能提升上来。
此外,容错和低时延都是分布式系统的好处。
不过要运行分布式系统,需要设计能够同时运行在多台机器上的软件,并且解决随之而来的问题。
扩展数据库
如果要扩展数据库来提升读性能,可以采用主从复制策略(Primary-Replica Replication strategy),主服务器负责对数据库进行插入和修改,并异步通知从服务器,从服务器负责读操作。
但是这就破坏了数据库ACID原则中的C,一致性的问题。假如插入一个新数据后,紧接着对其读取,由于数据是异步通知的,这时将读到空,也就是旧数据。这能够通过在写数据时,同步等待数据通知更新的完成来解决,但无疑会降低写性能。
上述方法只是提升了读性能,要提升写性能,可以采用多主复制策略(multi-primary replication strategy),多个主节点都支持读和写操作。然而对同个key的写操作存在冲突,需要通过分片(sharding,或分区partitioning)来解决,每个分片只负责某一部分key,通过划分多个分片来提升性能。不过分片的策略需要注意,防止出现热点分片存在(某个分片的读写操作远多过其他分片)。
分片并不易实现,并且对于读操作性能将会有所影响,因为需要确定从哪个分片读取。
去中心化 vs 分布式
去中心化是分布式的,但整个系统不被任何一方所拥有。目前大多数系统可以说是分布式的中心化系统。去中心化的系统需要考虑存在恶意参与者的情况。
分布式数据存储
分布式数据存储是使用最广泛的分布式系统,也是分布式数据库。大部分分布式数据库都是NoSQL非关系型数据库,仅限于key-value场景。它们通过牺牲一致性和可用性来达到难以置信的性能和可扩展性。
CAP理论
CAP理论在2002年提出并证明,一个分布式数据存储不能同时满足一致性(Consistent)、可用性(Available)和分区容错性(Partition tolerant)。
三者只能选其二,且不能是一致性和可用性,因为无分区容错能力的情况下是无法满足一致性和可用性的。
- 一致性:顺序读写时,结果是预期的
- 可用性:系统中非故障节点总能响应
- 分区容错性:尽管网络分区了,系统也能够保持一致性和可用性。
因此,能做的只有在分区容错的基础上提供更高的一致性或者可用性。事实上大多数系统都是选可用性,因为即便是强一致性也会因为网络延时存在不一致。这些系统提供的最终一致性,使得系统在没有更新的情况下,最终都会返回最新更新的值。
这些系统提供了BASE属性
- Basically Available:总能返回响应
- Soft state:系统内部总是随时间变化,即使某段时间没有输入
- Eventual consistency:系统没有输入的情况下,各节点最终保持一致
共识
数据库事务要在分布式系统中的各个节点上达成一致(接受或拒绝事务)是件棘手的问题,这个就是共识,是分布式系统的基础问题。
如果分布式系统各节点和网络是可靠的,那达成事务提交的协议是简单的,但实际系统中会遇到大量可能的问题,如进程崩溃、网络分区、丢包、失真、消息重发等。
一个已经证明的经典问题:不可能在有限时间内保证在不可靠网络上达成正确共识。
分布式计算
将一个大任务拆分成多个小任务,分派给多个机器运算。