站内链接:

同步和复制

同步和复制

数据同步(Data Synchronization)指的是将数据在不同系统、设备或位置之间进行更新和保持一致的过程。它确保了数据的准确性和一致性,使得各个数据副本之间的内容保持同步。数据同步可以包括多种操作,例如数据的复制、更新、删除等,以确保数据在多个系统之间的一致性。

数据复制(Data Replication)则是数据同步的一种具体方式,它是指将数据从一个源位置复制到一个或多个目标位置的过程。数据复制可以基于不同的策略和技术来实现,例如同步复制、异步复制、基于日志的复制等。数据复制通常用于实现容灾、数据备份、数据分发和数据共享等目的。

因此,数据同步是一个更广泛的概念,包括了数据复制在内,而数据复制则是数据同步的一种具体实现方式。数据同步还可以包括其他操作,例如数据的更新、删除、冲突解决等,以确保数据的一致性和正确性。

但是,在大部分情况下,数据同步和数据复制都是指代同一个东西,如果真的将数据复制从狭义方面区别于数据同步,并搞出什么数据传输、数据共享、数据合并、数据复制等一些稀碎的概念反而加大了理解难度。

复制方式

数据复制技术主要是指能够将结构化数据进行复制,从而保证数据具备双副本或者多副本分散在不同数据中心的技术。这里面有两个概念:

  • 结构化数据:以结构化数据为主的数据复制技术。
  • 分散在不同数据中心:数据副本必须分布在不同的数据中心。

那么,数据复制的方式有哪些呢?从 RPO 维度来考虑,数据复制方式有如下 3 种:

  1. 同步复制(Synchronous Replication):在同步复制中,数据的写入操作会等待数据被成功复制到备份存储设备或远程数据中心,然后才返回确认给应用程序。这确保了主存储和备份存储之间的数据一致性,但可能会引入一定的延迟。

  2. 异步复制(Asynchronous Replication):在异步复制中,数据的写入操作不会等待数据复制的完成,而是立即返回确认给应用程序。数据复制过程在后台异步进行,可以通过批处理或定时机制来进行数据的复制。这样可以减少对主存储性能的影响,但备份存储可能存在数据延迟的情况。

  3. 半同步复制(Semi-Synchronous Replication)是一种数据复制技术,用于在主数据库和备份数据库之间实现数据同步。在半同步复制中,当主数据库接收到事务后,它会等待至少一个备份数据库确认已成功接收并应用该事务,然后才向客户端返回提交成功的确认。

下面是网上一个以 mysql 为例的上述三种不同复制方式的简单图例

recovery-sync-mysql

其中半同步和增强半同步的两种确认机制分别是:after-commitafter-sync

  • after-commit:主库在未收到从库的ACK之前,虽然不会给客户端返回写入成功,但本质上在MySQL中会提交事务,也就是主库中的其他事务是可以看见对应数据的,当此时出现宕机时,就会导致旧主上能查询出的数据,在新主(原本的从库)上无法查询出来了。
  • after-sync:当主库未收到从库的ACK之前,也不会在主库上提交事务,也就是保证了主从节点的数据强一致性,解决了after-commit中存在的问题。

复制方法

上面所述的复制方式一般是实时数据同步复制方式,比如 mysql 中的主备数据实时同步一般都是基于日志的复制来实现,但除此之外还有一些大粒度或者其他接触第三方的复制方法:

  1. 基于日志的复制(Log-based Replication):基于日志的复制是一种常见的数据同步方法,其中主存储会记录所有的数据更新操作,并将这些更新操作的日志传输给备份存储设备,然后在备份存储设备上重新执行这些更新操作,以保持数据的一致性。

  2. 基于日志传输的复制(Log Shipping):该方法将主数据库的事务日志传输到备份数据库,并在备份数据库上重新应用事务日志来实现数据同步。这种方法适用于主数据库和备份数据库之间的物理复制,可以实现较低的延迟和较高的数据一致性。

  3. 快照复制(Snapshot Replication):快照复制是通过创建数据的快照(即数据的副本)来实现数据的复制。快照可以在主存储和备份存储之间进行复制,从而提供数据的备份和恢复能力。

  4. 基于消息队列的复制(Replication via Message Queue):该方法使用消息队列作为主数据库和备份数据库之间的中间件,主数据库将操作记录发布到消息队列,备份数据库订阅消息并应用操作以实现数据同步。这种方法可以实现异步的、可靠的数据复制,并具有较高的灵活性和可伸缩性。

  5. 块级复制(Block-level Replication):块级复制是一种将存储设备的数据按照块进行复制的方法。它可以在主存储和备份存储之间复制块级别的数据,以提供数据的冗余和备份。这是一种存储层的复制方法。

