1.主从架构的核心原理:

当启动一个salve node时会发送PSYNC 命令到master。
salve第一次连接master时master会根据当前数据复制一份RDB(full resynchronization 全量复制)到slave,slave会将本地数据写入磁盘,然后从本地磁盘加载到内存中,master会将内存中的数据发送给slave,slave会同步这些数据。如果master与slave发生故障master,会自动重连

2.主从复制断点续传

概念:主从复制过程中如果网络断掉了,可以从上次复制的地方继续复制而不是从头复制

原理:master会在自己内存里维护一个backlog,master和salve都会保存一个复制数据的replica offset ,offset里有一个master的id,offset保存在backlog中,如果网络断掉的话,salve会从master 的offset开始复制

(1).maste和slave都会维护offset

  1. master和slave都会不断累加offset
  2. slave会每秒上传自己的offset,master也会保存每一个slave的offset
  3. slave和master都知道各自的offset,才知道各自数据不一致的情况

(2).backlog

  1. master node有一个backlog默认是1MB,
  2. master node给slave复制数据时也会给把backlog同步一份,
  3. backlog主要用来做全量复制中断的时增量复制的

(3).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

(4).psync

  1. 从节点使用psync到maser node,进行复制,psync run id
  2. master node根据自身情况进行响应,可能是FULLRESTYNC run id offset,也可能是CONTINUE触发增量复制

(5)全量复制

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

如果复制数据在4-6G之间,很可能全量复制的时间在1.5-2分钟

(6)增量复制

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

(7)heartbeat

  1. 主从节点相互发送heartbeat信息
  2. master每隔10s发送一次heartbeat信息,slave每隔1s发送一次heartbeat信息

(8)异步复制
master接收到命令后在内部写入,异步发送给slave node

3.无磁盘化复制

  1. master直接在内存中创建RDB,然后发送给slave不会落到本地磁盘
    repl-diskless-sync no
  2. 等待一段时间在开始复制因为要等待更多的slave连进来
    repl-diskless-sync-delay 5

4.Redis过期策略

(1)定期删除+惰性删除

  1. 每个100ms检查key是否过期如果过期则删除
  2. 惰性删除可能会导致很多过期的key没有被删除,如果查询时到某个key过期则删除

(2)redis内存淘汰策略

  1. noeviction:当内存不足以容纳新的数据时,写入操作就会报错
  2. allkeys-lru:当内存不足以容纳新的数据时,就会淘汰最近最少使用的key
  3. allkeys-random:当内存不足以容纳新的数据时,就会随机删除key
  4. volatile-lru:当内存不足以容纳新的数据时,在过期key删除中删除最近最少使用的
  5. volatile-ttl:当内存数据不足以容纳新的数据时,删除那些即将过期的key

5.redis哨兵的多个核心底层原理的深入解析(包含slave选举算法)

  1. sdown和odown转换机制
    sdown是主观宕机,一个slave觉得自己的master宕机了就是主观宕机
  • odown是客观宕机,如果quorum的数量的哨兵觉得maser宕机了就是客观宕机,sdown达成条件很简单,如果一个哨兵ping master超过了is-master-down-after-milliseconds指定毫秒数就认为master宕机了
  • sdown到odown的转换条件比较简单,如果一个哨兵在指定时间内也收到quorum的数量的哨兵觉的是sdown宕机,那么就认为是odown,客观认为master宕机
  1. 哨兵和slave的自动发现机制
    哨兵之间相互发现通过pub/sub系统实现,每个两秒钟哨兵都会监控自己的master+slaves对应的_sentinel_:hello channel发送消息,内容主要是hos、IP、run id还有master对应的监控配置,感知同样监听master+slaves哨兵的存在,哨兵间还会交换master监控配置,实现监控配置的同步

  2. slave配置的自动纠正
    哨兵模式会负责纠正slave的一些配置,比如slave要成为master的潜在候选人,哨兵会确保slave会复制master现有的数据,如果slave连接到一个错误的master上故障转移后哨兵会保证它连接到正确的master上

  3. slave->master选举算法

  • 如果master被认为是odown而且majoitry哨兵都允许主备切换,此时哨兵就会执行主备切换,选举slave需要考虑的信息

    1. 跟master断开连接的时长
    2. slave优先级
    3. 复制offset
    4. run id
  • 如果一个slave与master断开时长超过down-after-milliseconds的10倍,外加master宕机时长此时就会认为不适合选举为master
    (down-after-milliseconds *10)+milliseconds_since_master_is_in_sdown

  • 接下来会对slave进行排序

  1. 按照slave优先级进行排序,slave priority越小优先级越高
  2. 如果两个slave priority相同,则查看那个offset复制数据多,offset越靠后优先级越高
  3. 如果上面两个条件都相同那就查看那个run id比较小
  • quorum和majority
    每次主备切换,首先确认quorum数量的odown,然后选举出一个哨兵进行切换,这个哨兵还必须得到majority哨兵的授权,才能被正式授权
    如果quorum<majority比如5个哨兵,majority是3,quorum的数量是2,那么3哨兵授权就可以切换
    但如果quorum>=majority,那么必须所有的quorum都必须授权,比如 quorum是5必须5个哨兵都授权才能切换

  • configuration epoch
    执行切换的哨兵,要切换到新的master需要得到一个configuration epoch这就是一个版本号,每次版本号必须唯一
    如果第一个哨兵切换失败,那么其他哨兵会等待faliover-timeout时间,然后继续执行切换获得一个新的configuration epoch,作为新的版本号

  • configuration传播
    哨兵切换完成后会将本地跟新为最新的master配置,然后pub/sub机制同步给其他哨兵
    这里之前的version就很重要,因为消息都是通过一个channel发布监听,完成主备切换后新的master跟着新的version,其他哨兵也跟着version大小更新自己的master

