zdq0394.github.com

Tech study and research.

Follow me on GitHub

Data Replication

数据复制(data replication)属于分布式计算的范畴,它并不仅仅局限于数据库,但这里主要是指分布式数据库的复制。

多副本构成的分布式数据库系统中, 其事务特性与单个数据库系统的差别主要表现在原子性和一致性两个方面。

  • 在原子性方面,要求同一分布式事务的所有操作在所有相关副本上要么提交,要么回滚。即除了保证原有的局部事务的原子性,还需要控制全局事务的原子性
  • 在一致性方面,多副本之间需要保证单一副本一致性。

针对分布式事务的原子性和一致性这两个复制协议中的核心问题,经过近20年的研究,人们提出了各种各样的复制协议。 这些协议在外在功能内部实现两方面都有较大的差别。据此,我们可以从这两个大的方面进行分类说明。

外在功能

从外在功能角度看,可以从事务执行的地点和时间两个方面进行分类。

事务执行的地点

从事务执行的地点可以分为两类:主从(Priamry/Copy)方式和更新所有(Update-Anywhere)方式。

  • 主从: 一般是系统中仅仅指定一个Primary节点接受更新请求,在事务操作执行完毕后,在事务提交前或后将操作广播到其他Copy节点。
  • 更新所有:处理过程稍微复杂,系统中的任何副本具有相同的地位,都可以接收Update请求,在检测事务冲突、事务提交前或后将各个节点的Update传播到其他副本节点。

Primary/Copy方式并发控制较为简单,由Primary本地的事务控制即可实现,事务的原子性的实现也较为简单,一般由Primary节点作为协调节点来实现。但是其缺陷也显而易见:仅仅单个节点提供Update请求处理能力,对于Update密集类型的应用,如OLTP,容易形成单点性能瓶颈。

Update-Anywhere方式则与其相辅相成,可以通过多点提高事务吞吐率,但随之而来的是多个分布式事务之间复杂的并发控制和原子性问题。

事务提交的时间点

从事务提交的时间点看,可以分为积极(Eager)和消极(Lazy)两类。

  • 积极:在事务提交前传播更新,即通常所谓的同步复制(synchronous replication)。
  • 消极:在提交之后才将事务操作传播到其他副本,即所谓的异步复制(asynchronous replication)。

异步复制的优点是可以提高响应速度,但牺牲了一致性,一般实现该类协议的算法需要增加额外的补偿机制。

同步复制的优点是可以保证一致性(一般通过两阶段提交协议),但是开销较大,可用性不好,带来了更多的冲突和死锁等问题。

值得一提的是Lazy+Primary/Copy的复制协议在实际生产环境中是非常实用的,MySQL的复制实际上就属于这种。