若是从数据所在的层级来划分的话,可以将数据的复制从系统层、数据库层、存储层三个角度来进行归类划分

  • 系统层:操作系统逻辑卷镜像(LVM)、数据库逻辑卷镜像(ASM)、分布式文件系统镜像(GPFS)
  • 数据库层:日志回放等
  • 存储层:存储网关逻辑卷镜像、存储介质块复制

当然,无论使用何种技术原理,这些复制技术都可以归纳为三种具体的实现类型:

  • IO 双写:LVM, ASM, 存储网关镜像等
  • 事务回放:大部分数据库数据复制
  • 数据单元拷贝(block):以存储 CA,DP 为代表的存储技术

复制方式

同步复制

同步复制(Synchronous Replication)是一种数据复制机制,它确保主数据库的变更操作在同步进行的同时,将数据变更复制到一个或多个备份数据库。在同步复制中,主数据库在提交事务之前,必须等待至少一个备份数据库确认已经成功接收并应用了数据变更。其基本流程如下:

  1. 主数据库写入数据:当发生数据修改操作(例如插入、更新或删除)时,主数据库将数据变更记录在事务日志或日志队列中。
  2. 主数据库发送数据变更记录:主数据库将数据变更记录发送给副本。
  3. 副本接收数据变更记录:副本接收主数据库发送的数据变更记录。
  4. 副本应用数据变更:副本将接收到的数据变更记录应用到自身的数据库中,注意这里异步的区别,确保与主数据库的数据保持一致。
  5. 副本确认数据变更完成:副本向主数据库发送确认信号,表示已成功应用数据变更。
  6. 主数据库收到确认信号:主数据库接收到副本的确认信号,确认数据变更已成功复制到副本。

在同步复制中,由于主数据库需要等待备份数据库的确认,因此在主数据库和备份数据库之间的数据一致性更高。如果主数据库发生故障或不可用,可以立即使用备份数据库进行故障切换,而且数据在主备之间几乎是实时同步的。这对于对数据一致性要求非常高的应用场景,如金融交易系统或关键业务系统,是非常重要的。

同步复制也存在一些挑战和限制。由于主数据库需要等待备份数据库的确认,因此同步复制可能会引入一定的延迟,对主数据库的写入性能有一定的影响。此外,如果备份数据库发生故障或不可用,主数据库可能无法继续写入,因为它需要等待备份数据库的确认。因此,在设计和配置同步复制时,需要仔细权衡一致性、可用性和性能之间的平衡,并根据实际需求选择适合的复制机制。

