────────────────────────────────────────────────────────────────
┌————————————┐
│▉▉♥♥♥♥♥♥♥♥ 99% │ ♥❤ 鱼沈雁杳天涯路,始信人间别离苦。
└————————————┘
对你的感情正在充电中,请稍侯…
────────────────────────────────────────────────────────────────

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

────────────────────────────────────────────────────────────────

Reids源码主从同步与对象模型

  • 一、持久化,以及持久化选择(重点)
    • 1、aof
      • aof策略
      • 持久化什么内容?持久化的这条命令是协议数据
        • 关闭一组redis集群,awk的实际应用
      • 具体原理
      • aof 缺点
    • 2、补救措施 aof-rewrite
      • 如何配置aof-rewrite
      • aof-rewrite策略
      • aof-rewrite缺点
    • 3、rdb快照持久化
      • rdb的配置
      • rdb的策略
      • 缺点
    • 4、混合持久化
      • 混合持久化配置
    • 5、应用指导
  • 二、主从复制
    • 拷贝持久化文件是否安全?
      • 节点宕机(redis是内存数据库,宕机数据会丢失)
      • 磁盘故障
    • redis主从复制解决了单点故障的问题
      • 命令:redis-server --replicaof 127.0.0.1 7002
      • 数据同步
        • 全量数据同步
        • 增量数据同步
  • 三、哨兵(cap)
    • c all nodes see the same data at the same time
    • a read and writes always succes
    • p in order to model partition tolerance, the network will be allowed to lose arbitrarily many messages sent from one node to another.
  • 四、哨兵cluster(重点)
    • 一致性算法
      • 配置(用到的概率低)
      • Codis集群
        • 分布式定时器
      • cluster集群(去中心化)
      • 应用

一、持久化,以及持久化选择(重点)

redis的源码感觉还是要看,但是不是现在看,应该是在自己掌握了linux内核等相关知识后再看。

  • appendonly:在文件中附加数据,选项改为yes即可开启aof

1、aof


  • 策略怎么选择?
  • aof占用逻辑主线程
  • 不仅要开启aof,还要选择策略,关闭一些设置
  • 我们平时时间循环会先处理读事件再处理写事件,当开启aof后会先处理写事件再处理读事件。为什么这样做呢,Mark老师讲在源码中有个事件调转,因为这样会先读完后做持久化,再处理写事件,最后发送对端。

aof策略

  • always:每一个命令
  • everysec:每秒钟

持久化什么内容?持久化的这条命令是协议数据

  • pidfile:进程写在对应的位置
  • logfile:日志存放的位置
  • daemonize:yes 表示开启后台
  • save “”:表示关闭rdb
  • :x :表示保存,类似于wq!
关闭一组redis集群,awk的实际应用

  • ps -aux| grep redis-server | awk ‘{print ‘$2’}’ | xargs kill -9
  • tail appendonly.aof

具体原理

redis宕机后,将aof记录的命令重新执行命令。

aof 缺点

随着时间的推移,aof会逐渐的累计。重放aof会非常耗时,导致长时间无法对外提供。

2、补救措施 aof-rewrite


感觉有点像服务给做了一个简单的计算,把aof进行瘦身处理。
两个方式开启aof-rewrite:

  • 命令的方式:bgrewrite command 输入命令后会立刻fork出一个子进程。当然,前提是要开启aof。
  • 配置文件里进行设置。
    显然,这种精简的日志只会不断的增加。当fork子进程执行完成后,通过先前创建的管道将精简后的数据通过信号发送到主循环,aof记录的内容将附加到aof-rewarite之后。父记录一些统计状态和指标这个过程有一部分并没有精简,那该怎么办呢?我们继续往下说。

如何配置aof-rewrite

aof-rewrite策略

aof-rewrite缺点

aof复写的数量依然非常大,加载缓慢。

3、rdb快照持久化

rdb是通过fork出子进程,在子进程中将内存当中的数据键值对按照存储方式持久化到rdb文件中;rdb存储说的是经过压缩的二进制数据,是一种更快的方式。

rdb的配置

rdb相比较四种持久化方式非常特殊,所以必须要关闭aof,其他的都需要开启aof。根据内存状态进行持久的。redis下载完后,redis.conf文件默认是开启rdb的。下图的三个save,任意一个达成都会进行持久化。举例来说:“save 3600 1” 意思就是每隔3600秒进行一次修改。

rdb的策略


缺点

这个rdb的策略非常重要,遗漏丢失数据的原因主要和策略有关系。当实际情况无限接近于满足所有rdb策略的情况发生时,数据会发生丢失最大的东西,好吧,说的好有道理,不知道说的是否明白清楚。

