分布式数据库原理、架构与实践
上QQ阅读APP看书,第一时间看更新

2.5 架构一致性

本节从软件系统体系结构的角度讨论一致性问题。

2.5.1 分布式系统主备一致性

高可用的要求,分布式数据库中需要对数据进行冗余存储,即要有多个副本,且多个副本之间的数据是完全一样的。但是,因为跨了节点,所以要求数据一致,这就是主备系统之间的数据一致性。因为针对数据库的操作只有读、写两种,所以主备系统之间的数据一致性可分为如下3种。

1. 写数据的一致性

数据的一致性是指在事务的写(插入、更新、删除)操作下,一个副本的数据被修改,此时其他副本的相同数据项的副本也应该被修改,这样才能保证多副本之间的数据一致。

从工程实现的角度看,可以利用Paxos/Raft等多节点同步一致性的技术,在多个副本间同时修改数据,且应确保所有的副本都修改成功后,才向写操作返回写成功的信息。但在工程实践中,对于主备性质的系统,实现副本之间的一致性,多使用基于REDO日志的方式进行复制,这样做的优点是备机恢复速度快,且不用考虑事务处理中并发控制等复杂因素。

也有系统会采用其他技术,如MySQL采用的Group Relation技术(这类技术会采取逻辑复制的方式)以及Paxos技术(在主备系统间同步逻辑的二进制日志)。

2. 读数据的一致性

在一个单机数据上,读数据不存在不一致的情况(单机系统的并发访问控制技术保证了此点),但是,在分布式系统里,主备系统之间因多个节点存在,却会发生读数据不一致的情况。例如,假设主备节点分别为Master和Standby,数据项X从Master复制到Standby。用户A在Master修改了数据项X的值为x1。一段时间后,用户B在Standby上读数据(典型的读写分离架构)。随之而来的问题是,一致性模型需要决定是否允许用户B读到用户A对数据项X修改后的新值x1

3. 跨节点的事务在数据逻辑上的一致性

跨节点的事务在数据逻辑上的一致性是典型的分布式事务场景。一个事务内操作的不同数据项,位于不同的节点内。为保证事务ACID中的AC,跨多个节点的写(写不同的数据项)需要通过原子性来保证多个数据项之间在逻辑上是一致的(比如,跨节点的划账操作,只有划账前两个账户的总额等于划账后两个账户的总额,才能确保数据状态在逻辑上是一致的)。解决此问题的典型方法是确保分布式事务的可串行化和2PC技术。

2.5.2 去中心化的分布式系统一致性

一个中心化的分布式系统,尽管物理节点分离,但逻辑上不分离,其全局序发生器依然是集中式的,且使用的方式与非分布式系统相同。

一个去中心化的分布式系统,物理节点分离,无集中式的全局序发生器制约整个系统,即系统失去了逻辑上的全局序的依据,因此需要看各种任务是否需要全局排序,如对于事务的提交顺序,如果要求是强一致性的,则逻辑上需要全局排序,此时要在去中心化的架构下构建提供全局序的组件。比如,Spanner采用原子钟、GPS在各个节点上进行校时,也就是采用Truetime机制提供全局序。