在数据同步复制领域,有许多具体的实现案例,下面列举了一些常见的实现案例:

  1. MySQL 的主从复制:MySQL 数据库支持主从复制,其中一个 MySQL 实例作为主服务器(Master),负责写入和更新数据,而其他实例作为从服务器(Slave),复制主服务器的数据。这种复制方式基于二进制日志(Binary Log)进行数据同步。

  2. Oracle 的物理备份:Oracle 数据库提供了物理备份(Physical Backup)功能,通过将数据库的数据文件和日志文件复制到备份目标中,实现数据的同步复制。这种备份方式可以使用 Oracle Data Guard 等工具来管理和自动化数据同步。

  3. MongoDB 的副本集:MongoDB 使用副本集(Replica Set)实现数据的同步复制。副本集包含一个主节点和多个从节点,主节点负责处理写操作,而从节点复制主节点的数据。当主节点故障时,从节点会选举出新的主节点来继续提供服务。

  4. Amazon S3 的跨区域复制:Amazon S3(Simple Storage Service)提供了跨区域复制(Cross-Region Replication)功能,可以将存储在一个 AWS 区域中的桶(Bucket)的数据自动复制到另一个区域中的桶。这种复制方式基于事件驱动的机制,可以实现数据的异地备份和容灾。

  5. Apache Kafka 的消息复制:Apache Kafka 是一个分布式流处理平台,它使用副本机制实现数据的同步复制。Kafka 将消息分为多个分区,并将每个分区的副本分布在不同的节点上,当消息写入主副本时,会通过副本机制将消息复制到其他副本,以实现数据的复制和冗余。

  6. postgreSQL 的同步流复制:PostgreSQL 是一个开源的关系型数据库系统,它提供了同步流复制的功能。在同步流复制中,主数据库将数据变更记录在事务日志中,并将这些变更通过流复制的方式发送给副本数据库。副本数据库在接收到变更后,会将其应用到自身的数据库中,并返回确认信号给主数据库,主数据库才会继续提交后续的变更。这样可以确保至少有一个副本与主数据库的数据保持一致,提高数据复制的可靠性。

这些是一些常见的同步复制的实现案例,不同的数据库和存储系统都有各自的实现方式和机制来实现数据的同步复制,具体的实现方式会根据系统的特性和需求而有所不同。

半同步复制

半同步复制(Semi-Synchronous Replication)是一种数据复制技术,用于在主数据库和备份数据库之间实现数据同步。在半同步复制中,当主数据库接收到事务后,它会等待至少一个备份数据库确认已成功接收并应用该事务,然后才向客户端返回提交成功的确认。

具体来说,半同步复制的工作流程如下:

  1. 主数据库接收到一个事务,并将事务写入日志(binlog)。
  2. 主数据库等待至少一个备份数据库确认已成功接收该事务, 注意这里和同步复制的区别。
  3. 一旦主数据库收到至少一个备份数据库的确认,它会向客户端返回提交成功的确认。
  4. 主数据库将事务应用到自己的数据集上,完成数据更新操作。
  5. 主数据库将事务的日志发送给备份数据库。
  6. 备份数据库接收到日志后,将事务应用到自己的数据集上,实现数据同步。

需要注意的是,半同步复制可能会引入一定的性能开销,因为主数据库需要等待备份数据库的确认。此外,半同步复制也依赖于网络的稳定性和延迟,因为主数据库需要等待备份数据库的确认才能返回给客户端。因此,在设计容灾架构时需要权衡数据一致性、故障恢复速度和性能开销等因素,选择适合的数据复制技术。下面是一些常见的半同步案例:

  1. MySQL 半同步复制:MySQL 数据库提供了半同步复制的功能。在 MySQL 半同步复制中,主数据库将事务写入本地的二进制日志(binlog),同时等待至少一个副本数据库(也称为半同步副本)将数据变更成功写入到它们的日志位置,并发送确认信号给主数据库,主数据库才会将事务标记为已提交。这样可以确保至少有一个副本数据库与主数据库的数据保持一致,提高数据复制的可靠性。
  2. Apache Kafka 的 ISR 机制:Apache Kafka 是一个分布式流处理平台,其中的 ISR(In-Sync Replica)机制可以看作是一种半同步复制的实现方式。在 Kafka 中,每个分区都有多个副本,其中一个副本被选为领导者(Leader),其余副本作为追随者(Follower)。当数据写入领导者副本后,领导者会等待至少一个追随者副本成功复制数据,并确认数据已写入它们的本地日志,然后才会返回写入成功的响应。这样可以确保至少有一个副本与领导者副本的数据保持一致,提高数据复制的可靠性。

异步复制

异步复制是一种数据复制方式,其中主数据库将数据变更记录在日志中,并通过异步方式将变更发送给备份数据库。在异步复制中,主数据库不需要等待备份数据库确认变更,而是直接继续处理后续的事务。这使得主数据库的性能不会受到备份数据库的延迟或故障的影响。

