Redis命令参考之复制(Replication)

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

时间: 2025-01-05 15:47:06

Redis命令参考之复制(Replication)的相关文章

Redis 命令参考

本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版: 所有 Redis 命令文档均已翻译完毕, Redis 最重要的一部分主题(topic)文档, 比如事务.持久化.复制.Sentinel.集群等文章也已翻译完毕. 文档目前描述的内容以 Redis 2.8 版本为准, 查看更新日志(change log)可以了解本文档对 Redis 2.8 所做的更新. 你可以通过网址 doc.redisfans.com 在线阅览本文档, 也可以下

Redis命令参考【EXPIRE】

EXPIRE EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的』(volatile). 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不

redis命令参考(二)

上面一篇多是对有序集合的处理,这里对常用的操作命令进行介绍. 一.INCR  : 原子操作防并发,将key值自增1,如果非数字报错,如果不存在key,则自动创建. INCR key 例子: INCR myNum //如果myNum不存在,则初始化为0,并自增为1 典型使用: 计数器  : 比如统计选项.统计页面访问.游戏里面记录分数 限数器 : 典型用法是限制公开 API 的请求次数 二.INCRBY:同上,将key值自增 某个值 INCRBY key increment 例子: INCRBY

Redis 命令参考——PubSub(发布订阅)

PubSub(发布订阅)PUBLISH PUBLISH channel message 将信息 message 发送到指定的频道 channel . 可用版本: >=2.0.0 时间复杂度: O(N+M),其中 N 是频道 channel 的订阅者数量,而 M 则是使用模式订阅(subscribed patterns)的客户端的数量. 返回值: 接收到信息 message 的订阅者数量. # 对没有订阅者的频道发送信息 redis>publish bad_channel "can a

redis命令参考(三) List列表相关

本篇对redis中List列表相关操作函数的总结: 思考:可以将list作为堆栈使用,这一点可以用来解决很多问题. 一.LPUSH 二.RPUSH 三.LPOP 四.RPOP 五.LRANGE > rpush lover lover1 (integer) 1 > lrange lover 0 -1 //列出所有范围 1) "lover1" > rpush lover lover2 //列表后面加入 (integer) 2 > rpush lover lover3

redis命令参考

最近打算用到redis的排序功能,所以有接触,发现极好,比memcache功能丰富好多.先介绍一部分,以后慢慢学,慢慢补充. 先澄清一点,redis中,key表示有序集合的名字, 实际是member-value对. 一.Sorted Set (有序集合) //自己歪歪,有序集合底层应该是插入排序算法 ZADD  :将一个或多个member的值score,存入有序集中. 增.改 ZADD key score member [score member] 例子: ZADD 'mySortedSet'

redis演练(2) 最全redis命令列表

官方The full list of commands 官方在线交互学习工具 Redis命令参考简体中文版 Redis-cli命令最新总结 Redis 命令参考(官方中文翻译) Redis命令简明示例 下面列表是本人通过程序搜集的help命令整理的聚合列表,希望为redis填把火. COMMAND summary since group DECR key  Decrement the integer value of a  key by one  1.0.0  string DECRBY key

Redis复制(Replication)

概述 Redis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品. 以下是关于 Redis 复制功能的几个重要方面: Redis 使用异步复制. 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度. 一个主服务器可以有多个从服务器. 不仅主服务器可以有从服务器, 从服务器也可以有自

redis 系列22 复制Replication (下)

原文:redis 系列22 复制Replication (下) 一. 复制环境准备 1.1 主库环境(172.168.18.201) 环境 说明 操作系统版本 CentOS  7.4.1708  IP地址 172.168.18.201 网关Gateway 172.168.18.1 DNS 172.168.16.11 Redis版本和端口 4.0.6  和 6379 Redis 密码 123456 是否RDB持久化 开启 是否 AOF持久化 开启 1.2 从库环境(172.168.18.203)