Redis-持久化+主从架构
文章目录
- Redis的持久化
- RDB模式
- 异步持久化的实现
- AOF模式
- 总结
- Redis的主从架构
- 1.端口以及文件调试测试
- 2.主从配置
- 3.数据同步原理(第一次同步为全局同步)
- 4.增量同步
- 5.主从配置优化
- 6.问:master主机怎么判断从机slave是不是第一次同步数据?
Redis的持久化
Redis服务的前言:


数据丢失问题:实现Redis持久化,用备份
并发能力问题:单节并发度较低,搭建主从集群,实现读写分离
储存能力问题:搭建分片集群,利用插槽机制实现动态扩容
故障恢复问题:redis宕机,服务不可用,会出现很多状况,需要自动故障恢复手段,哨兵,实现健康监测和自动恢复
RDB模式
RDB被称为Redis数据快照, 记录内存数据到磁盘中,当Redis实例故障重启后,会从磁盘读取快照文件恢复数据;
快照文件为RDB文件,默认保存在当前运行目录,有两种保存方式:save,bgsave,Redis挂了也会执行一次RDB;
bgsave:创建一个子进程——>通过fork主进程得到,子进程共享主进程内存数据,然后将fork完的内存数据写入redis中;
save是由Redis主进程来执行save,回阻塞所有命令,所以一般都使用bgsave


也可以自动触发RDB:
在redis.conf下有Redis触发RDB的机制

RDB其他配置
压缩rdb文件到磁盘:rdbcompression yes
文件保存路径目录:dir ./
rdb文件改了名称后会丢失数据

时间不能太长也不能太短,因为太短,如果数据量很大比如1g,你1s一次来不赢,压力很大;
时间太长,你写入数据比较快,然后挂了,那么数据就会丢失保存不了
所以一般用默认的RDB触发时间就行了
异步持久化的实现
我们主进程用的是虚拟内存,其实也就是本机内存的一部分,然后其他物理内存中的数据的调用,是由于页表的作用——>操作系统会维护页表,主进程通过页表中的映射关系得到物理内存中的数据;
而我们这里的的异步持久化——>作用就是主进程fork了一个子进程,因为子进程此时与主进程的作用是一样的,所以也可以对物理内存的数据进行读写;
fork子过程拷贝页表是阻塞的;
从而达到内存共享,子进程对内存数据进行读写,实现异步持久化

copy-on-wirte技术:
当出现读写操作时,一个进行读:读取共享内存;一个进行写,当执行写操作时,内存中的数据(read-only)会被拷贝一份数据放在内存中给其他线程进行读取;
每更新一次,或者说更新的时候每有进程来读取都会有一个新的数据副本


AOF模式

appendfsync always:表示执行一次命令,主进程接收到命令,分配内存进行执行,然后持久化到硬盘——>安全;
appendfsync everysec:将命令执行放入缓冲区中,然后每秒将缓冲区中的数据写入AOF文件,如果途中宕机,有丢掉数据的风险;
appendsync no:这个的话,写命令完成后,它会被放到AOF缓冲区,但是缓冲区的数据什么时候写回给磁盘是由操作系统决定的

进行配置
save " ":禁用rdb
开启AOF:appendonly yes



重启后也会数据持久化到硬盘
注意:AOF记录的操作的命令数,只要你是个命令都会被记录到AOF配置文件中,而rdb文件,记录的是值,只有不同的值才会被记录到其中,有对象treeset和hashset
所以说,AOF文件会比RDB文件大的多,会记录对同一个key的多次写操作

执行BGREWRITEAOF命令
重写AOF



总结
RDB宕机恢复速度>AOF宕机恢复速度,因为RDB里面放的是数据,AOF放的是命令还需要执行,所以肯定慢些赛;
RDB数据恢复优先级<AOF,因为数据完整性较低,rdb可以充当一个备份的作用,比如主从集群时,rdb文件能够帮助恢复数据;
RDB系统资源占用较高,容易丢数据,备份时间较长,save xxx xxx,需要考虑时间长短一次备份,而AOF主要磁盘IO资源,因为其他线程需要重写命令;

Redis的主从架构
像我们redis的话,其实大部分都是用在读上面;
我们单节点的并发能力是有限的,可以试想一下,把读写操作进行分离,主节点进行写操作,从节点进行读操作;
从节点是主节点fork得到的,主从数据同步

1.端口以及文件调试测试
创建三个文件7001,7002,7003
1.首先开启3个节点,需要准备三份不同的配置文件和目录,配置文件所在的目录就是工作目录
将配置文件分别拷贝到文件目录中

