4.2 复制:
对于有扩展平台以适应更高负载经验的工程师和管理员来说,
复制是不可或缺的。 复制可以让其他服务器拥有一个不断地更新的数据副本
从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。
4.2.1 对Redis的复制相关选项进行配置
13725:M 14 Oct 16:50:03.879 - DB 0: 2 keys (0 volatile) in 4 slots HT.
13725:M 14 Oct 16:50:03.879 - 1 clients connected (0 slaves), 529072 bytes in use
13725:M 14 Oct 16:50:04.588 * Background saving started by pid 22679
22679:C 14 Oct 16:50:04.591 * DB saved on disk
22679:C 14 Oct 16:50:04.592 * RDB: 2 MB of memory used by copy-on-write
13725:M 14 Oct 16:50:04.686 * Background saving terminated with success
4.1.1 节中曾经介绍过,当从服务器连接主服务器的时候,主服务器会执行BGSAVE操作。
因此为了正确地使用复制特性,用户需要保证主服务器已经正确地设置了
dir选项和dbfilename选项 。
尽管有多个不同的选项可以控制从服务器自身的行为,
但开启从服务器所必须的选项只有slaveof一个
如果用户在启动Redis服务器的时候,指定了一个包含slaveof host port
选项的配置文件,
4.2.2 Redis 复制的启动过程
本章前面曾经说过,从服务器在连接一个主服务器的时候,主服务器会创建
一个快照文件并将其发送至从服务器,但这指示主从复制执行过程的其中一步。
步骤 主服务器操作 从服务器操作
1 (等待命令进入) 连接(或者重连接)主服务器,发送SYNC命令
2 开始执行BGSAVE,并使用缓冲区记录 根据配置选项来决定是继续使用现有的数据(如果有的话)
BGSAVE 之后执行的所有写命令 来处理客户端的命令请求,还是向发送请求的客户端返回错误
3 BGSAVE 执行完毕,向从服务器发送快照文件,
并在发送期间继续使用缓冲区记录被执行的命令 丢弃所有的旧数据,开始载入主服务器发来的快照文件
4 快照文件发送完毕,开始向从服务器发送菜存储在缓冲区里面的写命令 完成对快照文件的解释操作,像往常一样开始介绍命令请求
5 缓冲区存储的写命令发送完毕,从现在开始,每执行一个写命令, 执行主服务器发来的所有存储缓冲区里面的写命令,
就向从服务器发送相同的写命令
从服务器在进行同步时,会清空自己的所有数据
警告:Redis 不支持主主复制(master-master replication)
因为Redis允许用户在服务器启动之后使用SLAVEOF命令来设置从服务器选项
3725:M 14 Oct 23:24:02.617 - Accepted 192.168.137.2:60608
13725:M 14 Oct 23:24:02.618 * Slave 192.168.137.2:6379 asks for synchronization
13725:M 14 Oct 23:24:02.618 * Full resync requested by slave 192.168.137.2:6379
13725:M 14 Oct 23:24:02.618 * Starting BGSAVE for SYNC with target: disk
13725:M 14 Oct 23:24:02.619 * Background saving started by pid 4911
4911:C 14 Oct 23:24:02.633 * DB saved on disk
4911:C 14 Oct 23:24:02.634 * RDB: 2 MB of memory used by copy-on-write
13725:M 14 Oct 23:24:02.702 * Background saving terminated with success
13725:M 14 Oct 23:24:02.703 * Synchronization with slave 192.168.137.2:6379 succeeded
13725:M 14 Oct 23:24:06.235 - DB 0: 3 keys (0 volatile) in 4 slots HT.
13725:M 14 Oct 23:24:06.235 - 0 clients connected (1 slaves), 1577824 bytes in use