9. redis replication的完整流运行程和原理深入剖析

复制的完整流程

在这里插入图片描述

  1. slave node启动,仅仅保存master node的信息,包括master nodehost和ip,但是复制流程没开始

master host和ip是从哪儿来的,redis.conf里面的slaveof配置的

  1. slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现,就跟master node建立socket网络连接
  2. slave node发送ping命令给master node
  3. 口令认证,如果master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证
  4. master node第一次执行全量复制,将所有数据发给slave node
  5. master node后续持续将写命令,异步复制给slave node

数据同步相关的核心机制

指的就是第一次slave连接msater的时候,执行的全量复制,那个过程里面你的一些细节的机制

master和slave都会维护一个offset

  1. master会在自身不断累加offset,slave也会在自身不断累加offset
  2. slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset

这个倒不是说特定就用在全量复制的,主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况

backlog

master node有一个backlog,默认是1MB大小
master node给slave node复制数据时,也会将数据在backlog中同步写一份
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触发增量复制

全量复制

  1. master执行bgsave,在本地生成一份rdb快照文件
  2. master node将rdb快照文件发送给salve node,如果rdb复制时间超过默认的60秒(repl-timeout),那么slave node就会认为复制失败,可以适当调节大这个参数
  3. 对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s
  4. master node在生成rdb时,会将所有新的写命令缓存在内存中,在salve node保存了rdb之后,再将新的写命令复制给salve node
  5. client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败
  6. slave node接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务
  7. 如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

rdb生成、rdb通过网络拷贝、slave旧数据的清理、slave aof rewrite,很耗费时间
如果复制的数据量在4G~6G之间,那么很可能全量复制时间消耗到1分半到2分钟

增量复制

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

heartbeat

  1. 主从节点互相都会发送heartbeat信息
  2. master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat

异步复制

  1. master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node
发布了20 篇原创文章 · 获赞 3 · 访问量 4519

猜你喜欢

转载自blog.csdn.net/qq_34246646/article/details/104298031
今日推荐