- 修改工作目录以及port

sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/etc\/7001\//g' 7001/redis.conf
发现以及配置成功,工作目录以及端口成功被修改
3.还需要修改每个节点声明的IP,因为虚拟机本身有多个IP,为了避免混乱,需要再redis.conf中指定每一个实例的绑定IP信息

声明IP地址成功

2.主从配置
先redis-cli -p 端口号:当前节点连接端口
然后slaveof设置主从


数据同步完成
3.数据同步原理(第一次同步为全局同步)
1.其实就是rdb文件,从机调用
slaveof命令后——>从机请求master,master判断从机是不是第一次数据同步,是的话就将rdb文件发送给从机(主机执行bgsave命令生成并发送rdb),从而实现数据同步(第一次是从机主动请求的)
2.然后从机先清空本地数据,然后加载rdb文件
3.后面主机再对数据更新,主机会自动给从机主动发送repl_baklog命令,从机接收到命令后执行
repl_baklog:
它是针对部分复制,储存未来新增的命令,里面有偏移量offset,就是增量同步

4.增量同步
增量同步就是全量同步后,主从同步数据而方式;
流程:
1.slave进行重启后,因为从机宕机了,所以主机的写数据从机是不知道的;
2.从机醒来后,会向主机发送请求,然后请求判断id固然是一样的,然后从repl_baklog中获取从机offset后的数据;
3.然后从机执行

注意:如果欠的数据>一圈了,因为repl_baklog大小是有上限的,写满后会覆盖最早的数据,而从机slave断开的时间又很久——>导致数据被覆盖,无法增量同步,只能全量同步;(可以将repl_baklog 文件大小设置大一点 或者 尽量不要让从机长时间宕机)
5.主从配置优化
1.在master中的配置文件配置repl-diskless-sync yes:启用无磁盘复制,这样我们的数据不会经过磁盘读写,而是直接将数据放到网络中,通过网络进行传输;
如果网络非常之慢的话就还是用磁盘复制

2.可以适当提高repl_baklog的大小,因为我们出现全量同步的原因就是repl_baklog小了,数据量大过了这个圈从而导致覆盖;
3.限制master上slave节点的数量,当从节点过多,可以采用主-从链式结构,减轻主机压力

6.问:master主机怎么判断从机slave是不是第一次同步数据?
Replication id:数据集的标记,id一致则是同一数据集,每一个master都有唯一Replication id,slave从机会继承主机master的Replication id;第一次主机和从机标记中的偏移量是一样的,也就是数据是一致的
offset:偏移量,当主机数据写入,那么repl——baklog中的数据会越来越多。而从机完成同步时也会记录同步的offset,如果从机salve的offset<master主机的offset,就说明从机的数据落后于主机,需要更新;
主机首先会根据Replication id进行判断,因为从机一开始也是自己的主机,所以id肯定是不一样的,如果是第一次,那么将主机id给到从机,并将offset传入,然后从机保存版本信息,那么就表示了从机与主机数据一致

1.主从机先进行连接,然后从机发送增量同步请求
2.主机说你的id与我的不匹配,你是第一次来,不能给你增量同步,只能全量同步

3.从机开始全量同步 ,然后接收主机的数据并将自己之前数据清空进行同步


