Redis主从复制工作原理以及常见问题
时间:2020-06-02 10:19
相信很多小伙伴都已经配置过主从复制,但是对于redis主从复制的工作流程和常见问题很多都没有深入的了解。咔咔这次用时俩天时间给大家整理一份redis主从复制的全部知识点。 本文实现所需环境 centos7.0 redis4.0 主从复制就是现在有俩台redis服务器,把一台redis的数据同步到另一台redis数据库上。前者称之为主节点(master),后者为从节点(slave)。数据是只能master往slave同步单向。 但是在实际过程中是不可能只有俩台redis服务器来做主从复制的,这也就意味这每台redis服务器都有可能会称为主节点(master) 下图案例中,我们的slave3既是master的从节点,也是slave的主节点。 先知道这么个概念,更多详解继续查看下文。 假设我们现在就一台redis服务器,也就是单机状态。 在这种情况下会出现的第一个问题就是服务器宕机,直接导致数据丢失。如果项目是跟¥占关系的,那造成的后果就可想而知。 第二个情况就是内存问题了,当只有一台服务器时内存肯定会到达峰值的,不可能对一台服务器进行无限升级的。 所以针对以上俩个问题,我们就多准备几台服务器,配置主从复制。将数据保存在多个服务器上。并且保证每个服务器的数据是同步的。即使有一个服务器宕机了,也不会影响用户的使用。redis可以继续实现高可用、同时实现数据的冗余备份。 这会应该会有很多疑问,master跟slave怎么连接呢? 如何同步数据呢? 假如master服务器宕机了呢?别着急,一点一点解决你的问题。 在上边我们说了为什么使用redis的主从复制,那么主从复制的作用就是针对为什么使用它来讲了。 说了这么多,我们先简单的配置一个主从复制案例,然后在谈实现的原理。 redis存储路径为:usr/local/redis 日志跟配置文件存储在:usr/local/redis/data 首先我们先配置俩个配置文件,分别为redis6379.conf 和 redis6380.conf 修改配置文件,主要就是修改端口。为了查看方便在把日志文件和持久化文件的名字都用各自的端口来做标识。 然后分别开启俩个redis服务,一个端口为6379,一个端口为6380。执行命令 这个时候我们就成功的配置了俩个redis服务,一台为6380,一台为6379,这里只是为了演示。实际工作中是需要配置在俩台不同的服务器的。 我们先得有一个概念,就是在配置主从复制时,所有的操作都是在从节点来操作,也就是slave。 那么我们在从节点执行一个命令为 我们先测试一下看是否实现主从复制。在master这台服务器上执行俩个 在使用配置文件启动主从复制之前呢!先需要把之前使用客户端命令行连接的断开,在从主机执行 在哪可以查看从节点已经断开了主节点呢!在主节点的客户端输入命令行 这张图是使用从节点使用客户端命令行连接主节点后,在主节点的客户端输入 这个图是在从节点执行完 在根据配置文件启动redis服务, 当在从节点重新启动后就可以在主节点直接查看到从节点的连接信息。 测试数据,主节点写的东西,从节点还是会自动同步的。 这种方式配置也是很简单,在启动redis服务器时直接就启动主从复制,执行命令: 这个是主节点的日志信息 这个是从节点的信息,其中有连接主节点信息,还有RDB快照保存。 主从复制完整的工作流程分为以下三个阶段。每一段都有自己的工作内部工作流程,那么我们会对着三个过程进程谈论。 上图是一个完整主从复制建立连接工作流程。然后使用简短的话语来描述上边的工作流程。 在建立连接的过程中,从节点会保存master的地址和端口、主节点master保存从节点slave的端口。 这张图是详细描述第一次从节点连接主节点时的数据同步过程。 当从节点第一次连接主节点时,先会执行一次全量复制这次的全量复制是无法避免的。 全量复制执行完成后,主节点就会发送复制积压缓冲区的数据,然后从节点就会执行bgrewriteaof恢复数据,这也就是部分复制。 在这个阶段提到了三个新点,全量复制、部分复制、复制缓冲积压区。会在下文的常见问题里详细说明这几个点。 当master数据库被修改后,主从服务器的数据不一致后,此时就会让主从数据同步到一致,这个过程称之为命令传播。 master会将接收到的数据变更命令发送给slave,slave接收命令后执行命令,让主从数据达到一致。 命令传播阶段的部分复制 这个过程就是主从复制最齐全的流程讲解。那么下来我们对每一步进程简单的介绍 1-4是全量复制 5-8是部分复制 在主节点的第3步下面 主节点在主从复制的期间是一直在接收客户端的数据,主节点的offset是一直变化的。只有有变化就会给每个slave进行发送,这个发送的过程称之为心跳机制 在命令传播阶段是,主节点与从节点之间一直都需要进行信息互换,使用心跳机制进行维护,实现主节点和从节点连接保持在线。一、什么是Redis主从复制?
二、为什么需要Redis主从复制?
三、Redis主从复制的作用
四、配置Redis主从复制
redis-server redis6380.conf
,然后使用redis-cli -p 6380
连接,因为redis的默认端口就是6379所以我们启动另外一台redis服务器直接使用redis-server redis6379.conf
然后直接使用redis-cli
直接连接就可以。1. 使用客户端命令行启动
slaveof 127.0.0.1 6379
,执行完就代表我们连接上了。set kaka 123 和 set master 127.0.0.1
,然后在slave6380端口是可以成功获取到的,也就说明我们的主从复制就已经配置完成了。但是在实现生产环境可不是就这样完事了,后边会在进一步对主从复制进行优化,直到实现高可用。2. 使用配置文件启用
slaveof no one
即可断开主从复制。info
查看info
打印的信息,可以看到有一个slave0的一个信息。slaveof no one
后,在主节点打印的info
,说明从节点已经跟主节点断开连接了。redis-server redis6380.conf
3. 启动redis服务器时启动
redis-server --slaveof host port
即可。4. 主从复制启动后的日志信息查看
五、主从复制工作原理
1. 主从复制的三个阶段
2. 第一阶段:建立连接过程
3. 第二阶段:数据同步阶段过程
4. 第三阶段:命令传播阶段
六. 详细介绍主从复制原理(全量复制+部分复制)
psync ? 1 psync runid offset
找对应的runid
索取数据。但是这里可以考虑一下,当从节点第一次连接的时候根本就不知道主节点的runid 和 offset
。所以第一次发送的指令是psync ? 1
意思就是主节点的数据我全要。psync runid offset
2
继续执行全量复制。这里的runid不匹配只有的可能是从节点重启了这个问题后边会解决,offset(偏移量)不匹配就是复制积压缓冲区溢出了。 如果runid或offset校验通过,从节点的offset和主节点的offset相同时则忽略。 如果runid或offset检验通过,从节点的offset与offset不相同,则会发送 +CONTINUE offset(这个offset为主节点的),通过socket发送复制缓冲区中从节点offset到主节点offset的数据。七. 心跳机制