Redis高可用
主从复制,是指将一台Redis服务器的数据,复制到其他Redis服务器。
主从复制的作用主要包括:
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从复制原理
全量复制。比如第一次同步时
增量复制。只会把主从库网络锻炼期间主库收到的命令,同步给从库。
主库主要用来写
从库用来读
实现读写分离
全量复制
当我们启动多个Redis实例时,他们相互会通过replicaof命令形成主库和从库的关系,之后按照三个阶段完成数据的第一次同步
确认主从关系
第一次同步
三个阶段:
第一阶段建立链接、协商同步
主从建立链接后,从服务器会发送给主服务器
psync命令表示要进行数据同步。psync包括两个参数,分别是主服务器的runID和复制进度offsetrunID,每一个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 缓冲区,它是缓存将要传播给从服务器的命令。
最后更新于
这有帮助吗?