分布式数据服务:事务模型、处理语言、一致性与体系结构
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 数据冗余与副本

高可靠、高可用一直是对数据库系统的基本要求。分布式系统在数据层面和数据存储层面需要提供可靠存和高效用的支持;在硬件和操作系统层面之外,数据库存储层面需要提供多副本技术,这是提高云存储系统中数据访问可靠性和系统容错性的常用策略,因此有着较多的与副本有关的技术。但是,现有研究多以副本布局转换自动完成为前提,旨在关注数据副本数目与位置等与副本布局方案设计相关的内容,较少涉及副本布局转换的任务调度问题。而在多数据中心,数据副本分裂、合并、迁移、删除、备份、恢复等复杂操作的任务调度在应用不同的任务调度策略时,所占用的空间、时间都是不同的,这使得成本、效率方面也会存在很大的不同。所以,研究面向多数据中心的数据副本布局转换任务调度模型,从成本、空间、时间等方面离散约束优化调度问题,研究面向多数据中心的副本布局任务调度策略,对提高云存储系统的性能具有一定的意义。

复制意味着在通过网络连接的多台机器上保留相同数据的副本,通过复制数据使数据与用户在地理上接近(从而减少延迟);即使系统的一部分出现故障,系统也能继续工作(从而提高可用性);伸缩可以接受读请求的机器数量(从而提高读取吞吐量)。

数据分布在多个节点上有两种常见的方式:复制和分区。运行在大量节点上的文件系统被称为分布式文件系统,这是并行系统中广泛使用的数据存储方式。

数据分区将一个大型数据库拆分成多个较小的子集(称为分区),从而可以将不同的分区指派给不同的节点(也称分片)。分区的优势在于,当数据库在多个节点之间进行分区时,我们可以使用所有节点对其进行检索。类似地,在执行写入操作时,它也可以被并行地写入到多个节点。因此,I/O并行地读写整个数据库的操作要比非I/O并行的方式快得多。

数据复制为在几个不同的节点上保存数据的相同副本,可能放在不同的位置。复制提供了冗余:如果一些节点不可用,剩余的节点仍然可以提供数据服务。和分区类似, 复制也有助于改善性能。

由于每个分区都被复制,因此对分区的更新必须应用到所有的副本上,这样会产生一致性的问题。对于在创建后未被更新的数据,可以在所有节点上进行读操作,因为此时所有副本中的数据一致。若有副本被更新,则各个副本可能获取不同的值。可以通过将所有读操作发送到主副本来保证所有的读操作都能获得最新的值。

如果复制中的数据不会随时间而改变,那么复制就很简单:将数据复制到每个节点一次就万事大吉。复制的困难之处在于处理复制数据的 变更,这就是本节所要讲的。我们将讨论三种流行的变更复制算法:单领导者、多领导者和无领导者。几乎所有分布式数据库都使用这三种方法之一。

存储了数据库拷贝的每个节点被称为副本。当存在多个副本时,会不可避免地出现一个问题:如何确保所有数据都落在了所有的副本上?每一次对数据库的写入操作都需要传播到所有副本上,否则副本就会包含不一样的数据。最常见的解决方案被称为单领导者复制(也称主动/被动复制或主/从复制),它的工作原理如图1-18所示。

图1-18 单领导者复制

其中一个副本被指定为领导者,也称为主库。当客户端要向数据库写入数据时,它必须将请求发送给该领导者,其会将新数据写入本地存储。其他副本被称为追随者,也被称为只读副本、从库、备库或热备。每当领导者将新数据写入本地存储时,它也会将数据变更发送给所有的追随者,称为复制日志或变更流。每个跟随者从领导者拉取日志,并相应更新其本地数据库副本,方法是按照与领导者相同的处理顺序来执行所有写入。当客户想要从数据库中读取数据时,它可以向领导者或任一追随者进行查询,但只有领导者才能接受写入操作(从客户端的角度来看从库都是只读的)。

复制系统的一个重要细节是:复制是同步发生的还是异步发生的(在关系型数据库中这通常是一个配置项,其他系统则通常硬编码为其中一个)。

同步复制的优点是,从库能保证有与主库一致的最新数据副本。如果主库突然失效,我们可以确信这些数据仍然能在从库上找到。缺点是,如果同步从库没有响应(比如它已经崩溃或出现网络故障,或者其他任何原因),主库就无法处理写入操作。主库必须阻止所有写入,并等待同步副本再次可用。

因此,将所有从库都设置为同步的是不切实际的:任何一个节点的中断都会导致整个系统停滞不前。实际上,如果在数据库上启用同步复制,通常意味着其中 一个 从库是同步的,而其他从库则是异步的。如果该同步从库变得不可用或缓慢,则将一个异步从库改为同步运行。这保证你至少在两个节点上拥有最新的数据副本:主库和同步从库。 这种配置有时也被称为半同步。

通常情况下,单领导者复制都配置为完全异步。在这种情况下,如果主库失效且不可恢复,则任何尚未复制给从库的写入都会丢失。这意味着即使已经向客户端确认成功,写入也不能保证是持久的。然而,一个完全异步的配置也有优点:即使所有的从库都落后了,主库也可以继续处理写入。

单领导者复制有一个主要的缺点:只有一个主库,而且所有的写入都必须通过它。如果出于任何原因(例如和主库之间的网络连接中断)无法连接到主库,就无法向数据库写入数据。

单领导者复制模型的自然延伸是允许多个节点接受写入。复制仍然以同样的方式发生:处理写入的每个节点都必须将该数据变更转发给所有其他节点。我们将其称为多领导者配置(也称多主、多活复制)。在这种情况下,每个主库同时是其他主库的从库。

多领导者配置中可以在每个数据中心都有主库。图1-19展示了该架构。在每个数据中心使用常规的主从复制;在数据中心之间,每个数据中心的主库都会将其更改复制到其他数据中心的主库中。

图1-19 多领导者复制

尽管多领导者复制有这些优势,但也有一个很大的缺点:两个不同的数据中心可能会同时修改相同的数据,写冲突是必须要解决的。由于多领导者复制在许多数据库中都属于改装的功能,因此常常存在微妙的配置缺陷,且经常与其他数据库功能之间出现意外的反应,比如自增主键、触发器、完整性约束等都可能会有麻烦。因此,多领导者复制往往被认为是危险的领域,应尽可能避免。