redis主从复制原理、断点续传、无磁盘化复制、过期key处理相关推荐

  1. redis重启命令_这可能是你见过最全面的Redis主从复制原理

    全是干货的技术号: 本文已收录在github,欢迎 star/fork: https://github.com/Wasabi1234/Java-Interview-Tutorial 在Redis复制的 ...

  2. Redis主从复制原理学习

    Redis主从复制原理学习总结 - 运维笔记 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的 ...

  3. Redis主从复制原理总结

    Redis主从复制原理 Redis主从复制原理 全量同步 增量同步 Redis主从同步策略 注意点 主从复制的一些特点: Redis主从同步是怎么实现的? 主从同步中需要注意几个问题 当主服务器不进行 ...

  4. 都在讲Redis主从复制原理,我来讲实践总结

    摘要:本文将演示主从复制如何配置.实现以及实现原理,Redis主从复制三大策略,全量复制.部分复制和立即复制. 本文分享自华为云社区<Redis主从复制实践总结>,原文作者:A梦多啦A . ...

  5. 深入Redis 主从复制原理

    复制原理 1.复制过程 复制的过程步骤如下: 1.从节点执行 slaveof 命令        2.从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制        3.从节点 ...

  6. 阿里面试官:说说Redis主从复制原理

    在Redis复制的基础上(不包括Redis Cluster.Redis Sentinel),使用和配置主从复制非常简单,能使得[从Redis服务器](后文称 slave)能精确得复制[主Redis服务 ...

  7. 复制给节点的命令_深入理解redis主从复制原理

    1.复制过程 从节点执行 slaveof 命令. 从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制. 从节点内部的定时任务发现有主节点的信息,开始使用 socket 连接主节点 ...

  8. Redis内核原理及读写一致企业级架构深入剖析1-综合组件环境实战

    本套技术专栏是作者(秦凯新)平时工作的总结和升华,并深度整理大量网上资源和专业书籍.通过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客.QQ ...

  9. Redis主从复制下的工作原理

    Redis主从复制下的工作原理 Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝.需要清楚Redis主从复制的几点重要内容: 1)Redis使用异步复制.但从Redis 2.8开 ...

最新文章

  1. MVC的增删改和Razor
  2. 1026 Table Tennis (30 分) 未完成【难度: 难 / 知识点: 模拟】
  3. PHP基础系列之正则表达式(一)
  4. Jquery函数大全 - 案例说明
  5. 【Qt】Qt5.12版本编译Oracle驱动教程
  6. Web3.js 学习
  7. 记一次解决curl https证书问题
  8. 阶段面试题_关于文案、交易系统、付费渗透率、阶段性目标的面试题解答
  9. [转载] 用 C++ 和 Java 写算法,差别大吗?
  10. 人脸方向学习(十一):Face Landmark Detection-PFLD解读
  11. php加密密码解析,php密码加密解密
  12. 异常信息_共同药业被爆:大客户异常 瞒报环保处罚信息
  13. 20165204Java第四周学习
  14. NLP 语料库 大全
  15. 【Matlab】利用matlab画圆
  16. 网上订餐系统开源代码java_基于SSM实现的网上订餐系统【附源码】(毕设)
  17. 计算机学报编辑待遇,《计算机学报》编辑委员会
  18. 标题:缩位求和 在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。 比如:248 * 15 = 3720 把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得 2
  19. 数据结构课程设计预习——项目1:中国计算机设计大赛赛事统计
  20. SAS学习——SAS逻辑库

热门文章

  1. TensorFlow安装-windows系统
  2. ORACLE工作原理小结
  3. C#实现异步消息队列
  4. 5. Binary Tree Postorder Traversal
  5. Python enumerate索引迭代
  6. java generate()_Java IntStream generate()用法及代码示例
  7. html css js调用dll,js调用Activex的dll
  8. 抓取html的内容,js获取网页选中内容(包含html代码)
  9. flink 7-提交任务
  10. IntelliJ IDEA中右键新建时,选项没有Java class的解决方法和具体解释