Redis主从复制的原理

在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种模式叫做主从复制模式。

数据流向是单向的,只能是从master到slave

一个slave只能有一个master

主从复制的作用

  • 为数据提供多个副本,实现高可用

  • 实现读写分离(主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性)

主从复制的方式

  • 命令slaveof。
    优点:无需重启。缺点:不便于管理

     

  •  
    // 命令行使用	
    slaveof ip port // 使用命令后自身数据会被清空,但取消slave只是停止复制,并不清空
  • 修改配置。
    优点:统一配置。缺点:需要重启

     

  •  
    // 配置文件中配置	
    slaveof ip port	
    slave-read-only yes //只允许从节点进行读操作

全量复制

用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作,当数据量较大时,会对主从节点和网络造成很大的开销

640?wx_fmt=png

全量复制过程:

  1. Redis内部会发出一个同步命令,刚开始是Psync命令,Psync ? -1表示要求master主机同步数据

  2. 主机会向从机发送run_id和offset,因为slave并没有对应的 offset,所以是全量复制

  3. 从机slave会保存主机master的基本信息

  4. 主节点收到全量复制的命令后,执行bgsave(异步执行),在后台生成RDB文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令

  5. 主机发送RDB文件给从机

  6. 发送缓冲区数据

  7. 刷新旧的数据。从节点在载入主节点的数据之前要先将老数据清除

  8. 加载RDB文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据的加载。

全量复制开销

  • 主节点需要bgsave

  • RDB文件网络传输占用网络io

  • 从节点要清空数据

  • 从节点加载RDB

  • 全量复制会触发从节点AOF重写

部分复制

部分复制是Redis 2.8以后出现的,用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销,需要注意的是,如果网络中断时间过长,造成主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制

640?wx_fmt=png

部分复制过程:

  1. 如果网络抖动(连接断开 connection lost)

  2. 主机master 还是会写 repl_back_buffer(复制缓冲区)

  3. 从机slave 会继续尝试连接主机

  4. 从机slave 会把自己当前 run_id 和偏移量传输给主机 master,并且执行 pysnc 命令同步

  5. 如果master发现你的偏移量是在缓冲区的范围内,就会返回 continue命令

  6. 同步了offset的部分数据,所以部分复制的基础就是偏移量 offset。

服务器运行ID(run_id):每个Redis节点(无论主从),在启动时都会自动生成一个随机ID(每次启动都不一样),由40个随机的十六进制字符组成;run_id用来唯一识别一个Redis节点。 通过info server命令,可以查看节点的run_id。

Redis复制的核心机制

  1. Redis采用异步方式复制数据到slave节点。从Redis2.8开始,slave节点会周期性地确认每次复制的数据量。
  2. 一个master节点是可以配置多个slave节点的。
  3. slave节点做复制的时候,是不会block master节点的正常工作的。
  4. slave节点在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了。
  5. slave节点主要用来进行横向扩容,做读写分离,扩容的slave节点可以提高读的吞吐量。

 

开发运维常见的问题

  1. 读写分离

  • 复制数据存在延迟(如果从节点发生阻塞)

  • 从节点可能发生故障

  1. 主从配置不一致

  • 例如maxmemory不一致,可能会造成丢失数据

  • 例如数据结构优化参数不一致:造成主从内存不一致

  1. 规避全量复制

  • 第一次全量复制不可避免,所以分片的maxmemory减小,同时选择在低峰(夜间)时,做全量复制。

  • 复制积压缓冲区不足 增大复制缓冲区配置rel_backlog_size

例如:如果网络中断的平均时间是60s,而主节点平均每秒产生的写命令(特定协议格式)所占的字节数为100KB,则复制积压缓冲区的平均需求为6MB,保险起见,可以设置为12MB,来保证绝大多数断线情况都可以使用部分复制。

  1. 复制风暴 master节点重启,master节点生成一份rdb文件,但是要给所有从节点发送rdb文件。对cpu,内存,带宽都造成很大的压力

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值