Redis主从复制与一致性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis主从复制与一致性相关的知识,希望对你有一定的参考价值。

参考技术A 数据的同步过程一般都涉及到全量数据的迁移以及后续增量数据的同步。

在主Master接收到SYNC命令之后,它会执行bgsave在后台生成一个RDB文件,并且使用一个缓冲区记录从现在开始执行所有写命令。当bgsave生成的RDB文件完成了之后,它就发送给从服务器去进行载入。在更新状态完成之后,Master再将记录在缓冲区里面的新命令发送给从服务器,这样从服务器进行执行,主从服务器就保持了一致状态。
从服务器到主服务器的复制可以分为两种情况:

为了解决SYNC在处理断线重复制时候的低效问题,Redis从2.8版本之后开始使用PSYNC命 令,它支持完整重同步和部分重同步。 完整重同步和SYNC一样,部分重同步就是在处理断 线重新连接之后,主节点只向从节点发送链接断开期间的写命令,它的实现基于以下三部分:

缺点:

注:上述所有场景的前提是数据依然保存在backlog中,否则还是会进行完全重同步。

如果slave可以收到每条传播指令,并执行成功,便可以保持与master的数据一致状态。但是master并不等待slave节点的返回,master与slave是通过网络通信,由于网络抖动等因 素,命令传播过程不保证slave真正接收到,那如何在传播阶段确保主从数据一致呢?
在命令传播阶段,每隔一秒slave节点向master节点发送一次心跳信息,命令格式为 REPLCONF ACK <offset>。其中offset指从节点保存的复制偏移量。REPLCONF ACK命令的作用包括:

在全量复制阶段,主节点会将执行的写命令放到复制缓冲区中,该缓冲区存放的数据包括了以下几个时间段内主节点执行的写命令:bgsave生成RDB文件、RDB文件由主节点发往从 节点、从节点清空老数据并载入RDB文件中的数据。当主节点数据量较大,或者主从节点之间网络延迟较大时,可能导致该缓冲区的大小超过了限制,此时主节点会断开与从节点之间的连接;这种情况可能引起全量复制→复制缓冲区溢出导致连接中断→重连→全量复制→复制缓冲区溢出导致连接中断......的循环。
复制缓冲区的大小由client-output-buffer-limit slavehard limitsoft limitsoft seconds配 置,默认值为client-output-buffer-limit slave 256MB 64MB 60,其含义是:如果buffer大于 256MB,或者连续60s大于64MB,则主节点会断开与该从节点的连接。该参数是可以通过 config set命令动态配置的(即不重启Redis也可以生效)。

Redis为复制积压缓冲区设置的默认大小为1MB,如果主服务器需要执行大量写命令,又或者主从服务器断线后重连接所需的时间比较⻓,那么这个大小也许并不合适。如果复制积压 缓冲区的大小设置得不恰当,那么PSYNC命令的复制重同步模式就不能正常发挥作用,正确估算和设置复制积压缓冲区的大小非常重要。
复制积压缓冲区的最小大小可以根据公式second*write_size_per_second 来估算:

Redis 复制 与 集群

主从复制

  Redis支持一主多从的主从复制架构。一个Master示例负责所有的写请求,然后将写操作同步到所有的slave。

  可以实现读写分离。

  可以实现高可用,但是不是强一致性

  借助Redis Sentinel实现高可用,当Master crash后,能自动将一个Slave晋升为Master。

集群分片

  采用集群分片可以扩展容量和并发量。

  一般可分为客户端分片,大多以代理的方式来实现,如Twemproxy;另外官方也提供了Redis Cluster方案。

Redis Cluster

  a.能自动将数据分散在多个节点上

  b.当访问的key不在当前分片上时,能自动将请求转发到正确的分片上

  c.当集群中部分节点失效时仍能提供服务(主从复制实现,没有Sentinel,由Redis Cluster实现failover)

  原理:Redis Cluster有16384个hash slot,Redis会计算每个key的CRC16,将结果与16384取模,来决定该key存储在哪个hash slot中;同时需要制定每个数据分片负者的slot数。

 

  

以上是关于Redis主从复制与一致性的主要内容,如果未能解决你的问题,请参考以下文章

Redis集群模式1-主从复制+哨兵机制

Redis主从复制

Redis系列八:redis主从复制和哨兵

Redis---主从复制

redis应用之主从架构配置

redis主从和哨兵