4、混合持久化

  • aof方式文件大且加载慢但丢失少。
  • rdb文件小且加载快但丢失多。
  • aof复写的时候持久化的内容是rdb,等持久化后,持久化期间修改的数据以aof的形式附加到文件的尾部。
  • 混合持久化是吸取rdb和aof两者优点的持久化方案,实际是在aof复写的基础上进行优化,所以需要开启aof-rewrite。

混合持久化配置

5、应用指导

  • 通常redis不开启持久化,只缓存热点数据,数据来源于mysql。若某些数据经常访问需要开启持久化,此时可以选择rdb持久化方案,允许丢失一段时间数据。
  • 对数据要求可靠性较高,在机器性能,内存也安全(fork 写时复制 最差的情况下 96G)的情况下,可以让redis同时开启aof和rdb。值得注意额时,此时并不是混合持久化。redis重启优先从aof数据加载,理论上aof包含更多的最新数据;如果只开启一种,那么使用混合持久化。
  • 在允许丢失的情况下,亦可采用主redis不持久化(96G 90G),从持久化。
  • 伪装从库。


二、主从复制

拷贝持久化文件是否安全?

是安全的。持久化文件一旦被创建,就不会进行任何修改。当服务器创建新持久化文件时,它先将文件的内容保存到一个临时文件里面,当临时文件写入完毕时,程序才使用renanem(2)原子地用临时文件替换原来的持久化文件。
数据安全要考虑以下两个方面:

节点宕机(redis是内存数据库,宕机数据会丢失)

磁盘故障

  • 创建一个定期任务(cron job),每小时将一个RDB文件备份到一个文件夹,并且每天将一个RDB文件备份到另一个文件夹。
  • 确保快照的备份都带有相应的日期和时间信息,每次执行定期任务脚本时,使用find命令来删除过期的快照:比如说,可以保留48小时内的每小时快照,还可以保留最近一两个月的每日快照。
  • 至少每天一次,将RDB备份到阁下的书库中心之外,或者至少是备份到阁下运行的redis服务器的物理机器之外。

redis主从复制解决了单点故障的问题

命令:redis-server --replicaof 127.0.0.1 7002

意思是把7002的redis作为一个主redis数据库

数据同步

全量数据同步
  • 从先连接主,后发送ping命令保证主未阻塞。
  • 就算主采用aof持久化,也会通过rdb去同步数据到从。主从都是通过rdb的方式进行同步。
增量数据同步
  • 从发送数据到主,当网路抖动时,允许有主从数据间并非实时同步,故引入环形缓冲区的概念。主将抖动数据写入主的环形缓冲区,而从记录偏移值,与主比较,核对是否发生偏移,如果在环形缓冲区就就去主拿到数据。
  • runid的作用:仅仅通过ip:port这种方式记录主从关系有所欠缺,而runid时master的唯一标识,从去确认谁时主。
  • 环形缓冲区的大小为2的64次方,可以放心用5000年,所以不会出现回绕的低级错误。



三、哨兵(cap)

高可用有两个衡量值:响应时间和功能上的缺失。

c all nodes see the same data at the same time

  • 强一致性(效率非常低,工匠精神应该去研究)
  • 最终一致性(redis,mysql)

a read and writes always succes

  • 合理时间内返回合理的值
    什么是合理的时间发回合理的值?
    个人理解是当主发生宕机,从可以快速接替成为主。整个redis系统在非常短的时间内能返回一个正确的值,而非一个空值。

p in order to model partition tolerance, the network will be allowed to lose arbitrarily many messages sent from one node to another.

当网络分区故障时仍然能够提供一致性或可用的服务。一般都会先考虑p,再考虑a c。

四、哨兵cluster(重点)

期望所有的从都同意选举结果再返回,但是raft算法认为半数通过就可以返回。
clent客户端先访问哨兵集群,拿到主redis的信息。当主redis发生宕机后,client客户端就会再次访问哨兵集群,而哨兵集群通过选举会再次告诉client客户端主正常的redis的信息
因为redis集群采用最终一致性原则,所以主从redis之间的数据会有差异,哨兵系统根据各个从数据库的偏移值进行推荐新的主redis,偏移值越大说明该redis的值越新。

一致性算法

  • paxos zk(比较难看懂,可以研究)
  • raft (后端开发必须掌握的)

配置(用到的概率低)

Codis集群

分布式定时器

cluster集群(去中心化)

从任意节点出发,通过key去算槽位找真实节点。

应用




  • redis-cli -c :表示以cluster的方式启动
  • cluster info:查看集群信息
  • cluster nodes:查看节点信息
  • 因为redis是异步的,从数据库不认为自己数据是最新的,所以会跳转到主数据库拿数据。

