Redis 2.8 版本以前实现方式:SYNC
命令
同步(sync)
- 用于将从服务器的数据库状态更新至主服务器当前的数据库状态。命令传播(command propagate)
- 当主服务器的数据库状态被修改,导致主从数据库状态不一致时,让主从服务器的数据库重新回到一致状态。💡 注意:SYNC 命令是一个非常耗费资源的操作。
1.主服务器执行BGSAVE
命令生成 RDB 文件,这个操作会耗费主服务器大量的 CPU、内存和磁盘 I/O 资源。 2.主服务器传输 RDB 文件给从服务器,这个操作会耗费主从服务器大量的网络资源,并对主服务器响应时延产生影响。 3.从服务器载入 RDB 文件期间,会阻塞其他命令请求。
Redis 2.8 版本以后的新实现方式:使用PSYNC
命令替代SYNC
命令。
PSYNC
命令具有完整重同步和部分重同步两种模式:完整重同步(full resychronization)
- 用于初次复制。执行步骤与 SYNC
命令基本一致。部分重同步(partial resychronization)
- 用于断线后重复制。如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只需接收并执行这些写命令,即可将主从服务器的数据库状态保持一致。🔔 注意:合理调整复制积压缓冲区的大小Redis 复制积压缓冲区默认大小为 1MB。复制积压缓冲区的最小大小可以根据公式second * write_size_per_second
估算。
192.168.1.1
和 6379
替换成你的主服务器的 IP 和端口号。requirepass
,从服务器没有设置 masterauth
,则不进行身份验证;反之,则需要进行身份验证。如果身份验证失败,则放弃执行复制工作。requirepass
选项设置了密码, 那么为了让从服务器的同步操作可以顺利进行, 我们也必须为从服务器进行相应的身份验证设置。redis.conf
示例文件。REPLCONF listening-port <port-number>
,向主服务器发送从服务器的监听端口号。min-slaves-max-lag
, 以及执行写操作所需的至少从服务器数量 min-slaves-to-write
。min-slaves-to-write
个从服务器, 并且这些服务器的延迟值都少于 min-slaves-max-lag
秒, 那么主服务器就会执行客户端请求的写操作。min-slaves-to-write
和 min-slaves-max-lag
所指定的条件, 那么写操作就不会被执行, 主服务器会向请求执行写操作的客户端返回一个错误。min-slaves-to-write <number of slaves>
min-slaves-max-lag <number of seconds>
redis.conf
示例文件。redis.conf
文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。