Redis高可用

主从复制,是指将一台Redis服务器的数据,复制到其他Redis服务器。

主从复制的作用主要包括:

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

  • 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

主从复制原理

  • 全量复制。比如第一次同步时

  • 增量复制。只会把主从库网络锻炼期间主库收到的命令,同步给从库。

主库主要用来写

从库用来读

实现读写分离

全量复制

当我们启动多个Redis实例时,他们相互会通过replicaof命令形成主库和从库的关系,之后按照三个阶段完成数据的第一次同步

确认主从关系

第一次同步

三个阶段:

  • 第一阶段建立链接、协商同步

    • 主从建立链接后,从服务器会发送给主服务器psync命令表示要进行数据同步。psync包括两个参数,分别是主服务器的runID复制进度offset

      • runID,每一个Redis服务器在启动时都会自动生产一个随机的ID来唯一标识自己。当从服务器和主服务器第一次同步时,因为不知道主服务器的runID,所以会设置为"?"

      • offset,表示复制进度,第一次同步时值为-1

    • 主服务器收到psync后,会用fullresync命令作为响应给对方,并会携带两个参数:主服务器的runID和主服务器目前的复制进度offset。

    • fullresync 命令的意图是采用全量复制的方式,也就是主服务器会把所有的数据都同步给从服务器。

    • 第一阶段是在为全量复制做准备。

  • 第二阶段是主服务器同步数据给从服务器

    • 主服务器会执行bgsave命令来生成rdb文件,然后把文件发送给从服务器。从库接收到数据后会先把当前数据库清空。

  • 第三阶段是主服务器发送新写操作给从服务器。

    • 当主库完成RDB文件后,就会把此时replication buffer中的修改操作发给从库。

第一次同步结束后,主服务器和从服务器之间会保存tcp连接,用于接下来将主服务器的写操作传递给从服务器

增量复制

主要发生在主从服务器断链,并重新恢复后,进行数据的同步

  • 在主从数据库的网络断开,然后恢复后,从服务器发送psync,请求同步

  • 主服务器接收后,使用continue命令告诉从服务器接下来使用增量复制

  • 主服务器会将主从服务器断线期间的写命令发送给从服务器,然后执行这些命令。

主服务器如何确认发送哪些数据给从服务器?

  • repl_backlog_buffer,是一个「环形」缓冲区,用于主从服务器断连后,从中找到差异的数据;

  • replication offset,标记上面那个缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器使用 master_repl_offset 来记录自己「」到的位置,从服务器使用 slave_repl_offset 来记录自己「」到的位置。

那 repl_backlog_buffer 缓冲区是什么时候写入的呢?

在主服务器进行命令传播时,不仅会将写命令发送给从服务器,还会将写命令写入到 repl_backlog_buffer 缓冲区里,因此 这个缓冲区里会保存着最近传播的写命令。

网络断开后,当从服务器重新连上主服务器时,从服务器会通过 psync 命令将自己的复制偏移量 slave_repl_offset 发送给主服务器,主服务器根据自己的 master_repl_offset 和 slave_repl_offset 之间的差距,然后来决定对从服务器执行哪种同步操作:

  • 如果判断出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将采用增量同步的方式;

  • 相反,如果判断出从服务器要读取的数据已经不存在 repl_backlog_buffer 缓冲区里,那么主服务器将采用全量同步的方式。

当主服务器在 repl_backlog_buffer 中找到主从服务器差异(增量)的数据后,就会将增量的数据写入到 replication buffer 缓冲区,它是缓存将要传播给从服务器的命令。

最后更新于

这有帮助吗?