Redis进阶学习之主从复制、读写分离

Redis基础与使用SpringBoot整合Redis
Redis进阶学习之数据持久化
Redis进阶学习之主从复制、读写分离
Redis进阶学习之哨兵模式和分片集群
Redis主从复制集群搭建
Redis哨兵集群搭建
Redis分片集群搭建
Redis使用RedisTemplate配置和访问集群
Redis缓存策略
Redis缓存异常场景分类

3. Redis主从复制、读写分离

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
Redis进阶学习之主从复制、读写分离_第1张图片

3.1.主从复制数据同步原理

3.1.1. 全量同步

主从第一次同步是全量同步:

同步过程

  • slave节点请求增量同步(发送的是增量同步指令)
  • master节点判断replid,发现不一致,拒绝增量同步
  • master将完整内存数据生成RDB,发送RDB到slave
  • slave清空本地数据,加载master的RDB
  • master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
  • slave执行接收到的命令,保持与master之间的同步

Redis进阶学习之主从复制、读写分离_第2张图片

  • Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
  • offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
  • psync replid offset 是请求增量同步的指令

因此slave做数据同步,必须向master声明自己的replid 和offset,master才可以判断到底需要同步哪些数据。

3.1.2. 增量同步

主从第一次同步是全量同步,slave重启后,并且在repl_baklog中能找到offset时,则执行增量同步(重启时会去执行存储的RDB文件)。slave节点断开时间太久,repl_baklog中的offset已经被覆盖时执行全量同步。
Redis进阶学习之主从复制、读写分离_第3张图片

3.1.3. repl_baklog

repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步。

Redis进阶学习之主从复制、读写分离_第4张图片

  1. repl_baklog文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组头部的数据就会被覆盖。
  2. repl_baklog中会记录Redis处理过的命令日志及offset,包括master当前的offset,和slave已经拷贝到的offset;随着不断有数据写入,master的offset逐渐变大,slave也不断的拷贝,追赶master的offset。
  3. 当salve中的offset始终存在,未被master覆盖时,salve宕机重启依旧可以从offset开始同步。
  4. 当salve宕机时间过长,导致offset被master覆盖,则无法基于log做增量同步,只能再次全量同步。

3.2. Redis主从集群优化

  • 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
  • Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
  • 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构(主节点连接从节点,从节点之后再连接从节点,第二层的从节点从第一层从节点进行数据同步),减少master压力

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