- 浏览: 142347 次
文章分类
最新评论
在连接到一台 Redis 服务器的客户端上执行 SLAVEOF 命令,可以使其成为另一台服务器的从服务器(slave),达到复制该主服务器(master)的目的。进行复制中的主从服务器双方的数据库将保存相同的数据,即所谓的“数据库状态一致”,或简称“一致”。
Redis 的复制功能分为同步(sync)和命令传播(command propagate)两个操作:
* 同步操作用于将从服务器的数据库状态更新到主服务器当前所处的数据库状态。
* 命令传播则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
接下来就对这两个操作进行介绍。
同步
当客户端向从服务器发送 SLAVEOF 命令,要求复制主服务器时,从服务器就首先需要执行同步操作,以使主从服务器的数据库状态首先保持一致。执行步骤如下:
1、从服务器向主服务器发送 SYNC 命令。
2、收到 SYNC 命令的主服务器执行 BGSAVE 命令,在后台生成一个 RDB 文件,并使用一个缓冲区记录同步期间执行的所有写命令。
3、主服务器将生成的 RDB 文件发送给从服务器,从服务器接收并载入该文件,以将自己的数据库状态更新至主服务器执行 BGSAVE 命令时的数据库状态。
4、主服务器将记录在缓冲区里的所有写命令发送给从服务器,从服务器将依次执行这些写命令。
命令传播
在同步操作完成后,主从服务器两者的数据库将达到一致状态,但这种一致并非一成不变,每当主服务器执行客户端发送的写命令时,主服务器的数据库状态就可能被修改。为了让主从服务器再次回到一致状态,主服务器就需要对从服务器执行命令传播操作,也即是将自己执行的造成主从服务器不一致的那条写命令发送给从服务器执行。
新版复制功能的实现
在 Redis 2.8 版本以前,如果从服务器在命令传播阶段与主服务器断开了连接,则当它重新连接到主服务器时,一旦发现两者的数据库状态不一致,就会重新进行一遍 SYNC 同步操作,从而大大影响了服务器性能。为了解决这种低效问题,Redis 2.8 版本后开始使用 PSYNC 命令代替 SYNC 命令来执行复制时的同步操作。
PSYNC 命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式,其中完整重同步用于处理初次复制的情况,其执行步骤同 SYNC,而部分重同步则用于处理断线后重复制的情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将断线期间执行的写命令发送给从服务器,从服务器只需要执行这些写命令就可以将数据库更新至主服务器当前所处的状态。
部分重同步的实现
部分重同步功能由以下三个部分构成:
1、主、从服务器的复制偏移量(replication offset)。
2、主服务器的复制积压缓冲区(replication backlog)。
3、服务器的运行 ID。
一、复制偏移量
主服务器和从服务器会分别维护一个复制偏移量:主服务器每次向从服务器传播 N 个字节时,就将自己的复制偏移量的值加 N,而从服务器每次收到这 N 个字节时,也将自己的复制偏移量加 N。因此,通过比较主从服务器的复制偏移量,程序可以很容易地知道两者是否处于一致状态。
当一个从服务器在断线后重新连接到主服务器时,如果两者的复制偏移量不一样,从服务器就会向主服务器发送 PSYNC 命令,并告知以从服务器当前的复制偏移量。至于之后主服务器应该对从服务器执行完整重同步还是部分重同步,如果执行部分重同步,主服务器又该如何补偿从服务器断线期间丢失的那部分数据?这就和主服务器的复制积压缓冲区有关了。
二、复制积压缓冲区
复制积压缓冲区是由主服务器维护的一个固定长度队列,默认大小为 1M(可以通过配置选项 repl-backlog-size 设置)。当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面。因此,主服务器的复制积压缓冲区里面会保存着最近一部分传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。
当从服务器重新连上主服务器时,从服务器会通过 PSYNC 命令将自己的复制偏移量offset 发送给主服务器,主服务器会根据这个偏移量来决定对从服务器执行何种同步操作:如果 offset 偏移量之后的的数据仍然在复制积压缓冲区中,则执行部分重同步(这时主服务器会先向从服务器发送 +CONTINUE 回复,表示数据同步将以部分重同步模式来进行);否则,执行完整重同步(这时主服务器会返回 +FULLRESYNC <runid> <offset>)。
三、服务器运行 ID
每个 Redis 服务器都会在启动时自动生成一个由 40 个随机十六进制字符组成的运行 ID。当从服务器初次复制主服务器时,它会先获取并保存主服务器的运行 ID,这样当它断开重新连上一个主服务器时,就会先把之前保存的运行 ID 发送给当前连接的主服务器:如果这个运行 ID 跟当前连接的主服务器的运行 ID 相同,说明从服务器断线前复制的就是这个主服务器,因此主服务器可以继续执行部分重同步操作;否则,主服务器将对该从服务器执行完整重同步操作。
心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送“REPLCONF ACK <replication_offset>”命令,这对于主从服务器有以下三个作用:
1、检测主从服务器的网络连接状态。如果主服务器超过一秒钟没有收到从服务器发来的 REPLCONF ACK 命令,则会认为两者之间的连接可能出现问题了。通过向主服务器发送“INFO replication”命令,在列出的从服务器列表的 lag 一栏中就可以看到相应从服务器最后一次向主服务器发送 REPLCONF ACK 命令距离现在过了多少秒。
2、辅助实现 min-slaves 选项。Redis 的 min-slaves-to-write 和 min-slaves-max-lag 两个选项可以防止主服务器在不安全的情况下执行写命令。在从服务器的数量少于 min-slaves-to-write 选项值,或者这些从服务器的延迟值(即上面的 lag 值)都不小于 min-slaves-max-lag 选项所设置的值时,主服务器将拒绝执行写命令。
3、检测命令丢失。如果写命令在传播过程中丢失,那么主服务器将从收到的 REPLCONF ACK 命令中发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会在复制积压缓冲区里找到从服务器缺少的数据,然后重新发送给从服务器。这个补发缺失数据的操作类似与部分重同步,不过它是在主从服务器没有断线的情况下执行的。
注:
参考书籍:《Redis 设计与实现》第 15 章——复制。
Redis 的复制功能分为同步(sync)和命令传播(command propagate)两个操作:
* 同步操作用于将从服务器的数据库状态更新到主服务器当前所处的数据库状态。
* 命令传播则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
接下来就对这两个操作进行介绍。
同步
当客户端向从服务器发送 SLAVEOF 命令,要求复制主服务器时,从服务器就首先需要执行同步操作,以使主从服务器的数据库状态首先保持一致。执行步骤如下:
1、从服务器向主服务器发送 SYNC 命令。
2、收到 SYNC 命令的主服务器执行 BGSAVE 命令,在后台生成一个 RDB 文件,并使用一个缓冲区记录同步期间执行的所有写命令。
3、主服务器将生成的 RDB 文件发送给从服务器,从服务器接收并载入该文件,以将自己的数据库状态更新至主服务器执行 BGSAVE 命令时的数据库状态。
4、主服务器将记录在缓冲区里的所有写命令发送给从服务器,从服务器将依次执行这些写命令。
命令传播
在同步操作完成后,主从服务器两者的数据库将达到一致状态,但这种一致并非一成不变,每当主服务器执行客户端发送的写命令时,主服务器的数据库状态就可能被修改。为了让主从服务器再次回到一致状态,主服务器就需要对从服务器执行命令传播操作,也即是将自己执行的造成主从服务器不一致的那条写命令发送给从服务器执行。
新版复制功能的实现
在 Redis 2.8 版本以前,如果从服务器在命令传播阶段与主服务器断开了连接,则当它重新连接到主服务器时,一旦发现两者的数据库状态不一致,就会重新进行一遍 SYNC 同步操作,从而大大影响了服务器性能。为了解决这种低效问题,Redis 2.8 版本后开始使用 PSYNC 命令代替 SYNC 命令来执行复制时的同步操作。
PSYNC 命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式,其中完整重同步用于处理初次复制的情况,其执行步骤同 SYNC,而部分重同步则用于处理断线后重复制的情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将断线期间执行的写命令发送给从服务器,从服务器只需要执行这些写命令就可以将数据库更新至主服务器当前所处的状态。
部分重同步的实现
部分重同步功能由以下三个部分构成:
1、主、从服务器的复制偏移量(replication offset)。
2、主服务器的复制积压缓冲区(replication backlog)。
3、服务器的运行 ID。
一、复制偏移量
主服务器和从服务器会分别维护一个复制偏移量:主服务器每次向从服务器传播 N 个字节时,就将自己的复制偏移量的值加 N,而从服务器每次收到这 N 个字节时,也将自己的复制偏移量加 N。因此,通过比较主从服务器的复制偏移量,程序可以很容易地知道两者是否处于一致状态。
当一个从服务器在断线后重新连接到主服务器时,如果两者的复制偏移量不一样,从服务器就会向主服务器发送 PSYNC 命令,并告知以从服务器当前的复制偏移量。至于之后主服务器应该对从服务器执行完整重同步还是部分重同步,如果执行部分重同步,主服务器又该如何补偿从服务器断线期间丢失的那部分数据?这就和主服务器的复制积压缓冲区有关了。
二、复制积压缓冲区
复制积压缓冲区是由主服务器维护的一个固定长度队列,默认大小为 1M(可以通过配置选项 repl-backlog-size 设置)。当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面。因此,主服务器的复制积压缓冲区里面会保存着最近一部分传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量。
当从服务器重新连上主服务器时,从服务器会通过 PSYNC 命令将自己的复制偏移量offset 发送给主服务器,主服务器会根据这个偏移量来决定对从服务器执行何种同步操作:如果 offset 偏移量之后的的数据仍然在复制积压缓冲区中,则执行部分重同步(这时主服务器会先向从服务器发送 +CONTINUE 回复,表示数据同步将以部分重同步模式来进行);否则,执行完整重同步(这时主服务器会返回 +FULLRESYNC <runid> <offset>)。
三、服务器运行 ID
每个 Redis 服务器都会在启动时自动生成一个由 40 个随机十六进制字符组成的运行 ID。当从服务器初次复制主服务器时,它会先获取并保存主服务器的运行 ID,这样当它断开重新连上一个主服务器时,就会先把之前保存的运行 ID 发送给当前连接的主服务器:如果这个运行 ID 跟当前连接的主服务器的运行 ID 相同,说明从服务器断线前复制的就是这个主服务器,因此主服务器可以继续执行部分重同步操作;否则,主服务器将对该从服务器执行完整重同步操作。
心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送“REPLCONF ACK <replication_offset>”命令,这对于主从服务器有以下三个作用:
1、检测主从服务器的网络连接状态。如果主服务器超过一秒钟没有收到从服务器发来的 REPLCONF ACK 命令,则会认为两者之间的连接可能出现问题了。通过向主服务器发送“INFO replication”命令,在列出的从服务器列表的 lag 一栏中就可以看到相应从服务器最后一次向主服务器发送 REPLCONF ACK 命令距离现在过了多少秒。
2、辅助实现 min-slaves 选项。Redis 的 min-slaves-to-write 和 min-slaves-max-lag 两个选项可以防止主服务器在不安全的情况下执行写命令。在从服务器的数量少于 min-slaves-to-write 选项值,或者这些从服务器的延迟值(即上面的 lag 值)都不小于 min-slaves-max-lag 选项所设置的值时,主服务器将拒绝执行写命令。
3、检测命令丢失。如果写命令在传播过程中丢失,那么主服务器将从收到的 REPLCONF ACK 命令中发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会在复制积压缓冲区里找到从服务器缺少的数据,然后重新发送给从服务器。这个补发缺失数据的操作类似与部分重同步,不过它是在主从服务器没有断线的情况下执行的。
注:
参考书籍:《Redis 设计与实现》第 15 章——复制。
发表评论
-
Lua 脚本
2019-10-07 19:49 685Redis 2.6 版本开始引入对 Lua 脚 ... -
Redis事务的实现
2019-09-22 18:56 471Redis 事务是 ... -
Redis集群之复制、故障转移及消息实现
2019-09-14 21:04 501在Redis集群 ... -
Redis集群实现原理
2019-09-14 12:19 678Redis 集群是 Redis 提供的分布式数 ... -
sentinel 系统介绍
2019-08-04 18:35 503Sentinel(哨兵)是 Redis 的高可 ... -
redis 客户端实现
2019-06-02 15:06 374Redis 服务器是典型的一对多服务器程序,通 ... -
AOF 持久化
2019-05-12 13:36 417除了前面提到的 RDB 持久化功能外,Redi ... -
RDB 文件结构
2019-04-27 12:10 580在RDB 持久化一节中,我们对 RDB 持久化 ... -
RDB 持久化
2019-04-14 17:20 421RDB 持久化功能可以将 Redis 在某个时 ... -
Redis 数据库通知功能的实现
2019-04-07 11:56 1287Reids 数据库通知功能可以让客户端通过订阅 ... -
数据库实现
2019-03-24 13:58 445Redis 服务器将其所有的数据库都保存在 r ... -
Redis 五种对象
2019-01-20 11:13 364阅读本节前需要阅读 Redis 对象系统概览一 ... -
Redis 对象系统概览
2019-01-06 13:10 783前面介绍了 Redis 中用到的所有主要数据结 ... -
整数集合与压缩列表
2018-12-09 21:19 592在 Redis 中,当一 ... -
跳跃表在 Redis 中的应用
2018-08-23 16:30 2027前提申明,因篇幅 ... -
字典实现
2018-08-20 15:49 568字典在 Redis 中的应用相当广泛,如 Redis ... -
redis 字符串和列表实现
2018-08-08 16:41 750Redis 虽说由 C 语言 ...
相关推荐
### 异构数据库复制技术的研究与实现 #### 一、引言 随着信息技术的快速发展,分布式计算环境变得越来越复杂,数据库复制技术作为一种重要的分布式技术,在提高数据可用性、减轻网络负担以及实现数据冗余等方面...
使用 SQL Server 将表从一个数据库复制到另一个数据库 SQL Server 是一种关系数据库管理系统,它提供了多种方式来将表从一个数据库复制到另一个数据库。下面将详细介绍使用 SQL Server 将表从一个数据库复制到另一...
【Oracle数据库复制】是Oracle数据库管理系统提供的一种技术,旨在解决大量只读数据导致的性能问题。复制技术将数据从一个数据库复制到另一个物理位置的数据库,这样查询和统计操作可以在独立的服务器上进行,减轻主...
**PostgreSQL数据库复制** PostgreSQL数据库复制是一种技术,旨在实现实时维护主库与从库之间的数据一致性。这种功能主要用于高可用性和负载均衡,确保在主数据库出现问题时,从库可以无缝接管,同时也能减轻主库的...
SQL Server 2000的数据库复制是一种强大的技术,它允许数据在多个服务器之间进行同步,从而实现数据的分发、备份和负载均衡。在这个过程中,我们通常涉及到发布、分发和订阅三个主要组件。本文件"SQL2000数据库复制...
**MSSQL Server 2008数据库复制详解** 数据库复制是MSSQL Server 2008中的一项重要功能,它允许数据在不同的数据库之间进行同步和分发,以实现数据备份、负载均衡或者远程访问等目的。下面将详细解释如何在MSSQL ...
### 跨数据库复制数据知识点详解 #### 一、概述 在日常的数据管理工作中,经常会遇到需要将一个数据库中的数据复制到另一个数据库中的场景。本文档将详细介绍如何在SQL Server环境中实现跨数据库的数据复制,主要...
数据库复制技术是现代数据库管理系统(DBMS)中的关键技术之一,旨在解决数据的分布、共享以及在多点之间保持数据一致性的问题。本篇文章将深入探讨数据库复制技术,特别是以SQL Server 2005为例,同时对比其他主流...
MySQL 8 数据库复制技术介绍 MySQL 8 数据库复制技术是指在一个或多个站点生成和复制多个数据副本的过程。这项技术可以帮助确保数据的一致性和可用性,提高系统的可靠性和性能。 数据库复制技术可以应用于各种...
redis-copy, 将一个redis数据库复制到另一个数据库 RedisCopy这个工具提供了一种将一个redis数据库的内容移动到另一个redis数据库的方法。 代码是由包含在redis源代码中的 redis-copy.rb 脚本插件激发的,但目标是...
Lotus Domino 邮件从一个数据库复制到另一个数据库 Lotus Domino 是一款功能强大且灵活的协作软件,提供了强大的电子邮件和数据库管理功能。然而,在实际操作中,我们经常需要将邮件从一个数据库复制到另一个...
### Microsoft SQL Server 2012 数据库复制 #### 一、概述 Microsoft SQL Server 2012 是一款由微软公司开发的关系型数据库管理系统,它提供了强大的数据存储与管理功能,广泛应用于企业级应用程序中。数据库复制...
数据库复制是确保数据高可用性和灾难恢复的关键技术。Oracle和MySQL作为两个主流的数据库管理系统,在数据库复制领域各有所长。本文将深入探讨Oracle和MySQL在数据库复制功能上的差异,并提供实际的代码示例。 ...
Win OGG数据库复制及初始化 Win OGG数据库复制及初始化是指在Windows操作系统下使用Oracle GoldenGate(OGG)软件复制Oracle数据库的过程。下面是相关的知识点: 一、OGG数据库复制的准备工作 1. 用户是否有建表...
数据库复制是指将一个数据库中的数据和结构完整地转移到另一个数据库中,这个过程通常用于创建数据的备份、进行灾难恢复或者在分布式系统中同步数据。在Delphi中,我们可以利用ADO(ActiveX Data Objects)组件库来...
在Windows环境下,双节点数据库复制是构建高可用性和冗余的重要策略,以确保业务连续性和数据安全性。 GoldenGate的核心组件包括捕捉进程(Capture Process)、传送进程(Transport Process)和投递进程(Delivery ...
数据库复制是确保数据高可用性、可扩展性和容错性的关键技术。它涉及将一个数据库中的数据复制到另一个或多个数据库中,从而允许多个数据库实例共享相同的数据集。本文将详细探讨数据库复制的类型、实现方式以及在...
在当今的IT环境中,数据库复制和变化数据捕获(CDC)是确保数据的可用性、一致性和持续性的重要技术。PostgreSQL作为一款先进的开源关系数据库,其复制与CDC的实施方案不仅有助于实现这些目标,还能够支持多种场景下...
在SQL Server中,将表从一个数据库复制到另一个数据库的过程涉及到数据库对象的迁移,这通常通过创建表的结构脚本和数据迁移来实现。以下是一个详细的步骤指南: 1. **启动SQL Server Management Studio (SSMS)**: ...
### 数据库复制技术研究进展分析 #### 一、引言 随着信息技术的飞速发展,海量数据的管理和处理成为企业和组织面临的重大挑战。在这种背景下,数据库技术的重要性愈发凸显。然而,由于网络环境的不稳定性和数据库...