【redis】主从复制:单点问题、配置详解、特点详解

news2025/3/25 22:29:49

文章目录

  • 单点问题
  • 什么是主从复制
  • 主从模式能解决的问题
      • 并发量有限
      • 可用性问题
  • 配置
    • 建立复制
      • 通过配置文件来指定端口
      • 配置主从
      • 查看集群结构
    • 断开复制
  • 特点
    • 安全性
    • 只读
    • 传输延迟

单点问题

分布式系统中,涉及到一个非常关键的问题:单点问题


某个服务器程序,只有一个节点(只搞一个物理服务器,来部署这个服务器程序)。这就可能会遇到一些问题:

  1. 可用性问题。如果这个机器挂了,意味着服务就中断了
  2. 性能/支撑的并发量也是比较有限的

引入分布式系统,主要也就是为了解决上述的单点问题

什么是主从复制

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

在分布式系统重,希望使用多个服务器来部署 redis,存在以下几种 redis 部署方式:

  1. 主从模式
  2. 主从+哨兵模式
  3. 集群模式

主从模式:

在若干个 redis 节点中,有的是“主节点”,有的是“从节点”。假设有三个物理服务器(称为三个节点),分别部署了一个 redis-server 进程

此时就可以把其中的一个节点,作为“主节点”,另外两个节点作为“从节点”。

  • 从节点得听主节点的(从节点上的数据要跟随主节点变化;从节点的数据要和主节点保持一致)
  • 本来,在主节点上保存一堆数据,引入从节点后,就是要把主节点上面的数据,复制出来放到从节点中。后续,主节点这边对于数据有任何修改,都会把这样的修改给同步到从节点
  • 从节点就是主节点的副本

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

主从模式能解决的问题

并发量有限

image.png|529

  • 由于从节点的数据都是时刻和主节点保持一致的,所以其他的客户端从从节点读取数据,和从主节点这里读取数据,是没有区别的
  • 后续如果有客户端来读取数据了,就可以从上述节点中,随机挑一个节点,给这个客户端提供读取数据的服务
    • 引入了更多的计算资源,自然能够支撑的并发量也就大幅提高了

可用性问题

之前只是单个 redis 服务器节点,此时这个机器挂了,整个 redis 就挂了

  • 上述这个主从结构,这些 redis 的机器不太可能“同时挂了”

