Redis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。
以下是关于 Redis 复制功能的几个重要方面:
•Redis 使用异步复制。 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
•一个主服务器可以有多个从服务器。
•不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个图状结构。
•复制功能不会阻塞主服务器: 即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。
•复制功能也不会阻塞从服务器: 只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。
不过, 在从服务器删除旧版本数据集并载入新版本数据集的那段时间内, 连接请求会被阻塞。
你还可以配置从服务器, 让它在与主服务器之间的连接断开时, 向客户端发送一个错误。
•复制功能可以单纯地用于数据冗余(data redundancy), 也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说, 繁重的 SORT 命令可以交给附属节点去运行。
•可以通过复制功能来让主服务器免于执行持久化操作: 只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。
复制功能的运作原理
无论是初次连接还是重新连接, 当建立一个从服务器时, 从服务器都将向主服务器发送一个 SYNC 命令。
接到 SYNC 命令的主服务器将开始执行 BGSAVE , 并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
当 BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
之后主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
你可以通过 telnet 命令来亲自验证这个同步过程: 首先连上一个正在处理命令请求的 Redis 服务器, 然后向它发送 SYNC 命令, 过一阵子, 你将看到 telnet 会话(session)接收到服务器发来的大段数据(.rdb 文件), 之后还会看到, 所有在服务器执行过的写命令, 都会重新发送到 telnet 会话来。
即使有多个从服务器同时向主服务器发送 SYNC , 主服务器也只需执行一次 BGSAVE 命令, 就可以处理所有这些从服务器的同步请求。
从服务器可以在主从服务器之间的连接断开时进行自动重连, 在 Redis 2.8 版本之前, 断线之后重连的从服务器总要执行一次完整重同步(full resynchronization)操作, 但是从 Redis 2.8 版本开始, 从服务器可以根据主服务器的情况来选择执行完整重同步还是部分重同步(partial resynchronization)。
部分重同步
从 Redis 2.8 开始, 在网络连接短暂性失效之后, 主从服务器可以尝试继续执行原有的复制进程(process), 而不一定要执行完整重同步操作。
这个特性需要主服务器为被发送的复制流创建一个内存缓冲区(in-memory backlog), 并且主服务器和所有从服务器之间都记录一个复制偏移量(replication offset)和一个主服务器 ID (master run id), 当出现网络连接断开时, 从服务器会重新连接, 并且向主服务器请求继续执行原来的复制进程:
•如果从服务器记录的主服务器 ID 和当前要连接的主服务器的 ID 相同, 并且从服务器记录的偏移量所指定的数据仍然保存在主服务器的复制流缓冲区里面, 那么主服务器会向从服务器发送断线时缺失的那部分数据, 然后复制工作可以继续执行。
•否则的话, 从服务器就要执行完整重同步操作。
Redis 2.8 的这个部分重同步特性会用到一个新增的 PSYNC 内部命令, 而 Redis 2.8 以前的旧版本只有 SYNC 命令, 不过, 只要从服务器是 Redis 2.8 或以上的版本, 它就会根据主服务器的版本来决定到底是使用 PSYNC 还是 SYNC :
•如果主服务器是 Redis 2.8 或以上版本,那么从服务器使用 PSYNC 命令来进行同步。
•如果主服务器是 Redis 2.8 之前的版本,那么从服务器使用 SYNC 命令来进行同步。
配置
配置一个从服务器非常简单, 只要在配置文件中增加以下的这一行就可以了:
slaveof 192.168.1.1 6379
当然, 你需要将代码中的 192.168.1.1 和 6379 替换成你的主服务器的 IP 和端口号。
另外一种方法是调用 SLAVEOF 命令, 输入主服务器的 IP 和端口, 然后同步就会开始:
127.0.0.1:6379> SLAVEOF 192.168.1.1 10086
OK
只读从服务器
从 Redis 2.6 开始, 从服务器支持只读模式, 并且该模式为从服务器的默认模式。
只读模式由 redis.conf 文件中的 slave-read-only 选项控制, 也可以通过 CONFIG SET 命令来开启或关闭这个模式。
只读从服务器会拒绝执行任何写命令, 所以不会出现因为操作失误而将数据不小心写入到了从服务器的情况。
即使从服务器是只读的, DEBUG 和 CONFIG 等管理式命令仍然是可以使用的, 所以我们还是不应该将服务器暴露给互联网或者任何不可信网络。 不过, 使用 redis.conf 中的命令改名选项, 我们可以通过禁止执行某些命令来提升只读从服务器的安全性。
你可能会感到好奇, 既然从服务器上的写数据会被重同步数据覆盖, 也可能在从服务器重启时丢失, 那么为什么要让一个从服务器变得可写呢?
原因是, 一些不重要的临时数据, 仍然是可以保存在从服务器上面的。 比如说, 客户端可以在从服务器上保存主服务器的可达性(reachability)信息, 从而实现故障转移(failover)策略。
从服务器相关配置
如果主服务器通过 requirepass 选项设置了密码, 那么为了让从服务器的同步操作可以顺利进行, 我们也必须为从服务器进行相应的身份验证设置。
对于一个正在运行的服务器, 可以使用客户端输入以下命令:
config set masterauth <password>
要永久地设置这个密码, 那么可以将它加入到配置文件中:
masterauth <password>
另外还有几个选项, 它们和主服务器执行部分重同步时所使用的复制流缓冲区有关, 详细的信息可以参考 Redis 源码中附带的 redis.conf 示例文件。
主服务器只在有至少 N 个从服务器的情况下,才执行写操作
从 Redis 2.8 开始, 为了保证数据的安全性, 可以通过配置, 让主服务器只在有至少 N 个当前已连接从服务器的情况下, 才执行写命令。
不过, 因为 Redis 使用异步复制, 所以主服务器发送的写数据并不一定会被从服务器接收到, 因此, 数据丢失的可能性仍然是存在的。
以下是这个特性的运作原理:
•从服务器以每秒一次的频率 PING 主服务器一次, 并报告复制流的处理情况。
•主服务器会记录各个从服务器最后一次向它发送 PING 的时间。
•用户可以通过配置, 指定网络延迟的最大值 min-slaves-max-lag , 以及执行写操作所需的至少从服务器数量 min-slaves-to-write 。
如果至少有 min-slaves-to-write 个从服务器, 并且这些服务器的延迟值都少于 min-slaves-max-lag 秒, 那么主服务器就会执行客户端请求的写操作。
你可以将这个特性看作 CAP 理论中的 C 的条件放宽版本: 尽管不能保证写操作的持久性, 但起码丢失数据的窗口会被严格限制在指定的秒数中。
另一方面, 如果条件达不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的条件, 那么写操作就不会被执行, 主服务器会向请求执行写操作的客户端返回一个错误。
以下是这个特性的两个选项和它们所需的参数:
•min-slaves-to-write <number of slaves>
•min-slaves-max-lag <number of seconds>
详细的信息可以参考 Redis 源码中附带的 redis.conf 示例文件。
讨论
分享到:
相关推荐
MySQL复制(Replication)是一种强大的技术,它允许数据从一个服务器(主节点,Master)实时或近实时地同步到其他服务器(从节点,Slave)。这一过程有助于实现数据的冗余,提高系统的可用性和可扩展性。 复制的...
Stream Replication 双向复制是一种高级的Oracle数据库复制技术,用于在两个数据库之间实现数据的实时同步。这种复制方式不仅可以确保数据的一致性,还能在主数据库出现问题时提供即时的故障转移能力。以下是对...
在深入探讨如何通过MySQL Replication实现库名修改与单个表的复制之前,我们先来了解MySQL Replication的基本概念及其工作原理。MySQL Replication是一种数据复制机制,它允许从一台服务器(主服务器)向另一台或多...
《Replication Server DB2 Q复制配置详解》 在IT领域,数据复制是保障数据库高可用性和数据一致性的重要手段。本文将深入探讨Replication Server在DB2环境中的Q复制配置,帮助读者理解并掌握这一关键技术。 一、...
- **复制状态查看器(Replication Status Viewer):** 显示复制活动的状态,便于跟踪复制进度和诊断问题。 #### API参考与使用 Oracle Advanced Replication Management API为开发者提供了丰富的接口来控制和管理...
MongoDB的复制模式(Replication)是一种多数据库服务器协同工作的机制,其目的是为数据提供冗余并提高数据的可用性。复制在分布式数据库系统中扮演着至关重要的角色,它确保在一台服务器出现问题时,其他服务器能够...
Veeam Backup & Replication 12 是一款功能强大的备份和复制软件,旨在帮助用户保护和恢复虚拟机和物理机上的数据。该软件提供了多种备份模式、快照管理、数据复制和灾难恢复等功能,旨在确保业务连续性和数据安全。...
MySQL Group Replication 是一种基于组的复制技术,用于容错系统中。它由多个服务器(节点)组成,每个节点都可以独立执行事务,而读写事务则会在于 group 内的其他节点进行协调之后再 commit。这种原子广播的方式,...
大多数人都知道Streaming Replication已经成为PostgreSQL的一部分,并且通常用于高可用性和读写分离,流复制是基于WAL日志的物理复制,适用于整个数据库实例的复制,并且备库是只读的。 Logical Replication属于...
HBase的Replication功能允许在一个集群(称为来源集群)中的RegionServer将变更复制到另一个集群(称为目标集群)。这种复制是异步的,意味着更改在源集群中提交后才会被复制。每个集群都有一个“replication peer...
PPC开发通过合并复制(Merge Replication)来实现本地数据库和后台数据库的同步
10. 复制代理(Replication agents):执行复制操作的后台进程,包括快照代理、日志读取器代理、分发代理和合并代理等,它们负责数据的捕获、分发和应用。 11. 复制维护作业(Replication maintenance jobs):SQL ...
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` #### 5. 获取主服务器的二进制日志位置和偏移量 - 使用以下命令获取二进制日志的位置和偏移量: ```sql SHOW MASTER STATUS; ``` ###...
在IBM WebSphere Replication Server(以下简称WRS)的上下文中,“Q Replication”特指一种支持高可用性和灾难恢复策略的数据复制技术。本章节将深入探讨Q Replication的概念及其在AIX平台上的应用,尤其是对于实现...
MySQLReplication主从复制全方位解决方案.docx
MySQL Replication 是一种数据复制机制,它允许将一个MySQL服务器(主服务器或Master)的数据异步复制到一个或多个其他MySQL服务器(从服务器或Slave)。这种机制主要用于实现数据库负载均衡、提高读取性能以及备份...
3. **同步复制(Synchronous Replication)**:在这种模式下,只有当至少一个备服务器确认接收到所有更改并将其写入磁盘后,写操作才会被确认完成。这提供了较高的数据安全性,但可能会增加写操作的延迟。 4. **异步...
Veeam Backup & Replication 是一款功能强大且灵活的备份和复制解决方案,旨在保护虚拟机和物理机环境中的数据。以下是 Veeam Backup & Replication v11 安装配置手册的摘要信息。 关于 Veeam Backup & Replication...
### MySQL Group Replication 组复制原理 #### 一、引言 MySQL Group Replication作为MySQL 5.7.17版本之后引入的一项新特性,它为数据库管理领域带来了全新的复制解决方案。这一特性不仅提升了系统的可用性和扩展...
vSphere Replication 是 VMware 提供的一种企业级灾难恢复解决方案,用于实现虚拟机的站点间容灾复制。这个系统的关键在于其能够确保关键业务在主站点出现故障时,能够在备份站点快速恢复运行,从而减少业务中断时间...