目录
1. 介绍
从上图可以得知:
master节点下可以配置多个slave节点,slave节点下又可以配置多个slave。
主从的特点:
主对外,从对内;主可写,从不可写。
主挂了,从不可为主, 从不提供服务,可读不可写。
2. 安装
- 主redis配置:无需特殊配置
- 从redis配置
vim redis.conf
# slaveof <masterip> <masterport>
# 表示当前【从服务器】对应的【主服务器】的IP是当前机器ip,端口是6380。
slaveof 127.0.0.1 6380
3. 启动
- 启动master redis节点
- 启动slave redis节点
master节点和slave节点的启动 不分先后顺序,最好先启动slave,再启动master。
# 在redis安装的bin目录下
./redis-server redis.conf
4. 连接
# 连接master节点
# 地址-h和端口-p自己按照实际条件更换
./redis-cli -h 127.0.0.1 -p 6380
5. 实现原理
- Redis的主从同步,分为全量同步和增量同步。
- 只有从机第一次连接上主机的时候是全量同步。
- 断线重连有可能触发全量同步也有可能是增量同步。(master判断runid是否一致)
- 除此之外的情况都是增量同步。
5.1 全量同步
Slave向Master发送PSYNC请求。
PSYNC:是个命令,表示要复制数据。
PSYNC <runid> <offset>
runid:主服务器ID
offset:从服务器最后接收命令的偏移量
runid:每个Redis服务器都会有一个表明自己身份的ID。在PSYNC中发送的这个ID是指之前连接的Master的ID,如果没保存这个ID,PSYNC的命令会使用"PSYNC ? -1" 这种形式发送给Master,表示需要全量复制。
offset: 复制偏移量。在主从复制的mater和slave双方都会各自维持一个offset。master成功发送N个字节的命令后,会将master的offset加上N, 同理,slave是在接收N个字节的命令。
master和slave的状态如果是一致的,name它们的offset也应该是一致的。
复制积压缓冲区: 它是由master维护的一个固定长度的队列,作用是缓存已经发送出去的命令。 当master进行命令传播时,不仅将命令发送给所有的slave,还会将命令写入到复制挤压缓存区里面。
Redis的全量同步过程分三个阶段:
- 同步快照阶段:Master创建并发送快照给Slave,Slave载入并解析快照。Master同时将此阶段产生的新的写命令存储到缓冲区。
- 同步写缓冲阶段:Master向Slave同步存储在缓冲区的写操作命令。
- 同步增量阶段:Master向Slave同步写操作。
5.2 增量同步
- Redis增量同步主要指Slave完成初始化后开始正常工作时,Master发生的写操作同步到Slave的过程。
- 通常情况下,Master每执行一个写命令就会向Slave发送相同的写命令,然后Slave接收并执行。
缺点
Redis主从复制的缺点:没有办法对master进行动态选举(master宕机后,需要重新选举master),需要使用sentinel机制完成动态选举。