相关文章:
Redis-持久化+主从架构
文章目录 Redis的持久化RDB模式异步持久化的实现AOF模式总结 Redis的主从架构1.端口以及文件调试测试2.主从配置3.数据同步原理(第一次同步为全局同步)4.增量同步5.主从配置优化6.问:master主机怎么判断从机slave是不是第一次同步数据? Redis…...
STM32H750之FreeRTOS学习--------(四)中断管理
四、FreeRTOS中断管理 中断的概念不再过多叙述,学习过逻辑的都知道 中断的执行过程 中断请求 外设产生中断请求(GPIO外部中断、定时器中断等)响应中断 CPU停止执行当前程序,转而去执行中断处理程序(ISR)…...
Macroscope安全漏洞检测工具简介
学习目标: 本介绍旨在帮助感兴趣者尽快了解 Macroscope,这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试: 如下图所示,如果使用多种互补工具(SAST/DAST/SCA 等)来检测应用程序…...
【Linux】Nignx的入门使用负载均衡动静分离(前后端项目部署)---超详细
一,Nignx入门 1.1 Nignx是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它使用事件驱动的异步框架,可同时处理大量请求,支持负载均衡、反向代理、HTTP缓存等常见Web服务场景。Nginx可以作为一个前端的Web服务器,也可…...
【入门Flink】- 04Flink部署模式和运行模式【偏概念】
部署模式 在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式(Session Mode)、单作业模式(Per-Job Mode&…...
react面试要点
# React面试知识点 ## React是什么?谈一谈你对react的理解 1 React是一个网页UI库 2 react的特点是 声明式 组件化 通用性 3 react优点: 简单,低耦合高内聚,由于虚拟dom概念,可以做到一次学习到处使用。 …...
在Google Kubernetes集群创建分布式Jenkins(一)
因为项目需要,在GKE的集群上需要创建一个CICD的环境,记录一下安装部署一个分布式Jenkins集群的过程。 分布式Jenkins由一个主服务器和多个Agent组成,Agent可以执行主服务器分派的任务。如下图所示: 如上图,Jenkins Ag…...
【Python全栈_公开课学习记录】
一、初识python (一).Python起源 Python创始人为吉多范罗苏姆(荷兰),Python崇尚优美、清晰、简明的编辑风格。Python语言结构清晰简单、数据库丰富、运行成熟稳定,科学计算统计分析领先。目前广泛应用于云计算、Web开发、科学运算…...
uniapp循环列表单选框实现单选
目录 图片源码参考最后 图片 源码 参考 大佬 最后 感觉文章好的话记得点个心心和关注和收藏,有错的地方麻烦指正一下,如果需要转载,请标明出处,多谢!!!...
【强化学习】14 —— A3C(Asynchronous Advantage Actor Critic)
A3C算法( Asynchronous Methods for Deep Reinforcement Learning)于2016年被谷歌DeepMind团队提出。A3C是一种非常有效的深度强化学习算法,在围棋、星际争霸等复杂任务上已经取得了很好的效果。接下来,我们先从A3C的名称入手&…...
Google单元测试sample分析(四)
GoogleTest单元测试可用实现在每个测试用例结束后监控其内存使用情况, 可以通过GoogleTest提供的事件侦听器EmptyTestEventListener 来实现,下面通过官方提供的sample例子,路径在samples文件夹下的sample10_unittest.cpp // Copyright 2009…...
网络套接字编程(二)
网络套接字编程(二) 文章目录 网络套接字编程(二)简易TCP网络程序服务端创建套接字服务端绑定IP地址和端口号服务端监听服务端运行服务端网络服务服务端启动客户端创建套接字客户端的绑定和监听问题客户端建立连接并通信客户端启动程序测试单执行流服务器的弊端 多进程版TCP网络…...
LLaMA-Adapter源码解析
LLaMA-Adapter源码解析 伪代码 def transformer_block_with_llama_adapter(x, gating_factor, soft_prompt):residual xy zero_init_attention(soft_prompt, x) # llama-adapter: prepend prefixx self_attention(x)x x gating_factor * y # llama-adapter: apply zero_init…...
JavaScript设计模式之发布-订阅模式
发布者和订阅者完全解耦(通过消息队列进行通信) 适用场景:功能模块间进行通信,如Vue的事件总线。 ES6实现方式: class eventManager {constructor() {this.eventList {};}on(eventName, callback) {if (this.eventL…...
mysql---索引
概要 索引:排序的列表,列表当中存储的是索引的值和包含这个值的数据所在的行的物理地址 作用:加快查找速度 注:索引要在创建表时尽量创建完全,后期添加影响变动大。 索引也需要占用磁盘空间,innodb表数据…...
微信小程序——简易复制文本
在微信小程序中,可以使用wx.setClipboardData()方法来实现复制文本内容的功能。以下是一个示例代码: // 点击按钮触发复制事件 copyText: function() {var that this;wx.setClipboardData({data: 要复制的文本内容,success: function(res) {wx.showToa…...
【51单片机】矩阵键盘与定时器(学习笔记)
一、矩阵键盘 1、矩阵键盘概述 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 2、扫描的概念 数码管扫描(输出扫描):…...
vue 中使用async await
在程序中使用同步的方式来加载异步的数据的方式: async function() {let promise new Promise((resolve, reject) > {resolve(res);}).then(re > {return re; });await promise; }...
C语言学习之内存区域的划分
内存区域的划分:32位OS可以访问的虚拟内存空间为0~4G;一、内核空间:3~4G;二、用户空间0~3G;栈区:局部变量在栈区分配、由OS负责分配和回收堆区:由程序员手动分配(malloc函数)和回收(free函数);静…...
Unity Animator cpu性能测试
测试案例: 场景中共有4000个物体,挂在40个animtor 上,每个Animator控制100个物体的动画。 使用工具: Unity Profiler. Unity 版本: unity 2019.4.40f1 测试环境: 手机 测试过程: 没有挂…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