但是整个机房,是否可能被一锅端了?(也是可能存在的)

  • 这个时候如果考虑到更高的可用性,就可以把这些机器放到多个不同的机房中(异地多活

  • 如果是挂掉了某个从节点,没什么影响。此时继续从主节点或者其他从节点读取数据,得到的效果完全相同

  • 如果挂掉了主节点,还是有一定影响的。从节点只能读取数据,如果需要写数据,就没得写了
    可用性是提高了,但还是没有到非常理想的程度

我们可以弄多个主节点吗?

  • 一山容不得二虎
  • 如果存在两个主节点,相互之间如何同步数据,是个麻烦事

更准确的说,主从模式,主要是针对“读操作”进行并发量&可用性的提高。而写操作的话,无论是可用性还是并发,都是非常依赖主节点,主节点又不能搞多个。实际业务场景中,读操作往往就是比写操作更加频繁

主从结构,是分布式系统中比较经典的一种结构。不仅仅 redis 支持,MySQL 也支持

配置

建立复制

配置 redis 主从结构,首先需要启动多个 redis 服务器。正常来说,每个 redis 服务器程序,应该在一个单独的主机上(才是分布式)

没有多个服务器,我们可以在一个服务器上,运行多个 redis-server 进程

  • 我们要保证 redis-server 的端口是不同的
  • 默认端口为:6379,此时就不能让新启动的 redis-server 再继续使用 6379

如何去指定 redis-server 的端口呢?

  1. 可以在启动程序的时候,通过命令行来指定端口号。-port 选项
  2. 也可以直接在配置文件中,来设定端口

通过配置文件来指定端口

此处我们准备搞一个主节点,两个从节点image.png|234

  • slave1 是从节点 1,配置文件设置的 6380
  • slave2 是从节点 2,配置文件设置的 6381
  • redis 是主节点,端口为 6379
    从节点的配置文件都是复制的主节点的,只是把端口号改了。还需要把守护模式设为 yesdaemonize yes

image.png|454

  • 此时就可以看到启动了三个服务器(一主两从)
  • 但此时这几个节点还未构成主从结构,而是各自为政。要想成为主从结构,还需要进一步的进行配置

配置主从

要想配置成主从结构,就需要使用 slaveof

  1. 在配置文件中加入 slaveof {masterHost} {masterPort}Redis 启动生效
  2. redis-server 启动命令时加入 --slaveof {masterHost} {masterPort} 生效
  3. 直接使用 Redis 命令:slaveof {masterHost} {masterPort} 生效
    一般是使用配置文件更多,修改配置文件是一直持久生效的,重启后也能用

直接加上相关信息:
image.png

  • Redis 服务器的配置文件改完之后,要重启服务器

主从结构配置好之后,我们看一下网络状态image.png

image.png

  • 主节点随时修改,从节点能立即感知到
  • 但是从节点不能改,只能读

查看集群结构

使用:

info replication

image.png

  • offset
    • 主节点上会收到源源不断的“修改数据”请求,从节点就需要从主节点这里同步这些修改请求
    • 从节点和主节点之间的数据同步,不是瞬间完成的
    • offset 就相当于是从节点和主节点之间,同步数据的进度
  • lag
    • 表示延迟,单位为复制日志的条目数。
  • connected slaves
    • 从节点下面还可以接从节点

断开复制

直接使用 slaveof no one 这个命令,来断开现有的主从复制关系 image.png|399

  • 从节点断开主从关系,它就不再从属于其他节点了,里面已经有的数据,是不会抛弃的
  • 但后续主节点再针对数据进行修改,从节点就无法再自动同步数据了

但是重启服务器之后,还是会回到之前一主两从的结构,因为配置文件里面是这样设置的

特点

安全性

对于数据比较重要的节点,主节点会通过设置 requirepass 参数进⾏密码验证,这时所有的客⼾端访问必须使⽤ auth 命令实⾏校验。

从节点与主节点的复制连接是通过⼀个特殊标识的客⼾端来完成,因此需要配置从节点的 masterauth 参数与主节点密码保持⼀致,这样从节点才可以正确地连接到主节点并发起复制流程。

只读

默认情况下,从节点使⽤ slave-read-only=yes 配置为只读模式。

由于复制只能从主节点到从节点,对于从节点的任何修改主节点都⽆法感知,修改从节点会造成主从数据不⼀致。所以建议线上不要修改从节点的只读模式。

传输延迟

主节点和从节点之间通过网络(TCP)来传输。TCP 内部支持了 nagle 算法(默认开启

  • 开启了,就会增加 TCP 的传输延迟,节省了网络带宽
  • 关闭了,就会减少 TCP 的传输延迟,增加了网络带宽
  • 目的和 TCP 的捎带应答是一样的,针对小的 TCP 数据报,进行合并,从而减少包的个数(等待合并的时候就会耗时)

repl-disable-tcp-nodelay 参数就可以用于在主从通信过程中,关闭 TCPnagle 算法,从而减少传输延迟,不过会增加网络带宽

  • 从节点更快的和主节点进行同步
  • 一般游戏开发,有其是及时性要求很高的(fpsmoba…)都要关闭 nagle 算法

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

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

相关文章

android......

事件源,就是视图对象,先注册一个监听器,等待用户触发了屏幕,一旦触发会立即产生一个事件源,事件源会生成一个用户点击的触发事件,此刻监听器会立马监听到 ,然后监听器调用回调方法 UI理解 全称用…

常见中间件漏洞(tomcat)

CVE-2017-12615 当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产生,(需要允许put请求) , 攻击者可以利用PUT方法通过精心构造的数据包向存在漏洞的服务器里面上传…

计算机网络高频(二)TCP/IP基础

计算机网络高频(二)TCP/IP基础 1.什么是TCP/IP⭐⭐ TCP/IP是一种网络通信协议,它是互联网中最常用的协议之一。TCP/IP有两个基本的协议:TCP(传输控制协议)和IP(互联网协议)。 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议。它负…

国际护士节知识竞赛主持稿串词

在这充满火热激情的季节,我们又迎来了5.12国际护士节。让我们首先向辛勤奋战在护理工作一线的全县广大护士姐妹们道一声: (男)让我们再一次以热烈的掌声欢迎他们:预祝各参赛代表队在护理知识竞赛中赛出风格,赛出水平,取得满意的成绩。 (女)…

Elasticsearch:可配置的推理 API 端点分块设置

作者:来自 Elastic Daniel Rubinstein Elasticsearch 开放推理 API 现已支持可配置的分块,以便在文档摄取时处理语义文本字段。 Elasticsearch 推理 API 允许用户利用各种提供商的机器学习模型执行推理操作。其中一个常见用例是在索引中支持用于语义搜索…

数据结构之链表(双链表)

目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点: 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插: 头插: 4.双链表的尾删和头删 尾删: 头删: …

uniapp从 vue2 项目迁移到 vue3流程

以下是必须为迁移到 vue3 进行调整的要点,以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…

案例:网络命名空间模拟隔离主机场景

场景描述 假设我们需要在同一台物理机上模拟两台独立的主机(Host A 和 Host B),它们分别位于不同的网络命名空间中,并通过虚拟以太网对(veth pair)进行通信。目标是展示网络命名空间的隔离性和跨命名空间的…

23种设计模式-生成器(Builder)设计模式

工厂方法设计模式 🚩什么是生成器设计模式?🚩生成器设计模式的特点🚩生成器设计模式的结构🚩生成器设计模式的优缺点🚩生成器设计模式的Java实现🚩代码总结🚩总结 🚩什么…

蓝桥杯备考:BFS最短路径之Meteor Shower S流星雨

本题是一个BFS最短路问题&#xff0c;我们可以先把时刻的矩阵搞出来&#xff0c;哪些时刻哪些方块儿不能走用来剪枝 如果第一次走到永远不会被扎到的区域&#xff0c;那时候就是我们的最短距离 定义方向向量 #include <iostream> #include <queue> #include <c…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整活…

数据结构5(初):排序

目录 1、排序的概念以及常见的排序算法 1.1、排序的概念 1.2、常见的排序算法 2、常见排序算法的实现 2.1、插入排序 2.1.1、直接插入排序 2.1.2、希尔排序 2.2、选择排序 2.2.1、直接选择排序 2.2.2、堆排序 2.3、交换排序 2.3.1、冒泡排序 2.3.2、快速排序 2.3.…

2025-03-23 学习记录--C/C++-C语言 sprintf()实现将多个值按指定格式拼接成字符串

C语言 sprintf()实现将多个值按指定格式拼接成字符串 举个例子 &#x1f330;&#xff1a;将字符串 “m” 与数字 0、1、2 动态拼接成 “m0”、“m1”、“m2”&#xff1a;&#x1f447;&#x1f3fb; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用输入…

【小程序开发】完整项目结构长啥样?

Hello,欢迎来到AI技术库。AI写代码的时代,人人都可以成为程序员。欢迎继续【小程序开发】系列课。上节课中,我们学习了【手把手教你小程序开发】什么是大前端?,本节课,我们学习第二篇 小程序的完整项目结构。 本文适合阅读对象: 1. 非计算机专业AI爱好者;2. 小程序开发…

计算机网络精讲day2———计算机网络的性能指标(下)

性能指标5&#xff1a;时延带宽积 时延带宽积传播时延*带宽 这里要注意是传播时延不是发送时延 重点&#xff1a;管道法解析时延带宽积 我们以一个圆柱形管道来代表链路&#xff0c;管道的长度是链路的传播时延&#xff08;以时间作为单位单位表示链路长度&#xff09;&#x…

【多线程】初始线程和Thread类

一. 线程 1. 线程的引入 虽然进程已经可以解决并发编程这种问题&#xff0c;但是进程在频繁进行创建和销毁的时候&#xff0c;系统开销非常大&#xff0c;如果一个服务器向你发送多个请求&#xff0c;针对每一个请求&#xff0c;都需要创建一个进程来应答&#xff0c;每个进程…

WebLogic中间件常见漏洞

一、后台弱⼝令GetShell 1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.访问网站并登陆后台 /console/login/LoginForm.jsp 默认账号密码&#xff1a;weblogic/Oracle123 3.点击部署&#xff0c;点击安装&#xff…

[笔记.AI]多头自注意力机制(Multi-Head Attention)

多头自注意力是深度学习领域&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;和Transformer模型中的关键概念。其发展源于对序列数据中复杂依赖关系的建模需求&#xff0c;特别是在Transformer架构的背景下。 举例 比喻-读长篇文章 用一个简单的比喻来理解“多头注…

【基于ROS的A*算法实现路径规划】A* | ROS | 路径规划 | Python

### 记录一下使用Python实现ROS平台A*算法路径规划 ### 代码可自取 &#xff1a;Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git 目录 一、思路分析 二、算法实现 三、路径规划实现 一、思路分析 要求使用A*算法实现路径规划&#xff0c;可以将该任务分为三…

keda基于postgresql伸缩dify-api服务

1 概述 dify-api使用postgresql来存储数据&#xff0c;在dify控制台每新建一个聊天机器的聊天框&#xff0c;就会在conversations表里新插入一条记录&#xff0c;并且不断地更新字段updated_at&#xff0c;示例如下&#xff1a; dify# select * from conversations limit 1; …