Linux服务器开发,Reids源码 主从同步与对象模型相关推荐

  1. Linux驱动开发 / fbtft源码速读

    哈喽,老吴又来分享学习心得啦~ 一.目标与体系 目标是关于你想要达到的结果,而体系是涉及导致这些结果的过程; 目标的意义在于确定大方向,但体系才能促进进步.完全忽略目标,只关注体系,仍然会成功. 结果 ...

  2. 《深度解析Java游戏服务器开发》源码

    不知什么原因,出售的<深度解析Java游戏服务器开发>一书中,没有给出源码,这里补上,源码已经上传至github: https://github.com/hjcenry/JavaServe ...

  3. Linux驱动开发(源码精析)

    内核基本框架 应用层使用系统调用接口,进入内核子系统时间某种功能,内核子系统与硬件直接就是驱动.驱动根据需求不同会引用各个子系统. 驱动分为三种:字符设备驱动(硬件的读写以字节为单位)如串口.块设备驱 ...

  4. C/C++Linux服务器开发高级架构师/Linux后台开发架构师丨高级进阶学习

    01 课程介绍 [录播]课程介绍(66分钟) 免费试学 [录播]磁盘存储链式的B树与B+树(131分钟) 免费试学 免费学习视频链接点击:C/C++Linux服务器开发高级架构师/Linux后台架构师 ...

  5. 【零声教育】C/C++Linux服务器开发/高级架构师 课程

    随着去年年底的疫情,很多线下的学习都变成了网课的形式,各种付费学习也萌生出来,很多决定要报名付费网课例如零声学院C/C++linux后台服务器高级架构师的程序员,报名之前总会问我这样一个问题,除了视频 ...

  6. 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统

    剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...

  7. Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++linux服务器开发

    Nginx源码实现的细枝末节 11个阶段的实现 视频讲解如下,点击观看: Nginx源码实现的细枝末节 11个阶段的实现丨Nginx Filter|中间件开发|惊群效应|负载均衡丨组件丨c/c++li ...

  8. Nginx源码从模块开发入手,3个项目弄透nginx模块开发丨Linux服务器开发丨C++后端开发丨中间件开发丨分布式丨web服务器

    Nginx源码从模块开发入手,3个项目弄透nginx模块开发 1. Nginx http请求的11个处理流程 2. Upstream, Filter,Handler模块分析 3. nginx如何拒绝无 ...

  9. 详解5种红黑树的场景,从Linux内核谈到Nginx源码,听完醍醐灌顶丨Linux服务器开发丨Linux后端开发

    5种红黑树的场景,从Linux内核谈到Nginx源码,听完醍醐灌顶 1. 进程调度CFS的红黑树场景 2. 虚拟内存管理的红黑树场景 3. 共享内存slab的红黑树场景 视频讲解如下,点击观看: [干 ...

最新文章

  1. 各种注意力机制PyTorch实现
  2. kudu大量数据更新_Apache Kudu又更新?1.4版改进了Web界面
  3. 记录某段程序的运行时间
  4. python----1
  5. 未来的计算机作文500字,穿越到未来作文500字
  6. PW Live直播 | 清华大学NLP组刘正皓:神经信息检索的进展与挑战
  7. RAID信息存放位置!
  8. python将csv一行保存一个txt_Python读写文件(csv、txt、excel)
  9. 外部函数能修改闭包内的变量_Python函数式编程,Python闭包
  10. 操作系统 —— 课程概述
  11. [转载] pip快速下载python包
  12. MySQL 5.7 自带的四个数据库 介绍
  13. Android自定义控件之TextView
  14. oracle 创建表格乱码,数据库导出excel表格是乱码怎么办-oracle 导出excel 乱码怎么办...
  15. Franz Mandl, Graham Shaw《Quantum Field Theory (2nd)》(弗兰兹·曼德尔, 格雷厄姆·肖《量子场论(第二版)》)中文目录
  16. 富媒体广告投放的一些经验
  17. GSM网络识别参数-移动国家号(MCC)|移动网号(MNC)|位置区码(LAC)|小区识别(CI/cellid)...
  18. Pyton 中eval 函数的用法总结
  19. 阿里天池工业蒸汽量预测baseline-数据探索篇
  20. React中antd日期选择框,指定区间禁用时间

热门文章

  1. 第一条Android自动化测试脚本
  2. C#,图像二值化(21)——局部阈值的韦尔纳算法(Wellner Thresholding)及源代码
  3. Comparable 接口的使用
  4. 全景成像技术(3)—鱼眼全景成像
  5. 找优雅点(原点在圆心的圆上的整数点)
  6. 【贪心算法】舞蹈室安排
  7. 1.7.3.4 什么是温升电流、RMS电流、饱和电流、额定电流?
  8. html5 微信授权,微信授权.html
  9. Linux打怪通关攻略(17)Linux 进程管理
  10. 【C语言总结篇】新起点