Redis学习笔记---Redis的主从复制

Redis学习笔记—Redis的主从复制

1.Redis的高可用性

  1. 高可用性(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
  2. Reids保证的是分布式理论中CAP的A,并且Redis是AP模型
  3. 但是单机的Redis是无法保证高可用性的,当Redis服务器宕机后,即使在有持久化的机制下也无法保证不丢失数据,所以我们采用Redis多机和集群的方式来保证Redis的高可用性。
  4. 单进程+单线程 + 多机 (集群)

2.Redis主从复制介绍

  1. Redis支持主从复制功能,可以通过执行slaveof(Redis5以后改成replicaof)或者在配置文件中设置slaveof(Redis5以后改成replicaof)来开启复制功能。

3.2.Redis主从复制的配置

  1. 主Redis:无需配置
  2. 从Redis:修改从服务器上的 redis.conf 文件
    # slaveof <masterip> <masterport> # 
    表示当前【从服务器】对应的【主服务器】的IP是192.168.10.135,端口是6379。 
    replicaof 127.0.0.1 6379
    

4.Redis主从复制作用

  1. 读写分离:一主多从,主从同步,主负责写,从负责读,提升Redis的性能和吞吐量,但还是要考虑主从的数据一致性问题
  2. 数据容灾:从机是主机的备份,主机宕机,从机可读不可写,默认情况下主机宕机后,从机不可为主机,但利用哨兵可以实现主从切换,做到高可用

5.Redis主从复制的原理与实现----复制流程

1. 保存主节点信息
  1. 当客户端向从服务器发送slaveof(replicaof)主机地址(127.0.0.1) 端口(6379)时:从服务器将主机ip(127.0.0.1)端口(6379)保存到redisServermasterhostmasterport中。
    Struct redisServer{ 
    char *masterhost;     //主服务器ip 
    int masterport;       //主服务器端口 
    } ;
    
  2. 从服务器将向发送SLAVEOF命令的客户端返回OK,表示复制指令已经被接收,而实际上复制工作是在OK返回之后进行。
2. 建立socket连接:主从复制过程就是建立一个socket连接
  1. slaver与master建立socket连接
  2. slaver这边会建立一个文件时间处理器,这个处理器用来存放master传过来的rdb文件(全量复制(rdb)),接收master传播过来的写命令(增量复制)
  3. 主服务器accept从服务器Socket连接后,创建相应的客户端状态。相当于从服务器是主服务器的Client端。
    在这里插入图片描述
  4. 主服务器就监听accept,所以说主从复制自就是一个socket连接,从服务器变成client,主服务器变成server
    在这里插入图片描述
3. 发送ping命令:主从连接之后的状态判断
  1. Slaver向Master发送ping命令
    1. 检测socket的读写状态
    2. Master能否正常处理
  2. Master的响应
    1. 发送“pong” , 说明正常
    2. 返回错误(error),说明Master不正常
    3. timeout,说明网络超时
      在这里插入图片描述
4.权限验证
  1. 主从正常连接后,进行权限验证
  2. 主未设置密码(requirepass=“”) ,从也不用设置密码(masterauth=“”)
  3. 主设置密码(requirepass!=""),从需要设置密码(masterauth=主的requirepass的值)或者从通过auth命令向主发送密码
    在这里插入图片描述
5.发送端口信息
  1. 在身份验证步骤之后,从服务器将执行命令REPLCONF listening-port,向主服务器发送从服务器的监听端口号。
6.同步数据
  1. Redis 2.8之后分为全量同步和增量同步,具体的后面详细讲解。
7.命令传播
  1. 当同步数据完成后,主从服务器就会进入命令传播阶段,主服务器只要将自己执行的写命令发送给从服务器,而从服务器只要一直执行并接收主服务器发来的写命令。

6.Redis主从复制的原理与实现----同步数据集

新版,Redis 2.8以后的实现方式,使用PSYNC命令,具备完整重同步和部分重同步模式。
  1. Redis 的主从同步,分为全量同步和增量同步。
  2. 只有从机第一次连接上主机是全量同步。
  3. 断线重连有可能触发全量同步也有可能是增量同步( master 判断 runid 是否一致)。
  4. 除此之外的情况都是增量同步。
    在这里插入图片描述
全量同步

Redis 的全量同步过程主要分三个阶段:

  1. 同步快照阶段: Master 创建并发送快照RDB给 Slave , Slave 载入并解析快照。 Master 同时将此阶段所产生的新的写命令存储到缓冲区。
  2. 同步写缓冲阶段: Master 向 Slave 同步存储在缓冲区的写操作命令。
  3. 同步增量阶段: Master 向 Slave 同步写操作命令。
    在这里插入图片描述
增量同步
  1. Redis增量同步主要指Slave完成初始化后开始正常工作时, Master 发生的写操作同步到 Slave 的过程。
  2. 通常情况下, Master 每执行一个写命令就会向 Slave 发送相同的写命令,然后 Slave 接收并执行。

7.Redis主从复制的原理与实现----心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送命令:
replconf ack <replication_offset> 
#ack :应答 
#replication_offset:从服务器当前的复制偏移量
主要作用有三个:
  1. 检测主从的连接状态:检测主从服务器的网络连接状态
    1. 通过向主服务器发送INFO replication命令,可以列出从服务器列表,可以看出从最后一次向主发送命令距离现在过了多少秒。lag的值应该在0或1之间跳动,如果超过1则说明主从之间的连接有故障。
  2. 辅助实现min-slaves
    1. Redis可以通过配置防止主服务器在不安全的情况下执行写命令
      min-slaves-to-write 3 (min-replicas-to-write 3 ):括号前是版本5之前
      min-slaves-max-lag 10 (min-replicas-max-lag 10):括号前是版本5之前
    2. 上面的配置表示:从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令。这里的延迟值就是上面INFOreplication命令的lag值。
  3. 检测命令丢失
    如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。(补发) 网络不断增量同步:网断了,再次连接时
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值