深入Redis:强大的主从复制

如果某个服务器或者程序,只有一个节点(服务器),就会有很大的问题。比如可用不高,并发量也比较低。引入分布式系统,也主要是为了解决上述的单点问题。

Redis,主要部署在分布式系统上。在分布式系统中,往往有多个服务器来部署Redis服务,从而构成一个Redis集群,此时就可以让这个集群给整个分布式系统中其他的服务提供更加稳定、更加高效的数据存储服务。

本文着重介绍:主从模式

目录

主从模式

具体配置

主从结构

拓补结构

数据同步

全量复制

无磁盘模式(diskless)

实时复制


主从模式

在若干个Redis节点中,有“主节点”,有“从节点”,现在假设有三个服务器(三个节点),我们就可以把其中的一个节点作为“主节点”,另外两个作为“从节点”。

主节点可以读数据和写数据,而从节点是主节点的备份,或者叫数据同步于主节点,仅仅支持读操作。用户往往读操作要比写操作更加频繁,所以读操作可以读取任意的节点,大大缓解了主节点的压力。

此时,前面提到的两个问题都一定程度解决了:

  • 可用性:如果从节点挂掉了,完全不影响其他的节点,用户仍然能够正常读取数据。但是如果是挂掉了主节点,需要写数据的时候还是会写不了。
  • 并发量:用户读操作不再依赖于主节点,可以让不同的用户读取不同的从节点,极大地提高并发量。

具体配置

正常来说,配置Redis主从结构需要启动多个Redis服务器,每个服务器都应该在一个单独的主机上。但是我们手中只有一台云服务器,所以我们就在这一台云主机上面,运行多个redis-server进程。

我们把主节点的端口设置成6379(默认),把另外两个从节点的端口设置成6380和6381。

先把redis.conf这个文件复制两份,分别改名为slave1.conf和slave2.conf,再分别进入配置文件,修改端口号和主从结构配置。

通过配置文件把redis客户端启动。

主节点和从节点之间,通过127.0.0.1连接起来了。

验证实际的效果,主节点的数据变化,可以在从节点上看到。

这样,在一个云服务器上启动多个redis服务器的操作就完成了。但是这种方式并不是实际工作中的方式,本意是为了在多个主机上部署,利用多个硬件资源。

服务器的配置文件修改完之后,需要重新启动才能生效。如果通过kill -9这样的方式,redis-server会自动重启;而如果使用service redis-server start这种方式启动的服务器,就必须使用service redis-server stop来停止。

服务器很多时候为了保证稳定性和高可用,很多时候通过一些手段可以自动重启进程,对于整体的服务不会产生严重的影响。

主从结构

当我们建立起了连接后,通过

slaveof no one

这个命令可以直接让从节点断开主从关系,并且里面的数据是不会清除的。但是后续主节点如果针对数据做出修改,这个从节点是不能自动同步的。

假设我们让6381这个节点断开主从关系了,再通过

slaveof 127.0.0.1 6380

可以让6380作为6381的主节点,原来的主从结构就被改变了。

此时6380看起来是一个主节点,但它仍然不能写数据,只能通过6379来获取数据,同步给6381。

此处的修改是临时性的,因为并没有修改配置文件。如果重启了redis服务器,仍然会按照配置文件里的内容建立主从关系。

拓补结构

指的是各个节点之间,按照什么样的方式来进行组织连接。

如果写数据太多,就会给主节点造成太多压力,可以通过关闭主节点的AOF,只在从节点上开启AOF。但是这种方式有一个严重的缺陷:主节点一旦出现故障,不能让它自动重启。因为没有AOF文件,会丢失很多数据,一旦进行主从同步会把从节点的数据也删了。

改进办法:当主节点挂了之后,就需要让从节点从主节点这里获取到AOF文件,再启动。

实际开发中,读请求是远远超过写的请求。

如果采用如下主从结构,会导致主节点一份数据要同步很多次,对网络的要求非常高:

采用如下的方式,主节点就不需要那么高的网络带宽了,但是一旦数据进行修改,同步的延迟是比刚才更大的。

复制的过程并不复杂,但是有很多细节,对于一个从节点来说:

  1. 保存主节点信息:保存主节点的ip和端口
  2. 主从建立连接:TCP的连接(三次握手)
  3. 发送ping命令:验证主节点是否工作
  4. 权限验证:主节点是否有密码等
  5. 同步数据集
  6. 命令持续复制

第五步和第六步就是最关键的操作了~

数据同步

Redis提供了psync命令,完成数据同步。并且这个命令不需要我们手动执行,redis服务器会在建立好主从关系之后,自动执行psync。

psync可以从主节点获取全量数据,也可以获取一部分数据。通过info rellication可以查询到很多的信息。

offset就是偏移量,主节点和从节点都会维护偏移量。对于主节点来说,主节点上会收到很多修改操作的命令,每个命令都要占用几个字节,主节点会统计这些命令,最终生成一个offset。

从节点的偏移量描述了,现在数据同步到哪里了,如果从节点偏移量和主节点一样了,就说明主从节点数据完成同步了。

psycn带有具体的replid和offset值,主节点会根据这些参数判断适合全量复制还是部分复制。

进行全量复制:

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

进行部分复制:

  1. 之前进行过数据复制,但是因为网络抖动或者服务器重启了
  2. 从节点需要同步数据的时候,大部分数据都是一致的

全量复制

  1. 从节点发送psync命令给主节点进行数据同步,由于是第一次复制,从节点没有主节点的运行ID和数据偏移量,所以发送 psync ? -1 
  2. 主节点根据命令,解析出要进行全量复制,回复 +FLUURESYNC响应
  3. 从节点接收主节点的运行信息进行保存
  4. 主节点执行bgsave进行RDB文件的保存
  5. 主节点发送RDB文件给从节点,从节点保存RDB数据到本地硬盘
  6. 主节点把从生成RDB文件到接受完成期间执行的写命令,写入缓冲区,等从节点保存完RDB文件后,主节点再将缓冲区里面的数据补发给从节点。补发的数据仍然按照RDB的二进制格式追加写入到RDB文件中,保持主从一致性
  7. 从节点清空自身原有数据
  8. 从节点加载RDB文件得到与主节点一样的数据
  9. 如果从节点加载完RDB之后,开启了AOF持久化功能,会进行 bgrewriteof 操作,得到最近的AOF文件

在主节点生成RDB文件和传输RDB文件的过程中,会受到很多新的操作,新修改的数据必须也要同步给从节点。当主节点把RDB文件发过去之后,主节点就会把这些新的操作也发给从节点。

无磁盘模式(diskless)

主节点生成的RDB二进制数据,直接进行网络传输发给从节点,就不需要保存到本地磁盘了,可以省下一系列的读写硬盘操作。

从节点也可以直接把接收到的RDB数据,直接进行加载,无需存储到硬盘中。

但是即使引入了无硬盘模式,整个操作的消耗资源量仍然是很大的,特别是网络带宽的压力仍然很大。

实时复制

从节点已经和主节点同步好了数据,但是主节点会源源不断的收到新的数据,也需要把这些新的数据同步给节点。于是主从节点之间就会建立TCP长连接,主节点通过这个连接发给从节点。

在进行实时复制的时候,需要保证连接时刻处于可用状态,于是引入了心跳包机制。主节点默认每隔10s就给从节点发送一个ping命令,从节点收到后就返回pong。从节点默认每隔1s就给主节点发起一个特定的请求,就会上报当前从节点复制数据的进度,也就是offset偏移量。

到此,很多问题都可以通过主从模式来解决,但是如果主服务器真的挂了,我们不可能时时刻刻都盯着他,然后自己手动重启。于是Redis有哨兵来解决这个问题,下一篇文章,我们来讲讲哨兵~

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

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

相关文章

无人机之地面站篇

无人机的地面站,又称无人机控制站,是整个无人机系统的重要组成部分,扮演着作战指挥中心的角色。以下是对无人机地面站的详细阐述: 一、定义与功能 无人机地面站是指具有对无人机飞行平台和任务载荷进行监控和操纵能力的一组设备&…

Postgresql碎片整理

创建pgstattuple 扩展 CREATE EXTENSION pgstattuple 获取表的元组(行)信息,包括空闲空间的比例和行的平均宽度 SELECT * FROM pgstattuple(表名); 查看表和索引大小 SELECT pg_relation_size(表名), pg_relation_size(索引名称); 清理碎片方…

【魔法 / NOI】

题目 思路 动态规划: 状态定义: f [ k ] [ i ] [ j ] 对应使用了不超过 k 次魔法,从 i 到 j 的路径集合 f[k][i][j] 对应使用了不超过k次魔法,从i到j的路径集合 f[k][i][j]对应使用了不超过k次魔法,从i到j的路径集合 状…

vc-align源码分析 -- ant-design-vue系列

vc-align源码分析 源码地址:https://github.com/vueComponent/ant-design-vue/tree/main/components/vc-align 1 基础代码 1.1 名词约定 需要对齐的节点叫source,对齐的目标叫target。 1.2 props 提供了两个参数: align:对…

WPF-快速构建统计表、图表并认识相关框架

一、使用ScottPlot.Wpf 官网地址:https://scottplot.net/quickstart/wpf/ 1、添加NuGet包:ScottPlot.Wpf 2、XAML映射命名空间: xmlns:ScottPlot"clr-namespace:ScottPlot.WPF;assemblyScottPlot.WPF" 3、简单示例:…

2024年测评7款最佳AI论文修改润色平台

在2024年,AI论文修改润色平台的测评和推荐成为学术界和研究者们关注的热点。本文将详细评测并推荐7款最佳AI论文修改润色平台,包括千笔-AIPassPaper,并结合我搜索到的资料进行分析。 一、千笔-AIPassPaper 千笔-AIPassPaper是一款集论文大纲…

【Nginx系列】Nginx中rewrite模块

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SpringBoot教程(安装篇) | Elasticsearch的安装

SpringBoot教程(安装篇) | Elasticsearch的安装 一、确定Elasticsearch版本二、下载elasticsearch(windows版本)官网下载如何解压配置 允许 别人跨域 访问自己启动运行 三、Es可视化工具安装(elasticsearch-head&#…

DDS基本原理--FPGA学习笔记

DDS信号发生器原理: timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/09/04 15:20:30 // Design Name: hilary // Module Name: DDS_Module //module DDS_Module(Clk,Reset_n,Fword,Pword,Data);input Clk;input Reset_n;input [31:0]…

如何使div居中?CSS居中终极指南

前言 长期以来,如何在父元素中居中对齐一个元素,一直是一个让人头疼的问题,随着 CSS 的发展,越来越多的工具可以用来解决这个难题,五花八门的招式一大堆,这篇博客,旨在帮助你理解不同的居中方法…

自制游戏手柄--Android画面的input输入控制

在使用传感器获取到运动数据后,怎样转换为input事件传给手机呢,这里以Android为例, 我们可以考虑以下方式: 1. 物理方式,使用舵机连接触碰笔去实现, 2. 构造MotionEvent事件,注入input&#…

fastadmin 文件上传七牛云

1-安装七牛云官方SDK composer require qiniu/php-sdk 2-七牛云配置 <?phpnamespace app\common\controller;use Qiniu\Storage\BucketManager; use think\Config; use Qiniu\Auth; use Qiniu\Storage\UploadManager; use think\Controller; use think\Db;/*** 七牛基类*…

CTK框架(四): 插件编写

目录 1.生成插件 1.1.环境说明 1.2.服务类&#xff0c;纯虚类&#xff0c;提供接口 1.3.实现插件类&#xff0c;实现纯虚函数 1.4.激活插件&#xff0c;加入ctk框架的生命周期中 1.5.添加资源文件 1.6..pro文件 2.使用此插件 3.总结 1.生成插件 1.1.环境说明 编译ct…

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信…

[数据结构] 哈希结构的哈希冲突解决哈希冲突

标题&#xff1a;[C] 哈希结构的哈希冲突 && 解决哈希冲突 水墨不写bug 目录 一、引言 1.哈希 2.哈希冲突 3.哈希函数 二、解决哈希冲突 1.闭散列 I&#xff0c;线性探测 II&#xff0c;二次探测 2.开散列 正文开始&#xff1a; 一、引言 哈希表是一种非常实用而…

JS基础学习笔记

1.引入方式 内部脚本 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

Nginx跨域运行案例:云台控制http请求,通过 http server 代理转发功能,实现跨域运行。(基于大华摄像头WEB无插件开发包)

文章目录 引言I 跨域运行案例开发资源测试/生产环境,Nginx代理转发,实现跨域运行本机开发运行II nginx的location指令Nginx配置中, 获取自定义请求header头Nginx 配置中,获取URL参数引言 背景:全景监控 需求:感知站点由于云台相关操作为 http 请求,http 请求受浏览器…

抢鲜体验 PolarDB PG 15 开源版

unsetunsetPolarDB 商业版unsetunset 8 月&#xff0c;PolarDB PostgreSQL 版兼容 PostgreSQL 15 版本&#xff08;商业版&#xff09;正式发布上线。 当前版本主要增强优化了以下方面&#xff1a; 改进排序功能&#xff1a;改进内存和磁盘排序算法。 增强SQL功能&#xff1a;支…

C++笔试强训12、13、14

文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用&#xff1a;是一个别名&#xff0c;与其被引用的实…

计算机网络(二) —— 网络编程套接字

目录 一&#xff0c;认识端口号 1.1 背景 1.2 端口号是什么 1.3 三个问题 二&#xff0c;认识Tcp协议和Udp协议 三&#xff0c;网络字节序 四&#xff0c;socket编程接口 4.1 socket常见API 4.2 sockaddr结构 一&#xff0c;认识端口号 1.1 背景 问题&#xff1a;在进…