分布式数据复制
我们在进行分布式数据存储设计时,通常会考虑对数据进行备份,以提高数据的可用性和可靠性,“数据复制技术”就是实现数据备份的关键技术。
什么是数据复制技术?
在分布式数据库系统中,通常会设置主备数据库,当主数据库出现故障时,备数据库可以替代主数据库进行后续的工作,从而保证业务的正常运行。
数据复制技术就是如何让主备数据库保持数据一致的技术。
数据复制原理和应用
数据的一致性,是指不同节点上的数据要保持一致。对于分布式存储系统中的数据复制技术来讲,也需要在一致性和可用性之间做出权衡。
从一致性和可用性来看,数据复制技术一般分为三类:
- 比较注重一致性,例如同步复制技术
- 比较注重可用性,例如异步复制技术
- 平衡一致性和可用性,例如半同步复制技术
同步复制技术
同步复制技术是指当用户请求更新数据时,主数据库必须要同步到备数据库之后才可以给用户返回结果,即如果主数据库没有同步到备数据库,用户的更新操作会一直阻塞。
这种方式保证了数据的强一致性,但是牺牲了系统的可用性。
在一个分布式数据库系统中,有两个节点,分别作为主节点和备节点。通常情况下,两个节点都可以接收用户读请求,然后将本节点的数据及时返回给用户,也就是说读请求响应比较快。如果用户发送的事写请求,写操作必须由主节点进行,即使用户将写请求发送到备节点,备节点也会将请求转发给主节点,因此写请求要比读请求慢一些。
同步复制技术要求主数据库等待所有备数据库都操作成功才可以响应用户,性能不是很好,影响用户体验。因此同步复制技术适用于分布式数据库主备场景或者对数据一致性有严格要求的场合。
异步复制技术
异步复制技术是指当用户请求更新数据时,主数据库处理完请求后可以直接给用户响应,而不必等到备数据库完成同步,即备数据库会异步进行数据同步,用户的更新操作不会因为备数据库未完成数据同步而导致阻塞。
这种方式保证了系统的可用性,但是牺牲了数据的一致性。
分布式数据库主备模式场景下,如果对数据一致性要求不高,也可以采用异步复制方法。
MySQL集群默认采用的数据复制模式就是异步复制技术,主要流程如下:
- 主数据库完成写操作后,可以直接给用户回复成功,将写操作写入binary log中,binary log中记录着主数据库执行的所有更新操作,以便备数据库获取更新信息。
- 备数据库启动一个IO线程专门读取binary log中的内容然后写入relay log中。
- 备数据库启动一个SQL线程会定时检查relay log中的内容,如果发现有新内容则会立即在备数据库中执行,从而实现数据的一致。
异步复制技术一般会应用在对用户请求响应时延要求很高的场景。
半同步复制技术
半同步复制技术的核心是用户发出写请求后,主数据库会执行写操作,并给备数据库发送同步请求,但主数据库不用等待所有备份数据库回复数据同步成功便可以响应用户,也就是说主数据库可以等待一部分备数据库同步完成后响应用户写操作执行成功。
半同步复制技术通常由两种方式:
- 当主数据库收到多个备数据库中某一个回复数据同步成功后,便可以给用户响应写操作完成。
- 当主数据库收到超过一半节点回复数据更新成功后,再给用户响应写操作成功。
我们之前谈过的ZooKeeper集群符合CP特征,它采用的数据复制技术就是上述第二种半同步复制方案,在ZooKeeper集群中,写请求必须由Leader节点进行处理,每次写请求,Leader会给Follower发Proposal,等待多数节点同意后写操作才可成功。通过这样的方式,ZooKeeper实现了一致性。
数据复制技术选型
多数的分布式存储系统可以通过配置来选择不同的数据复制技术,例如
- MySQL的数据库集群,支持全同步复制、异步复制和半同步复制三种模式。
- Oracle在数据复制方面提供了最大保护模式(半同步复制技术的第一种方式)、最大性能模式(异步复制技术)和最大可用性模式(平时采用最大保护模式,主备发生网络故障时采用最大性能模式,这样在一致性和可用性之间做了权衡)。
三种不同的数据复制技术的详细比较如下。