Redis核心技术笔记——Redis主从、主从从、切片集群

1.Redis主从集群

​ 首先我们来谈谈Redis的高可靠性,Redis的高可靠性其实有两层含义

  • 一是保证数据尽量少丢失或者不丢失,AOF和RDB持久化保证了
  • 二是服务尽量少中断,Redis采用了增加副本冗余量(集群就是为了解决服务中断的问题)

什么是增加副本冗余量将一份数据同时保存在多个实例上。即使有一个实例出现了故障,需要过一段时间才能恢复,其他实例也可以对外提供服务,不会影响业务使用。其实这也就是Redis的主从集群

1.1主从集群是如何保证数据的一致性——采用了读写分离

​ 多实例保存同一份数据,听起来好像很不错,但是,我们必须要考虑一个问题:这么多副本,它们之间的数据如何保持一致呢?数据读写操作可以发给所有的实例吗?

Redis的主从集群,为了保证从节点的数据副本的一致性,主从库之间采用的是读写分离的方式。

  • 读操作:主库、从库都可以接收;
  • 写操作:首先到主库执行,然后,主库将写操作同步给从库。

Redis核心技术笔记——Redis主从、主从从、切片集群_第1张图片

​ 为什么要采用读写分离的方式?

​ 你可以设想一下,如果在上图中,不管是主库还是从库,都能接收客户端的写操作,那么,一个直接的问题就是:如果客户端对同一个数据(例如k1)前后修改了三次,每一次的修改请求都发送到不同的实例上,在不同的实例上执行,那么,这个数据在这三个实例上的副本就不一致了(分别是v1、v2和v3)。在读取这个数据的时候,就可能读取到旧的值。

​ 如果我们非要保持这个数据在三个实例上一致,就要涉及到加锁、实例间协商是否完成修改等一系列操作,但这会带来巨额的开销,当然是不太能接受的。

  • 1.为了避免主从库之间出现数据不一致问题
  • 2.为了避免主从库之间加锁、协商带来的额外消耗

而主从库模式一旦采用了读写分离,所有数据的修改只会在主库上进行,不用协调三个实例。主库有了最新的数据后,会同步给从库,这样,主从库的数据就是一致的。

​ 那么,主从库同步是如何完成的呢?主库数据是一次性传给从库,还是分批同步?要是主从库间的网络断连了,数据还能保持一致吗?我们先来看看主从库间的第一次同步是如何进行的,这也是Redis实例建立主从库模式后的规定动作。

1.2主从库之间如何进行第一次同步

​ 当我们启动多个Redis实例的时候,它们相互之间就可以通过replicaof(Redis 5.0之前使用slaveof)命令形成主库和从库的关系,之后会按照三个阶段完成数据的第一次同步。

​ 例如,现在有实例1(ip:172.16.19.3)和实例2(ip:172.16.19.5),我们在实例2上执行以下这个命令后,实例2就变成了实例1的从库,并从实例1上复制数据:

replicaof  172.16.19.3  6379

​ 接下来,我们就要学习主从库间数据第一次同步的三个阶段了。你可以先看一下下面这张图,有个整体感知,接下来我再具体介绍。

img

​ 第一阶段是主从库间建立连接、协商同步的过程,主要是为全量复制做准备。在这一步,从库和主库建立起连接,并告诉主库即将进行同步,主库确认回复后,主从库间就可以开始同步了

​ 具体来说,从库给主库发送psync命令,表示要进行数据同步,主库根据这个命令的参数来启动复制。psync命令包含了主库的runID复制进度offset两个参数。

  • runID,是每个Redis实例启动时都会自动生成的一个随机ID,用来唯一标记这个实例。当从库和主库第一次复制时,因为不知道主库的runID,所以将runID设为“?”。
  • offset,此时设为-1,表示第一次复制

主库收到psync命令后,会用FULLRESYNC响应命令带上两个参数:主库runID和主库目前的复制进度offset,返回给从库。从库收到响应后,会记录下这两个参数。

​ 这里有个地方需要注意,FULLRESYNC响应表示第一次复制采用的全量复制&#

你可能感兴趣的:(笔记,java,redis,数据库架构)