Redis 主从复制的用法
介绍
Redis 可以通过设置主服务器和从服务器的方式,来实现数据从主服务器复制到从服务器的操作。主从复制不但可以起到备份数据的作用,也可以通过从服务器对数据的操作减轻主服务器的请求压力。
工作原理
1、从服务器 slave 通过配置文件连接主服务器 master 后,通过向 master 发送 PSYNC 命令启动复制流,master 可以有多个 slave,slave 也可以连接到其它 slave
2、PSYNC 会携带 master 的 replication ID 和 已接受的偏移量,master 可以根据这两个数据部分同步最新的数据,如果 master 中找不到 replication ID 或缓冲区中没有要同步的命令,将使用全量同步 master 中的数据
replication ID:每个 master 都会产生一个随机数组成的数据集标识,master 数据向 slave 同步时会携带这个参数,当 slave 向 master 发送 PSYNC 命令时又会携带上,如果 slave 发送的 replication ID 和 master 当前的不一致,则判定数据片段不一致,无法使用部分同步,将使用全量同步
偏移量:master 向 slave 发送的多少个字节的数据就会产生多少偏移量,即使在没有 slave 时,master 也会产生偏移量,其数量代表的是新命令的字节数,命令执行后会被暂存在复制积压缓冲区,这个区域是一个队列,遵循先进先出原则,超出存储空间时早期命令会弹出,如果 slave 请求的偏移量已经不存在队列中,将使用全量同步
- 部分同步
部分同步是为了解决当数据量很大时,使用全局同步效率低的问题。它的执行需要依赖 replication ID 和偏移量的判断条件成立 - 全量同步
以下是全量同步的运行过程:
1、全量同步开始执行时,会在 master 后台开启一个保存进程,生成 RDB 文件
2、缓冲区开始接收客户端新写入的命令
3、当 master 保存进程执行完成后,会将 RDB 文件发送给 slave,slave 将文件保存到磁盘,再加载到内存中
4、master 将缓冲区的命令发送给 slave
3、master 执行 bgsave 在后台开启 RDB 同步,master 全程保持异步,slave 复制过程大部分是也是异步的,但是在加载新数据集的时候主进程仍是会产生阻塞
配置 redis 服务器
从服务器的配置文件设置主服务器的 IP 地址、端口就可以开启了,文档中记录的是本地测试环境配置,实际项目需替换 IP 地址和端口
replicaof 127.0.0.1 6379
设置从服务器的只读属性,从服务器建议不开启写属性,会让主从数据一致性的维护变得很复杂
replica-read-only yes
查看 master 和 slave 的服务器信息,主从复制信息
info
Redis 设置 master 访问验证
master 可以设置密码验证,slave 连接 master 时需要输入密码才能访问,也可以通过在配置文件中填入密码,省去每次的验证操作
#master 设置密码
requirepass 123456
#slave 设置访问master密码
masterauth 123456
Redis 复制如何处理 KEY 的过期
master 设置 KEY 的过期时间,slave 会同步过来,slave 不会让 KEY 过期,它需要等待 master 传入 del key 的命令删除 KEY,当 master 无法及时提供 del 命令时,slave 内部的逻辑时钟也会正确判断 KEY 的过期时间,从而对客户端的查询返回正确的结果。如果 slave 提升为 master ,它将可以独立地处理 KEY ,不需要依赖原有的 master。
#master
PEXPIREAT
$4
name
$13
1609152465506
*2
$6
SELECT
$1
0
*2
$3
DEL
$4
name
#slave
PEXPIREAT^M
$4^M
name^M
$13^M
1609152465519^M
Master 关闭持久化造成的复制安全问题
在使用主从复制时,强烈建议开启 master 的持久化,当 master 没有开启持久化,并且发生故障重启时,master 因为没有备份文件,所以数据会被清空,而 slave 因为开启了同步功能,会把 master 的状态同步过去,从而清除 slave 的备份,造成数据的丢失。哨兵监视因为会根据断线时间来判断 master 是否失效,所以当 master 重启速度很短时,是无法被哨兵捕捉到的。在网上一些教程中,master 持久化会被呼吁关闭,以此来减轻服务器的 I/0 压力,但是实际生产环境中,对数据的保护应该要加倍谨慎。