10. 一致性与共识
一致性与共识
1. 共识算法的概述
本节我们将讨论构建容错式分布式系统的相关算法和协议。这里我们假设第 8 章中所有的故障都可能发生: 网络会丢失、顺序紊乱、重复发送或延迟;时钟也有一定偏差,节点可能发生暂停甚至随时崩溃。为了构建容错系统,最好先建立一套通用的抽象机制和与之对应的技术保证,这样只需实现一次,其上的各种应用程序都可以安全的信赖底层的保证。这与引入事务是一样的道理。
一致性与共识
本节我们将讨论构建容错式分布式系统的相关算法和协议。这里我们假设第 8 章中所有的故障都可能发生: 网络会丢失、顺序紊乱、重复发送或延迟;时钟也有一定偏差,节点可能发生暂停甚至随时崩溃。为了构建容错系统,最好先建立一套通用的抽象机制和与之对应的技术保证,这样只需实现一次,其上的各种应用程序都可以安全的信赖底层的保证。这与引入事务是一样的道理。
分布式系统面临的挑战
在分布式系统中,故障来自于下面的方方面面:
让系统容忍失效并不容易,在典型的分布式环境下,没有全局变量,没有共享内存,没有约定的尝试或其他跨节点的共享状态。节点甚至不太清楚现在的准确时间。信息的流动只能通过不可靠的网络来发送。
事务
事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑单元,要么全部成功(提交)、要么失败(中止或回滚)。如果失败,应用程序可以安全地重试。这样无需担心部分失败的情况。事务存在的目的是简化应用层的编程模型。有了事务,应用程序可以不用考虑某些内部潜在的错误以及复杂的并发性问题,这些都交给数据库负责处理(称之为安全性保证)。
数据分区
分区的存在为了存储海量数据集或者分摊非常大的查询压力。分区通常是这样定义的,每一条数据(记录)只属于某个特定分区。每个分区都可以视为一个完整的小型数据库。采用数据分区通过将负载分摊到更多的机器上来提高系统的可扩展性。分区和复制通常结合使用,即每个分区在多个节点上都存有副本。
系统可扩展性
当负载增加需要更强的处理能力时,我们有两种扩展系统的方式:
垂直扩展通过共享内存和共享磁盘的方式,让操作系统管理更多的 CPU、内存和磁盘,从何获取更强劲的性能。但是这种方式有明显的缺陷:
构建可适应变化的系统
应用程序不可避免的需要随时间而变化,大多数情况下,应用程序的更改也需要更改其存储的数据: 增删字段或者以新的方式呈现数据。当数据格式或模式发生变化时,同样也需要对应用程序代码进行相应调整。