redis实战--redis主从复制实现读写分离(原理)

前言

一般对于高并发的系统来说,搭建一个健壮的缓存系统是不可避免的。单机的reids的QPS可能只能上万,如果有再高并发的场景,单机是不能搞定的,就会有它的系统瓶颈。一般来说缓存是用来支撑高并发读,这时候我们可能就会想到读写分离;读写分离是用来处理读的并发量大,而写的并发量小的场景。 我们知道数据库可以通过主从复制,读写分离,以及分库分表来减轻流量的压力,可以看下这篇文章数据库主从复制,读写分离,分库分表;那么下面来简单介绍下redis主从复制和读写分离的原理。

replication的核心机制

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

主从复制的核心流程

这里写图片描述

概要流程:
1. slave服务器配置master的连接信息(slaveof属性);
2. slave连接上master,发送psync指令
3. master判断是否为全量复制:如果是全量复制,则进入下一步;否则可以看增量复制的子流程。
4. master启动一个后台线程,生成一份RDB快照文件,同时将从客户端收到的所有写命令缓存在内存中。
5. RDB文件生成完毕之后,master会将RDB发送给slave。
6. slave收到RDB文件之后,清空自己的旧数据,然后持久化到本地磁盘,再从本地磁盘加载到内存中。
7. 最后salve node保存了RDB文件之后,master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
8. 如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

增量复制子流程:如果全量复制过程中,master-slave网络连接断掉,salve重新连接master时,会触发增量复制;master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB;msater就是根据slave发送的psync中的offset来从backlog中获取数据的

断点续传
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制;如果没有找到对应的offset,那么就会执行一次full resynchronization。

无磁盘化复制
master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了
repl-diskless-sync
repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来

过期key处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。

其他概念

主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。 master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node

扫描二维码关注公众号,回复: 2592383 查看本文章

offset
master会在自身不断累加offset,slave也会在自身不断累加offset
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况
backlog
master node有一个backlog,默认是1MB大小;master node给slave node复制数据时,也会将数据在backlog中同步写一份;主要是用来做全量复制中断候的增量复制的
master run id
info server,可以看到master run id
如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制
如果需要不更改run id重启redis,可以使用redis-cli debug reload命令
psync
从节点使用psync从master node进行复制,psync runid offset
master node会根据自身的情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,可能是CONTINUE触发增量复制

猜你喜欢

转载自blog.csdn.net/xuxian6823091/article/details/81195231