引言
复制非常重要的一个设计选项是同步复制还是异步复制。对于关系数据库系统,同步或异步通常是一个可配置的选项;而其他系统则可能是硬性指定或者只能二选一。
同步复制
主节点需等待直到从节点确认完成写入,然后才会向用户报告完成,并且将最新的写入对其他客户端可见。
同步复制的优点是,一旦向用户确认,从节点可以明确保证完成了与主节点的更新同步,数据已经处于最新版本。万一主节点发生故障,总是可以在从节点继续访问最新数据。
缺点则是如果同步的从节点无法完成确认(例如从节点发生崩溃,或者网络故障,或其他原因),写入就不能视为成功。主节点会阻塞其后所有的写操作,直到同步副本确认完成。
因此把所有从节点都配置为同步复制有些不太实际。因为这样的话,任何一个同步的节点的中断都会导致整个系统更新停滞不前。
半同步
实践中,如果数据库起用了同步复制,通常意味着其中某一个从节点是同步的,而其他节点则是异步模式。万一同步的从节点变得不可用或者性能下降,则将另一个异步的从节点提升为同步模式。这样就可以保证之前有两个节点(即一个主节点和一个同步从节点)拥有最新的数据副本。这种配置有时也被称为半同步。
异步复制
主从复制还经常会被配置成为全异步模式。此时如果主节点发生失败且不可恢复,则所有尚未复制的从节点的写请求都会丢失。这意味着即使向客户端确认了写操作,却无法保证数据的持久化。但是全异步配置的优点是,不管从节点上数据多么滞后,主节点总是可以持续响应写请求,系统的吞吐性能更好。
异步模式这种弱化的持久性听起来是一个非常不靠谱的折中设计,但是异步复制还是被广泛使用,特别是那些从节点数量巨大或者分布于广域地理环境。
主节点发生故障时异步复制系统了可能会丢失数据,这是一个非常严重的问题,因此在保证数据不丢失的前提下,研究人员尝试了各种办法来提高复制性能与系统可用性。例如,链式复制是同步复制的一种变体,已经在一些系统中得以实现。
多副本一致性与共识之间有着密切的联系(即让多个节点对数据状态达成一致)