异步复制的流程如下:

  1. 主数据库接收到客户端的数据变更请求。
  2. 主数据库将数据变更记录在事务日志中。
  3. 主数据库将变更信息异步发送给备份数据库。
  4. 主数据库继续处理后续的事务。
  5. 备份数据库接收到变更信息后,将其应用到自身的数据库中。
  6. 客户端可以查询主数据库或备份数据库获取最新的数据。

需要注意的是,由于异步复制的特性,备份数据库的数据可能会有一定的延迟。主数据库和备份数据库之间存在一定的数据不一致性,因为备份数据库可能尚未接收到最新的变更。这种延迟和数据不一致性是异步复制的一种权衡,可以根据应用场景的需求来选择适当的数据复制方式。以下是一些常见的异步复制实现案例:

  1. MySQL 异步复制:MySQL 是一种流行的关系型数据库,它提供了异步复制的功能。在 MySQL 异步复制中,主数据库将数据变更写入二进制日志(Binary Log),然后异步将日志传输给备份数据库。备份数据库会定期从主数据库获取并应用这些日志,以实现数据的复制。
  2. PostgreSQL 异步复制:PostgreSQL 是另一种常用的开源关系型数据库,它也支持异步复制。在 PostgreSQL 异步复制中,主数据库将数据变更记录在 WAL(Write-Ahead Log)中,并通过异步方式将 WAL 日志传输给备份数据库。备份数据库会定期从主数据库获取并应用这些 WAL 日志,实现数据的复制。
  3. MongoDB 异步复制:MongoDB 是一种面向文档的 NoSQL 数据库,它也支持异步复制。在 MongoDB 异步复制中,主节点(Primary)接收到数据变更后,将其记录在 Oplog(操作日志)中,并通过异步方式将 Oplog 传输给备节点(Secondary)。备节点会定期从主节点获取并应用 Oplog,以实现数据的复制。
  4. Apache Kafka 异步复制:Apache Kafka 是一种高性能的分布式消息队列系统,它使用异步复制机制来保证消息的可靠性和持久性。在 Kafka 异步复制中,消息生产者将消息发送到 Kafka 集群的一个或多个主题分区,然后 Kafka 将消息异步复制到多个副本中。副本会定期从主分区获取并应用消息,以实现数据的复制。
  5. AWS S3 异步复制:AWS S3(Simple Storage Service)是一种云存储服务,它提供了异步复制功能来实现数据的跨区域复制。用户可以配置 S3 桶之间的异步复制规则,以实现数据的异地备份和灾难恢复。

复制对比

  1. 半同步复制相比异步复制的优点:
  • 半同步复制:在半同步复制中,主数据库在提交事务之前需要等待至少一个备份数据库确认已经接收到数据变更。这确保了主数据库和备份数据库之间的数据一致性较高,因为至少有一个备份数据库已经接收到了数据变更。
  • 异步复制:在异步复制中,主数据库在提交事务后立即继续进行后续操作,而不需要等待备份数据库的确认。主数据库将数据变更发送给备份数据库,但并不等待备份数据库的接收确认。因此,主数据库和备份数据库之间可能存在一定的数据延迟,数据一致性相对较低。
  • 性能方面:异步复制相对于半同步复制具有更好的性能,但数据一致性比较差
  1. 半同步和同步复制
  • 同步复制:在同步复制中,主数据库在提交事务之前需要等待至少一个备份数据库确认已经成功接收并应用了数据变更。这确保了主数据库和备份数据库之间的数据一致性非常高,因为数据变更在提交后立即同步到备份数据库。
  • 半同步复制:在半同步复制中,主数据库在提交事务之前需要等待至少一个备份数据库确认已经接收到数据变更,但不要求备份数据库已经应用了数据变更。这意味着主数据库和备份数据库之间可能存在一定的数据延迟,数据变更在提交后并不立即同步到备份数据库,但在一定时间窗口内会同步。
  • 性能方面:半同步复制相对于同步复制具有更好的性能,数据一致性较异步复制还是更好一点,但肯定没有同步复制高的

参考: