主从模式详解

主从模式是分布式系统中,多个服务器部署redis的一种方式。
分布式系统主要是解决“单点问题”。

如果某个服务器程序,只有一个节点(只有一个物理服务器,来部署服务器程序)。存在可用性问题,如果这个机器挂了,意味着服务中断。并且单个服务器性能不高,支持的并发量有限。

而在分布式系统中,通过多个服务器来部署redis服务,从而构成一个redis集群。此时就可以让这个集群给整个分布式系统中提供服务,提供更稳定,更高效的数据存储功能。

什么是主从模式

引入多个服务器(多个节点)分别部署redis-server进程,在若干个redis节点中,其中一个是“主”节点,其他的是“从”节点。从节点的数据要跟随主节点变化,数据要和主节点保存一致。
image.png
由于从节点的数据时刻和主节点保持一致,因此其他客服端从 从节点读取的数据,和从主节点读取的数据,没有区别。后续有客服端来读取数据,就可以从上述节点中,随机挑选一个节点,给客服端提供服务。

如果我修改了从节点的数据,能否把从节点的数据同步到主节点?

redis主从模式中,从节点的数据不允许修改,只能读取

如果从节点挂了,是否有影响?

此时可以从主节点或者其他从节点读取数据

如果主节点挂了,是否有影响?

从节点只能读取数据,如果需要写数据,就无法写入,可用性视乎不是很理想。并且一般不搞多个主节点,因为相互之间进行数据同步,非常麻烦

如果整个redis集群挂了,怎么办?

考虑到更高的可用性,就需要把这些机器放到不同的机房中,异地多活。

主从模式,主要针对“读操作”进行并发量&可用性的提高。而写操作,依赖于主节点,主节点又不能搞多个,所以可用性&并发量并没有得到提升。

redis主从结构

redis主从结构,需要启动多个redis服务器,正常来说,每个redis服务器,应该在单独的主机上,但是我只有一个云服务器,因此只能在一个云服务器上,运行多个redis-server进程。

需要保证多个redis-server的端口是不同的,本来redis-server默认的端口是6379,此时新启动的redis-server不能再使用6379

配置redis主从结构

  1. 将主节点的的配置信息负责到从节点中
    :::tips
    cd redis-conf/
    cp /etc/redis.conf ./slave1.conf
    cp /etc/redis.conf ./slave2.conf
    :::

  2. 在从节点的配置文件中修改redis端口和运行后台运行
    :::tips
    vim slave1.conf
    vim slave1.conf
    :::
    端口要不相同
    开启后台进程

  3. 启动两个从节点
    :::tips
    redis-server ./slave1.conf
    redis-server ./slave2.conf
    :::

  4. 配置两个从节点,以6379端口的redis-server为主节点

image.png
image.png

  1. 此时在主节点插入数据,从节点就可以访问到,并且从节点无法添加/修改数据

主节点
从节点获取数据
从节点无法添加/修改数据

查看主从结构信息

通过info replication命令查看当前redis节点的相关状态

  • 主节点

image.png

  • 从节点

image.png

断开/修改主从结构

断开主从结构

使用slaveof no one命令,断开主从复制关系。
image.png
从节点断开主从关系,原有的数据不会丢失,但是后续主节点如果针对数据做出修改,从节点就无法自动同步数据。
image.png
image.png

修改主从结构

slaveof命令还可以实现切换主节点操作,执行slaveof [newMasterIp] [newMasterPort]命令即可。
认另外一个从节点为主节点
虽然6381端口的redis服务器,有了从节点,但仍然是6379的从节点
image.png
通过slaveof修改了主从结构,此处的修改是临时性的,如果重新启动了redis服务器,仍然会按照最初配置文件中设置的内容来建立主从结构。

传输延迟

主从节点一般部署在不同机器上,主节点和从节点的网络通信是采用tcp协议,tcp内部支持nagle算法(默认开启),该算法针对小的tcp数据包进行合并,减少了包的个数。

  • 开启以后,会增加tcp传输延迟,节省网络带宽
  • 关闭以后,就会减少tcp传输延迟,增加了网络带宽

在redis的配置文件中,repl-disable-tcp-nodelay参数用于主从同步通信过程中,选择no关闭tcp的nagle算法,减少传输时延;选择yes则开启tcp的nagel算法,节省网络带宽。
image.png

拓扑结构

redis进行主从复制的拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为三种:一主一从,一主多从,树状主从结构。

一主一从结构

image.png

如果写数据请求太多,就会给主节点造成一些压力

可以通过关闭主节点的aof,只开启从节点的aof,缓解压力。

如果主节点挂了,不能让主节点自动重启,如果自动重启,此时没有aof文件,就会丢失数据,进一步主从同步,连同从节点的数据也给删除了

改进方法:当主节点挂了,就让主节点从从节点获取到aof文件,再启动

一主多从结构

image.png
在实际开发中,读请求远高于写请求。一主多从结构可以把读命令负载均衡到不同的从节点上分担压力,同时一些耗时的读命令还可以指定一台专门的从节点来执行。
但是由于从节点较多,主节点完成写请求,同步给从节点需要耗费大量的网络带宽。

树状主从结构

image.png
树状的主从结构可以减少主节点同步压力,只是同步的延时更长了。

主从复制原理

主从复制过程

image.png

  • 权限验证:如果主节点设置requirepass参数,则需要密码验证,从节点通过配置masterauth参数设置密码,如果验证失败,则从节点的复制将会停止。
  • 同步数据集:对于首次建立复制的场景,主节点会把当前所有数据同步给从节点
  • 命令持续复制:当从节点复制了主节点的所有数据以后,针对之后的修改命令,主节点会持续的把命令发送给从节点,从节点执行修改命令,保证主从数据的一致性

数据同步psync

psync不需要咱们手动执行,redis服务器会在建立好主从同步关系之后,自动执行psync。从节点负责执行psync,从主节点这边拉取数据。
语法格式:psync replicationid offset

replicationid 复制id

由主节点生成(主节点启动的时候会生成,从节点晋升成主节点也会生成),即使同一个主节点,每次重启,生成的replicationid都是不同的。当从节点和主节点建立了复制关系,就会从主节点这边获取到replicationid。我们可以通过info replication获取当前replicationid的值。
image.png
假设主节点A,从节点B。主节点A生成replid,从节点获取到A的replid。当A和B通信过程中发生网络抖动,B可能误认为A挂了,B就会自己成为主节点(给自己生成一个replid)。此时B还会记得之前旧的replid,即用replid2存储。后续网络稳定了,B就可以根据replid2重新回到A的怀抱。

offset偏移量

  • 主节点的offset:主节点会收到很多修改操作的命令,将这些修改命令所占字节进行累加得到
  • 从节点的offset:描述了现在从节点数据同步到哪里了,如果从节点的偏移量和主节点的偏移量一致,就是同步了,“赶上直播了”

从节点每秒钟上报自身的复制偏移量给主节点
psync可以从主节点获取全量数据,也可以获取一部分数据。主要是看offset怎么写,
offset写作-1,就是获取全量数据,offset写作具体的正整数,则是从当前偏移量位置往后获取。获取全量数据是最稳妥的,但是也是比较低效。如果从节点之前已经从主节点复制过一部分数据,就只需要将之前没有复制过的数据复制过来即可。

psync运行流程

image.png
并不是从节点索要哪部分,主节点就会给哪部分,主节点会自行判定,看当前是否方便给部分数据,不方便就给全量。

什么时候进行全量复制

  1. 首次和主节点进行数据同步
  2. 主节点不方便进行部分复制

什么时候进行部分复制

从节点之前已经从主节点复制过数据,因为网络抖动或者从节点重启,从节点需要重新从主节点同步数据,此时看能不能只同步一小部分(大部分数据都是一致)

全量复制流程

全量复制流程图
image.png

  1. 从节点发送psync命令给主节点进行数据同步,由于是第一次进行复制,从节点没有主节点的replicationidoffset,所以发送psync ? -1获取全量数据。
  2. 主节点根据命令,解析出要进行全量复制,回复+FULLRESYNC响应
  3. 从节点接收主节点的运行信息进行保存,如ip,port
  4. 主节点执行bgsave进行RDB文件的持久化(rdb是二进制格式,节省空间),不使用原有的rdb文件,而是重新生成rdb快照,因为已有的rdb文件可能和当前最新的数据存在较大差异
  5. 主节点发送RDB文件给从节点,从节点保存RDB数据到本地磁盘
  6. 在主节点生成rdb文件和传输rdb文件的过程中,还会收到很多新的修改操作。新修改的数据也必须同步给从节点,将新修改的数据放入缓冲区,当从节点收完主节点发来的rdb数据后,主节点就会把缓冲区的数据补发给从节点,补发的数据仍然按照二进制格式追加写入到收到的rdb文件中,保持主从一致性。
  7. 从节点清空自身原有的旧数据
  8. 从节点加载rdb文件得到和主节点一致的数据
  9. 如果从节点开启了aof,在上述加载数据过程中,从节点就会产生很多aof日志,会存在一定的冗余信息,因此针对aof日志使用bgrewriteaof重写,进行整理。

无硬盘模式

  1. 在全量复制的第4个步骤中,主节点需要生成rdb文件,再传输给从节点。而“无硬盘模式”不进行bgsave生成rdb文件的过程,直接将数据传输给从节点,节省了一系列读写硬盘的操作
  2. 从节点之前需要先收到rdb数据,写入硬盘,然后再加载。而“无硬盘模式”省略了这个过程,直接把收到的数据进行加载。

虽然引入“无硬盘模式”省去了一系列读写硬盘操作,但是全量复制的整个过程仍然比较重量,相比网络传输而言,读写硬盘是个小头。

部分复制

从节点要从主节点进行全量复制,开销很大,有些时候,从节点本身已经持有主节点的大部分数据,这个时候就不太需要进行全量复制了。例如,网络抖动,主节点最近修改的数据无法及时同步过去,而网络抖动,一般是暂时性的,当从节点和主节点重新建立连接以后,就需要进行数据同步。
部分复制流程图
image.png

  1. 主从节点之间出现网络中断,如果超过repl-timeout时间,主节点会认为从节点故障并中断复制连接
  2. 主从连接中断期间主节点依旧响应命令,但是这些复制命令都因网络中断无法及时发送给从节点,所以暂时将这些命令写入复制积压缓冲区

积压缓冲区:由数组构成的一个循环队列,记录的总量有限,随着时间推移,会把前面的数据逐渐覆盖掉。

  1. 当主从节点网络恢复后,从节点再次连上主节点
  2. 从节点将之前保存的replicationidoffset作为psync的参数发送给主节点,请求进行部分复制。

replicationid描述”数据来源“,offset描述”数据的复制进度“

:::warning
主节点会先判定replicationid,如果和自己的id不一样,说明以前不具备主从关系,直接全量复制。如果replicationid一样,再判定offset,如果从节点的进度再当前的积压缓冲区之内,进行部分复制;如果当前从节点的进度超出积压缓冲区的范围,继续全量复制。
:::

  1. 主节点接到psync请求后,进行必要验证,随后根据offset去复制积压缓冲区查找合适的数据,并响应+CONTINUE给从节点。
  2. 主节点将需要让从节点 同步的数据发送给从节点,最终完成一致性

实时复制

全量复制是从节点刚连上主节点之后,进行的数据初始化工作;部分复制是全量复制的特殊情况,是对全量复制的优化,目的和全量复制一样。而实时复制是从节点已经和主节点同步好了数据,但是之后,主节点会不断收到新的修改数据的请求,需要同步给从节点。

怎么进行实时复制

从节点和主节点之间建立TCP长连接,然后主节点把自己收到的修改数据的请求,通过上述连接,发送给从节点再根据这些修改请求,修改内存中的数据

上述过程正常来说,延时比较短,但是如果是多级从节点的树形结构,延时也会上升

在进行实时复制的时候,需要保证连接处于可用状态。依靠”心跳包“机制来检查

  • 主节点:默认每隔10s给从节点发送一个ping命令,从节点收到就返回pong。超时阈值默认是60s
  • 从节点:默认每隔1s就给主节点发送一个特定请求,上报当前从节点复制数据的进度,即offset

主从复制的问题

最大的问题是在主节点上,当主节点挂了,虽然还能够提供读操作,但是从节点无法自动升级成主节点,替换原有主节点对应的角色,需要程序员手动恢复主节点。而自动替换主节点需要redis的哨兵机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132439.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法分析与设计编程题 回溯法

装载问题 题目描述 解题代码 递归回溯 // goods[i]表示货物i的重量, c1,c2分别表示货船1和货船2的载重量 vector<vector<int>> optimalLoading(vector<int>& goods, int c1, int c2) {int n goods.size(); // 货物数量int maxSum 0; // 当前最大载货…

新知同享 | Web 开发性能提升,优化体验

更加强大且开放的 Web 可以简化开发工作并支持 AI 一起来看 2023 Google 开发者大会上 Web 开发值得重点关注的升级与成果 了解 Web 如何实现加速开发&#xff0c;更加便捷 精彩大会现场一览 Web 开发不断发展&#xff0c;每年都带来性能提升和功能迭代&#xff0c;开启丰富多…

【C++】常用算术生成算法

0.前言 1.accumulate #include <iostream> using namespace std;// 常用算术生成算法 #include<vector> #include<numeric> //accumulate 的调用头文件void test01() {vector<int>v;for (int i 0; i < 100; i){v.push_back(i);}int total accumu…

Mysql InnoDB引擎 的hash索引

Mysql InnoDB引擎不支持hash索引&#xff0c;但是在内存结构中有一个自适应hash索引&#xff0c;来提高查询性能 当设置hash索引时会自动转换成btree索引 查一下mysql官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/create-index.html innodb_adaptive_hash_i…

数据在内存中的存储

目录 数据类型 大小端 判断大小端 练习 1 2 浮点数在内存中储存 存M 存E 取E 数据类型 整形家族&#xff1a; char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed…

Day_14 > 指针进阶(3)> bubble函数

目录 1.回顾回调函数 2.写一个bubble_sort函数 2.1认识一下qsort函数 ​编辑2.2写bubble_sort函数 今天我们继续深入学习指针 1.回顾回调函数 我们回顾一下之前学过的回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;…

数据可视化大屏模板 | 保姆级使用教程

近来很多朋友私信咨询怎么下载使用数据可视化大屏模板&#xff0c;在这里就给大家做一个相对简单的教程总结。有需要的朋友记得先收藏保存&#xff0c;以便不时之需。 数据可视化大屏制作软件&#xff1a;奥威BI系统 数据可视化报表模板板块&#xff1a;模板秀 主要操作&…

Unity下如何实现RTMP或RTSP播放端录像?

好多开发者问我们&#xff0c;Unity环境下&#xff0c;除了RTSP或RTMP的播放&#xff0c;如果有录像诉求&#xff0c;怎么实现&#xff1f;实际上录像相对播放来说&#xff0c;更简单一些&#xff0c;因为不涉及到绘制&#xff0c;只要拉流下来数据&#xff0c;直接写mp4文件就…

【数据结构】二叉树的链式结构

【数据结构】二叉树的链式存储结构 二叉树的存储结构 typedef int BTDataType; // 二叉树的结构 typedef struct BinaryTreeNode {BTDataType data; // 树的值struct BinaryTreeNode *left; // 左孩子struct BinaryTreeNode *right;// 右孩子 } BinaryTreeNode;二…

跟模型和中间层聊聊:什么是最好的AI原生应用?

软件 2.0 注定会发生&#xff1a;所有软件都值得用神经网络重做一遍。 这个 OpenAI 大神 Karpathy 多年前的预言&#xff0c;指向了今天 LLM 应用层的一个关键问题——如何基于 LLM 能力&#xff0c;设计好 AI 原生应用。 我们看到&#xff0c;应用层的创业者们感到悲观、质疑和…

腾讯发布超千亿参数规模的混元大模型;深度学习与音乐分析与生成课程介绍

&#x1f989; AI新闻 &#x1f680; 腾讯发布超千亿参数规模的混元大模型 摘要&#xff1a;腾讯在2023腾讯全球数字生态大会上发布混元大模型&#xff0c;该模型拥有超千亿的参数规模和超2万亿 tokens 的预训练语料。混元大模型将支持多轮对话、内容创作、逻辑推理、知识增强…

计算机毕设 大数据上海租房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

Zookeeper应用场景和底层设计

一、什么是zookeeper Zookeeper是一个开源的分布式协调服务框架&#xff0c;它是服务于其它集群式框架的框架。 【简言之】 有一个服务A&#xff0c;以集群的方式提供服务。只需要A专注于它提供的服务就可以&#xff0c;至于它如何以多台服务器协同完成任务的事情&#xff0c…

(文末赠书)我为什么推荐应该人手一本《人月神话》

能点进来的朋友&#xff0c;说明你肯定是计算机工作的朋友或者对这本书正在仔细琢磨着的朋友。 文章目录 1、人人都会编程的时代&#xff0c;我们如何留存?2、小故事说明项目管理着为什么必看这本书3、如何评价《人月神话&#xff1a;纪念典藏版》4、本书的目录&#xff08;好…

科技资讯|苹果Vision Pro获得被动冷却系统及数字表冠控制界面专利

据patentlyapple报道&#xff0c;美国专利商标局正式授予苹果一项与头戴式设备&#xff08;Apple Vision Pro&#xff09;相关的专利11751366&#xff0c;该设备可以提供被动冷却系统&#xff0c;利用光学组件的表面来管理热量&#xff0c;而不会对用户显示的视觉信息产生不利影…

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…

【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏

文章目录 前言开始项目网格生成Block方块脚本俄罗斯方块基类&#xff0c;绘制方块形状移动逻辑限制移动自由下落下落后设置对应风格为不可移动类型检查当前方块是否可以向指定方向移动旋转逻辑消除逻辑游戏结束逻辑怪物生成源码参考完结 前言 当今游戏产业中&#xff0c;经典游…

关于HTTP协议的概述

HTTP 的报文大概分为三大部分。第一部分是请求行&#xff0c;第二部分是请求的首部&#xff0c;第三部分才是请求的正文实体。 POST 往往是用来创建一个资源的&#xff0c;而 PUT 往往是用来修改一个资源的。 Accept-Charset&#xff0c;表示客户端可以接受的字符集。防止传过…

YOLOv5:修改backbone为ConvNeXt

YOLOv5&#xff1a;修改backbone为ConvNeXt 前言前提条件相关介绍ConvNeXtYOLOv5修改backbone为ConvNeXt修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

python 列表常用方法

python的列表和js的数组是相似的 mylist ["add", "item", "msg", "add", "add", "add"] # 语句[索引] 值 改变列表中某一项的值 # mylist[1] 122 # insert插入值 # mylist.insert(2, "age") # appe…