Redis (二) 主从复制模式

目录

  • 什么是主从复制
  • 主从复制的优缺点
  • 主从复制的实现原理
    • 1. 建立连接
    • 2. 数据同步
      • 全量复制
      • 部分复制
    • 3. 命令传播
  • 主从复制配置
  • 学习参考
  • 结语

Redis有三种集群模式,第一个就是主从复制模式,第二种“哨兵”模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进来的,本篇博客就来说一下Redis第一种集群模式:主从复制模式。

什么是主从复制

通过执行slaveof命令或设置slaveof选项,让一个服务器去复制另一个服务器的数据。被复制的服务器称为:Master主服务;对主服务器进行复制的服务器称为:Slave从服务器。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。在主从复制模式下,即便master宕机了,slave是不能变为主服务器进行写操作的。

一个master可以有多个slave,即一主多从;而slave也可以接受其他slave的连接,形成“主从链”层叠状结构(cascading-like structure),自 Redis 4.0 起,所有的sub-slave也会从master收到完全一样的复制流。如下图
Redis (二) 主从复制模式_第1张图片

主从复制的优缺点

优点:

  • 同一个Master可以同步多个Slaves。
  • 读写分离,负载均衡。主节点负载读写,从节点负责读,提高服务器并发量
  • 高可用基础,是哨兵机制和集群实现的基础

缺点:

  • Master的写的压力难以降低。
    注:虽然也可设定使得slave可写,但在数据的同步等方面使用上都有很多问题。主从模式最为常见的场景就是主写从读的模式,读写分离,降低读的压力。
  • 主节点宕机,无法执行写操作,只能连接从节点进行读操作,需要进行手工干预

主从复制的实现原理

Redis的主从复制过程大体上分3个阶段:建立连接数据同步命令传播

1. 建立连接

这个阶段主要是从服务器发出slaveof命令之后,与主服务器如何建立连接,为数据同步做准备的过程。

  1. 在slaveof命令执行之后,从服务器根据设置的master的ip地址和端口,创建连向主服务器的socket套接字连接,连接成功后,从服务器会为这个套接字关联一个专门的处理器,用于处理后续的复制工作
  2. 建立连接之后,从服务器会向主服务器发送ping命令,确认主服务器是否可用,以及当前是否可用接受处理命令。如果收到主服务器的pong回复说明是可用的,否则有可能是网络超时或主服务器阻塞,从服务器会断开连接发起重连
  3. 身份验证。如果主服务器设置了requirepass选项,那么从服务器必须配置masterauth选项,且保证密码一致才能通过验证
  4. 身份验证完成之后,从服务器会发送自己的监听端口,主服务器会保存下来

2. 数据同步

在主从服务器建立连接确认各自身份之后,就开始数据同步,从服务器向主服务器发送PSYNC命令,执行同步操作,并把自己的数据库状态更新至主服务器的数据库状态。

Redis的主从同步分为:全量复制部分复制

  • runid(replication ID),主服务器运行id,Redis实例在启动时,随机生成一个长度40的唯一字符串来标识当前节点。运行ID的主要作用是来唯一识别redis节点,比如从节点保存主节点的运行ID识别自已正在复制是哪个主节点。如果只使用ip+port的方式识别主节点,那么主节点重启变更了整体数据集(如替换RDB/AOF文件),从节点再基于偏移量复制数据将是不安全的,因此当运行ID变化后从节点将做全量复制。可以在info
    server命令查看当前节点的运行ID。需要注意的是redis关闭再启动,运行的id会随之变化。
  • offset,复制偏移量。主服务器和从服务器各自维护一个复制偏移量,记录传输的字节数。当主节点向从节点发送N个字节数据时,主节点的offset增加N,从节点收到主节点传来的N个字节数据时,从节点的offset增加N
  • replication backlog buffer,复制积压缓冲区。是一个固定长度的FIFO队列,大小由配置参数repl-backlog-size指定,默认大小1MB。需要注意的是该缓冲区由master维护并且有且只有一个,所有slave共享此缓冲区,其作用在于备份最近主库发送给从库的数据

全量复制

有两种情况下是完整重同步,一是slave连接上master第一次复制的时候;二是如果当主从断线,重新连接复制的时候有可能是完整重同步,

全量复制的步骤
Redis (二) 主从复制模式_第2张图片

  1. 服务器连接主服务器,发送PSYNC命令
  2. 主服务器接收到PSYNC命名后,开始执行bgsave命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
  3. 主服务器basave执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
  4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
  5. 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
  6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令

部分复制

部分复制是用于处理断线后重复制的情况。

当slave连接到master,会执行PSYNC < runid > < offset >发送记录旧的master的runid(replication ID)和偏移量offset,这样master能够只发送slave所缺的增量部分。但是如果master的复制积压缓存区没有足够的命令记录,或者slave传的runid(replication ID)不对,就会进行完整重同步,即slave会获得一个完整的数据集副本

部分复制的步骤
Redis (二) 主从复制模式_第3张图片
PSYNC命令执行完整重同步和部分重同步的流程图:
Redis (二) 主从复制模式_第4张图片

3. 命令传播

当完成数据同步之后,主从服务器的数据暂时达到一致状态,当主服务器执行了客户端的写命令之后,主从的数据便不再一致。为了能够使主从服务器的数据保持一致性,主服务器会对从服务器执行命令传播操作,即每执行一个写命令就会向从服务器发送同样的写命令。

在命令传播阶段,从服务器会默认以每秒一次的频率向主服务器发送心跳检测

REPLCONF ACK <replication_offset>

//其中replication_offset是当前从服务器的复制偏移量

发送REPLCONF ACK命令对于主从服务器有三个作用:

  1. 检测主从服务器的网络连接状态
  2. 辅助实现min-slaves选项
  3. 检测命令丢失

主从复制配置

配置详见:https://www.jianshu.com/p/4e99c7dec8e3

学习参考

https://www.jianshu.com/p/4e99c7dec8e3

https://www.jianshu.com/p/4e99c7dec8e3

结语

其实redis的主从模式很简单,在实际的生产环境中是很少使用的,也不建议在实际的生产环境中使用主从模式来提供系统的高可用性,之所以不建议使用都是由它的缺点造成的,在数据量非常大的情况,或者对系统的高可用性要求很高的情况下,主从模式也是不稳定的。虽然这个模式很简单,但是这个模式是其他模式的基础,所以必须深刻的理解,对其他模式的学习才会有帮助作用。

你可能感兴趣的:(redis,redis,java)