PHP开发PHP经验分享

Redis 主从复制的用法

2020-12-28  本文已影响0人  phpworkerman
介绍

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 请求的偏移量已经不存在队列中,将使用全量同步

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 压力,但是实际生产环境中,对数据的保护应该要加倍谨慎。

上一篇下一篇

猜你喜欢

热点阅读