美文网首页
四、Redis 的主从集群

四、Redis 的主从集群

作者: 从不中二的忧伤 | 来源:发表于2021-06-07 15:39 被阅读0次

    之前提到过,Redis 具有高可靠性,除了数据少丢失,这里还有一层含义,就是 服务尽量少中断。之前提到的 AOF日志和 RDB快照,都是为了实现数据的持久化。 而本文要探讨的,就是 Redis 是如何减少中断的。

    Redis 的主从库模式

    Redis 提供了主从库模式,将一份数据,同时保存在了多个实例上,以保证其中一个实例出故障时,其他实例也能提供服务,不影响使用。

    而Redis的主从库模式,有几个主库?有几个从库? 主从库分别能提供什么服务?主库是如何将数据同步给从库的? 这些都是要探讨的问题。

    Redis 的主从读写分离
    Redis 是一个主库,对应到多个从库。其中,主库可以处理读、写操作,而从库只处理读操作

    这是因为,如果主从库都处理写操作,那么就可能导致主从库之间的数据不一致,此时就无法判断,到底以哪个库的数据为准。

    写操作只在主库上执行,执行完成后,同步给各个从库,这样,就能保证主从库的数据是一致的。

    主库如何将数据同步给从库

    首先,启动多个 redis 实例,通过 replicaof 命令形成主库和从库的关系,此时就开始了主从库之间的第一次数据同步。

    主从库的第一次数据同步,分为三个阶段:
    一、主从库之间建立连接:从库向主库发起连接请求,并通知主库进行数据同步,主库确认回复。
    从库向主库发起 psync 请求,带上了主库的 runID 和 复制进度 offset (offset = -1 时,代表第一次数据同步)
    主库收到 psync 请求,通过 FULLRESYNC 响应,并带上主库 runID 和 主库目前的复制进度 offset。

    二、主库将所有数据同步给从库:主库执行 bgsave 命令,生成 RDB 文件,将此文件发送给从库。 从库将 RDB 文件的数据加载到内存中。

    三、主库发送新的写命令给从库:在生成 RDB 文件时,主库依然会处理写操作请求,在此过程中发生的新的写操作,会记在 replication buffer 中,然后将 replication buffer 中的修改操作发送给从库。从库再执行这些新的命令。包括在后续的主从库数据同步中,都通过这个 replication buffer 同步。

    主-从-从 模式
    主库生成 RDB 和传输 RDB,都会有 fork 子进程操作阻塞主线程。 如果从库的数量很多,就会阻塞掉主库的正常请求。

    实际上,Redis 是支持 从库的级联的,也就是,从库也可以有它的从库。这样一来,生成和传输 RDB 文件的压力,就下放到了从库上。

    主从库之间连接断了怎么办
    主从同步过程中,如果网络连接断了,那么主库新到来的写操作,就无法同步到从库中。后续主从库再连上,数据也是不一致了,这该怎么办呢?

    实际上,主库在接收到新的写命令时,不仅会将其写入 replication buffer,也会写入 repl_backlog_buffer。

    repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库会记录自己读到的位置。
    主库对应的偏移量是 master_repl_offset,而从库对应的是 slave_repl_offset。

    正常情况下,主库在发送写命令给从库时,会带上这个 repl_backlog_buffer 对应的 offset 值。此时主从库的 offset 值是相等的。

    主从库断连后,主库依然会把 offset 值写入 repl_backlog_buffer 中。

    主从库恢复连接后,从库会把 slave_repl_offset 发给主库,主库再将 master_repl_offset 和 slave_repl_offset 之间产生的命令操作同步给从库。

    但是,因为 repl_backlog_buffer 是环形缓冲区,其空间是有限的,主从库上的 offset 在环形缓存区取模后,就能找到对应的位置。当发现环形缓冲区已经被写满覆盖了,就无法通过 repl_backlog_buffer 同步写命令。此时,只能通过重新生成并发送 RDB 文件使从库恢复数据了。

    相关文章

      网友评论

          本文标题:四、Redis 的主从集群

          本文链接:https://www.haomeiwen.com/subject/cbwmsltx.html