redis主从复制

前言

前两篇文章分别梳理了redis的键过期策略和redis的持久化技术,今天接着来梳理redis的相关知识,今天梳理的内容是主从复制。梳理之前,我们首先来思考一个问题,主从复制的意义在哪里?其实redis的主从和我们数据库的主从是一样的,我个人的理解主从的目的是读写分离,而读写分离的目的可以提高系统的TPS。无论对于mysql数据库还是redis来说,读的操作都会比写的操作多,而写的操作又常常会阻塞进程,所以读写分离可以提高系统的TPS的。

redis复制

在redis中,用户可以通过执行SLAVEOF命令或者通过slaveof选项让一个服务器去复制另一个服务器,被复制的服务器我们称为主服务器,复制的服务器我们称为从服务器,而这种复制行为我们也称为主从复制。

// 端口号12345的从服务器复制6379的主服务器
127.0.0.1:12345> SLAVEOF 127.0.0.1 6379

从服务器通过复制主服务器来实现主从服务器的数据库状态一致,也即是说在主服务器里写入的数据在从服务器里可以读取到,所以从服务器就可以实现只读的目的。

复制功能的实现

redis的复制功能的实现分为两个版本的不同,2.8版本以前是一种实现,2.8版本以后的是优化后的新实现,在此我们称2.8版本以前的为旧复制功能,2.8版本以后的为新复制。其实新旧复制功能的差异就是新复制对旧复制做了断线后重连的优化。

旧版复制功能的实现
  • 同步,同步操作用于将从服务器的数据库状态更新至主服务器的数据库状态。
  • 命令传播,命令传播操作作用在于主服务器数据库状态修改时,主从服务器数据库状态不一致时,让从服务器将数据库状态更新至主服务器数据库状态。
同步的实现原理

同步的实现是主服务器生成rdb文件并发送给从服务器,从服务器根据主服务器的rdb文件将数据库状态更新为与主服务器一致,但是需要注意的是当主服务器在生成rdb文件时,也会有写的命令进来,这个时候主服务器会讲写的命令保存在缓存区,主服务器在发送rdb文件后,会将缓存区的写命令也发送给从服务器,这样就能保证从服务器的状态和主服务器的状态一致。
在这里插入图片描述

命令传播

当通过同步操作主从服务器的数据库状态达到了一致,但是这个一致并不是一成不变的,每当主服务器的状态发生改变时,主从服务器的数据库状态就不一致了,为了在保证主服务器数据库状态改变后,主从数据库状态仍能一致,主服务器将同步后每次数据库状态变更的命令发送给从服务器,从服务器依据主服务器发送的命令将数据库状态更新至和主服务器一致,这个过程就叫做命令传播

旧复制的缺陷

旧复制的缺陷在于同步操作,而同步操作的实现是基于rdb文件的,这部分实现是很浪费资源的,而且并不是每次同步都需要用依赖所有的主服务器数据的。同步操作发生在两个场景,初次同步断线后重连同步,对于初次同步采用rdb文件来同步确实是可以理解的。但是从服务器每次断线后重连都要重新用rdb文件将数据库状态更新至主服务一致其实没有那么必要,断线的时间越短越没必要。基于这种情况,redis团队设计了部分同步

部分同步

部分同步的目的是将断线期间主服务器的数据库状态变化告知从服务器,从服务器据此将数据库状态更新至与主服务器一致。

部分同步实现原理

部分同步的实现原理由以下三部分结构共同实现:

  • 复制偏移量
  • 复制积压缓存区
  • 运行id

复制偏移量:复制偏移量由主从服务器各维护一个整数值,主服务器的代表的是同步从服务器的数量,从服务器的代表是从服务器接收并更新数据库状态的数量,当两个数一致时,主从数据库状态一致。
在这里插入图片描述
复制积压缓存区:复制积压缓存区是主服务器维护的一个先进先出的队列,里面存放的是最近的同步的数据,默认1M,可以修改,作用是当从服务器断线后重连后比对主从服务器复制偏移量的差值,如果从服务器缺失的数据都在复制积压缓存区,那么就没有必要完全同步,只需要通过部分同步就能将从服务器的数据库状态更新为与主服务器数据库状态一致。
复制缓存区的配置大小一般为,平均断线时间 * 主服务器每秒写命令数,不过一般保险起见会乘2。

运行ID:运行id是40个16进制数,他是redis的进程id,当从服务器向主服务器发起复制请求时,主服务器会将他的运行id发送给从服务器,从服务器保存主服务器的进程id,当从服务器断线后从连到主服务器时会将他保存的进程id发送给主服务器,主服务器比对从服务器发送过来的进程id和自己的进程id,判断是否相同,如果不同,证明从服务器是首次复制,就会执行完全同步,如果相同,再根据复制偏移量和复制积压缓存区判断是否有必要进行完全同步。

新复制功能

通过上面的讲解我们可以知道新复制的优化点在于减少完全同步的次数,因为完全同步首先要生成rdb文件,然后将文件发送给从服务器,最后从服务器解析rdb文件还原数据库状态,这三个操作都是比较耗费资源的,所以新复制尽可能的减少完全同步。

总结

本文主要介绍了redis的主从复制以及实现原理,同时也讲解了新老复制的实现,本文关键字如下:

  • 完全同步
  • 部分同步
  • 复制偏移量
  • 复制积压缓存区
  • 运行id
扫码关注个人公众号

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值