redis--主从复制

主从复制:

  1. 读写分离
  2. 负载均衡
  3. 故障恢复
  4. 数据冗余
  5. 高可用基石

总述

主从复制过程大致可分为三个阶段:

  1. 建立连接阶段
  2. 数据同步阶段
  3. 命令传播阶段

建立连接

有三种方式完成连接:(设有两台redis服务器,一台叫master,一台叫slave

  1. slave客户端使用命令 slaveof masterhost masterport
  2. slave服务器端启动时,附加--slaveof masterhost masterport
  3. slave的配置文件中加上slaveof masterhost masterport ————> 提供的redis.conf中并没有该选项,改为replicaof <masterip> <masterport>了,而且示意图中也变为Master---->Replica

redis服务器有两种方式设置密码:

  1. 在配置文件中requirepass <password>
  2. 在运行时通过客户端设置:config set requirepass <password>, 重启服务器会失效

设置密码后,如果没有进行认证,在客户端的大部分操作(没有验证所有的)都会:NOAUTH Authentication required.

两种认证方式:

  1. 启动redis客户端时附加-a | -u <password>,会提示可能不安全
  2. 连接后在客户端使用命令auth <password>

如果master设置了密码,slave想要连接master,需要在配置文件中提前设置masterauth <password>,应该只有这一种方式。

数据同步

数据同步是由slave端发起的,可以通过master日志看出:Replica [::1]:6379 asks for synchronization

数据同步大致分为两个阶段:

  1. 全量复制,master进行bgsave,把得到的RDB文件通过socket发送给slave
  2. 增量/部分复制,在master进行bgsave时,可能又修改了某些数据,会将这些修改数据的指令存储在复制缓冲区中,全量复制完成后,在发送给slave,可以看作AOF

​ 注意:复制缓冲区存在溢出的情形,如果溢出,会再次进行全量复制,可能会陷入死循环

相关指令:

  1. 设置该缓冲区的大小:repl-backlog-size 1mb

  2. 进行复制时slave是否提供读服务:replica-serve-stale-data yes——->default

  3. slave是否提供写服务:replica-read-only yes———->default

by itcast

命令传播

第⑤步中使用的指令为:replconf ack <offset>