掌握 Redis 数据冗余:主从服务器的角色与职责

2024-09-06 10:28

本文主要是介绍掌握 Redis 数据冗余:主从服务器的角色与职责,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

掌握 Redis 数据冗余:主从服务器的角色与职责

  • 一 . 什么是主从复制
    • 1.1 主从复制是什么 ?
    • 1.2 什么是主从模式
    • 1.3 主从复制能够解决的问题
  • 二 . 配置主从复制
    • 2.1 启动多个 redis-server
    • 2.2 配置主从模式
    • 2.3 查看主从结构信息
    • 2.4 断开 / 临时修改主从结构
  • 三 . 主从复制的补充内容
    • 3.1 安全性、只读、传输延时
      • 安全性
      • 只读
      • 传输延迟
    • 3.2 主从复制的拓扑结构
    • 3.3 主从复制的基本流程
      • replicationid 的作用
      • offset 的作用
      • psync 的执行流程
    • 3.4 全量复制和部分复制
    • 3.5 实时复制
    • 3.6 从节点什么情况下会自动升级成主节点
  • 四 . 小结

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家讲解的是 Redis 的主从复制机制 . Redis 主从复制是一种重要的数据冗余机制 , 它允许多个从服务器(slaves)精确地复制主服务器(master)的数据 . 那具体什么叫做主服务器 , 什么叫做从服务器 ? 我们可以一起研究一下 .

在这里插入图片描述

本专栏旨在为初学者提供一个全面的 Redis 学习路径,从基础概念到实际应用,帮助读者快速掌握 Redis 的使用和管理技巧。通过本专栏的学习,能够构建坚实的 Redis 知识基础,并能够在实际学习以及工作中灵活运用 Redis 解决问题 .
专栏地址 : Redis 入门实践

一 . 什么是主从复制

1.1 主从复制是什么 ?

在分布式系统中 , 涉及到一个非常关键的问题 : 单点问题 , 如果某个服务器只有一个节点 (也就是说只搞一个物理服务器来部署服务器程序) , 那这样的话就可能会遇到一些困难

  1. 可用性问题 : 如果这个机器挂了 (比如 : 服务器内存过载、服务器硬盘已满 …) , 那就意味着这个服务就中断了 , 无法给其他服务提供支持
  2. 性能 / 支持的并发量也是有限的 : 一个服务器处理请求 , 每个请求都需要消耗一定的硬件资源 (CPU、内存、硬盘、网络带宽 …) , 那一台主机的硬件资源也是有限的 , 如果消耗的硬件资源超过了主机能够提供的硬件资源 , 那么就会导致主机出现一些异常情况

那引入分布式系统 , 主要也是为了解决单点问题 .

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

在分布式系统中 , 存在以下几种 Redis 的部署方式

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

我们先了解一下主从模式

1.2 什么是主从模式

在若干个 Redis 节点中 , 分为主节点和从节点 .

比如我们有三个物理服务器 (叫做三个节点) , 分别部署了 redis-server 进程 , 此时就可以把其中的一个节点 , 作为主节点 , 另外的两个节点作为从节点 .

从节点的数据要跟随主节点进行变化 , 从节点的数据要跟主节点保持一致 . (从节点就相当于主节点的副本)

❓ 如果我们修改了从节点的数据 , 是否需要把从节点的数据往主节点上同步呢 ?

✔️ 不可以

在 Redis 的主从模式中 , 从节点上面的数据 , 是不允许修改的 , 只能提供读取操作 .

1.3 主从复制能够解决的问题

那如果是单点模式 , 如果这个 Redis 服务器节点挂了 , 那整个 Redis 就都挂了 . 如果是上面的主从结构 , 那这些 Redis 的机器是很小可能性同时挂的 .

但是也有可能整个机房全挂了 (断电 / 断网 …) , 那为了考虑到更高的可用性 , 就可以把这些节点放到全国各地不同的机房中 , 这就是异地多活 .

如果我们只是挂了某个从节点 , 并不会造成什么影响 , 其他从节点继续从主节点中读取数据即可 .

但是如果挂掉了主节点 , 还是有一定影响的 , 从节点依然可以正常读数据 , 但是主节点并不能继续写入数据了 .

更严谨的说 , 主从模式主要是提升的 “读操作” , 来去提升高并发和高可用的要求 , 而写操作的话 , 无论是高并发还是高可用 , 都非常依赖主节点 , 但是主节点只能有一个

主节点只能有一个的原因是当我们有多个主节点 , 那不同的主节点插入同一个数据 , 这样就会造成数据的冗余 , 不能确定哪个数据到底是我们真正需要的 [也就是一山不容二虎]

二 . 配置主从复制

2.1 启动多个 redis-server

既然要配置主从复制模式 , 那我们肯定需要启动多个 Redis 服务器 . 正常情况下 , 每个 Redis 服务器程序 , 都应该部署在各自单独的主机上 , 这才是真正的分布式 .

但是一般来说 , 我们每个人手里应该只有一个云服务器 , 所以我们只能这样操作 : 在一个云服务器主机上 , 运行多个 redis-server 进程 , 但是要保证多个 redis-server 的端口号是不同的 .

本来 redis-server 默认的端口号是 6379 , 那么我们配置新的 redis-server 就不能再使用 6379 了

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

  1. 可以在启动程序的时候 , 通过命令行来去指定端口号
  2. 在配置文件中 , 设定端口号

我们选择第二种方式

首先 , 我们在我们的根目录创建一个文件夹 , 叫做 redis-conf

cd / # 进入到根目录
mkdir redis-conf # 创建 redis-conf 文件夹

然后进入到该文件夹 , 使用 cd redis-conf 命令

接下来 , 我们就需要创建多份配置文件了

将原来的 Redis 的配置文件拷贝过来

# 将 redis.conf 复制过来 , 然后重命名为 slave1.conf / slave2.conf
cp /etc/redis/redis.conf ./slave1.conf
cp /etc/redis/redis.conf ./slave2.conf

这样的话我们就已经有了一个主节点和两个从节点 , 主节点的配置不用修改 , 我们只需要修改从节点的配置即可

使用 vim slave1.conf 和 vim slave2.conf 命令即可

我们需要修改两个位置

端口号 : 修改成 6380

daemonize 修改成 yes (有的电脑上直接就是 yes) , 它的作用是让 redis-server 能够在后台运行

直接在底部输入 /daemonize 就可以进行搜索

此时 , 我们就可以通过在启动 Redis 服务端的时候 , 在后面追加配置文件参数就可以达到启动多个服务器的效果了

# 启动多个 redis-server
root@hecs-327683:~/redis-conf# redis-server ./slave1.conf
root@hecs-327683:~/redis-conf# redis-server ./slave2.conf
root@hecs-327683:~/redis-conf# ps -aux | grep redis-server
redis    3858927  0.1  0.5  67196 10048 ?        Ssl  Jan02   1:20 /usr/bin/redis-server 0.0.0.0:6379
root     3934457  0.1  0.3  67196  5776 ?        Ssl  09:56   0:00 redis-server 0.0.0.0:6380 # slave1 已经启动
root     3934659  0.0  0.3  67196  5820 ?        Ssl  09:56   0:00 redis-server 0.0.0.0:6381 # slave2 已经启动
root     3934871  0.0  0.1   6608  2284 pts/1    S+   09:56   0:00 grep --color=auto redis-server

但是此时只是三个普通的 redis-server 节点 , 我们需要将他们进行绑定 , 形成主从模式

2.2 配置主从模式

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

  1. 在配置文件中加入 slaveof {masterHost} {masterPort} , 然后 Redis 重启生效
  2. 在 redis-server 启动命令加入 --slaveof {masterHost} {masterPort}
  3. 直接使用 Redis 命令 : slaveof {masterHost} {masterPort}

我们依然选择使用配置文件的方式

分别使用 vim /root/redis-conf/slave1.conf 和 vim /root/redis-conf/slave2.conf

然后跳转到配置文件最底部 , 使用快捷键 Shift + G

然后添加这两行内容

# 主从结构的配置
slaveof 127.0.0.1 6379

然后按 ESC 然后输入 :wq 进行保存

然后对 slave1 和 slave2 进行重启

使用 netstat -anp | grep redis 找到我们的进程 ID , 然后通过 kill -9 进程 ID 来去停止线程

如果启动方式使用的是 redis-server 这种方式 , 那结束线程就需要使用 kill -9 进程 ID 这种方式来去停止线程

如果启动方式使用的是 service redis-server start 这种方式启动的 , 就必须使用 service redis-server stop 来去停止线程 , 如果使用 kill -9 进程 ID 这种方式杀死进程 , 那 redis-server 就会自动启动

然后我们重新运行 slave1 和 slave2

cd /root/redis-conf
redis-server ./slave1.conf
redis-server ./slave2.conf

那这个时候我们就可以验证主从结构是否部署成功

我们可以看到 , 主节点这边发生任何的修改 , 从节点就能够立即感知到

另外 , 从节点能否写入数据呢 ?

2.3 查看主从结构信息

我们刚才已经配置好了主从结构 , 并且已经验证了主节点可以写数据而从节点不能写数据 , 但是从节点可以读取数据这样的特性 .

那当我们建立好主从结构之后 , 我们也还可以通过命令来查看的 : info replication

那我们分别来看

先来看主节点的相关信息

再来看一下从节点的相关信息

2.4 断开 / 临时修改主从结构

我们可以通过 slave no one 这个命令来去断开已有的主从复制关系 , 这个命令直接执行即可 , 不需要修改配置文件

此时再去查看主节点的主从结构信息

我们再来看一下从节点的主从结构信息

虽然从节点断开了主从关系 , 他就不在属于任何其他节点了 , 但是他之前保存的主节点的数据依然存在

但是后续主节点如果针对数据进行修改 , 从节点就无法再同步数据了

我们还可以使用 slave 这个命令让当前节点去投靠别的节点 [认贼作父] , 但是这种修改只是临时的 , 如果我们重新启动 Redis 整个服务器 , 他依然会按照配置文件中配置的主从关系来去配置

我们使用 slaveof 目标 IP 目标端口号 这个命令

此时 , 整条脉络就发生了变化

我们也可以通过 info replication 命令来去查看

虽然此时 slave2 看起来是一个主节点 , 但是他实际上仍然是从节点 , 只是作为 slave1 同步数据的来源 , slave2 本身仍然是不能修改数据的

那我们重启一下服务器 , 看一下主从结构是否会恢复到配置文件中设置的情况

此时我们再来查看每个节点他所对应的主从结构信息

三 . 主从复制的补充内容

3.1 安全性、只读、传输延时

安全性

对于数据比较重要的节点 , 主节点可以在配置文件中通过设置 requirepass 参数进行设置密码 . 设置成功之后 , 所有的从节点都需要输入密码才能访问数据 .

同时 , 要求从节点也需要设置密码并且与主节点密码保持一致 , 才能够让从节点成功访问到主节点的数据 , 从节点也需要在配置文件中设置 masterpath 参数并且其密码要跟主节点一致 .

我们就不去配置了 , 很有可能给我们带来很多麻烦

只读

默认情况下 , 从节点不允许修改数据 .

但是我们可以在配置文件中修改 slave-read-only 这个参数为 no , 从节点就可以去修改数据了 , 但是这就违反了主从结构了 .

传输延迟

Redis 的主节点和从节点是通过网络 (TCP) 来进行数据传输的 , 只要是通过网络传输就会存在延迟 .

那 TCP 的底层设计支持 nagle 算法 , 如果开启就会增加 TCP 的传输延迟 , 然后节省了网络带宽 ; 如果关闭就会减少 TCP 的传输延迟 , 但是会增加网络带宽 .

一般情况下 , TCP 的 nagle 算法默认是开启的 , 他就类似于 TCP 的捎带应答机制 , 他会把一些小的 TCP 数据报进行合并 , 这样就减少了每次网络传输的包的个数次, 减少了封装和分用操作 .

一般来说及时性要求很高的游戏 , 就需要关闭 nagle 算法机制 .

在配置文件中 , 配置文件就提供了一个配置项 : repl-disable-tcp-nodelay , 这个选项可以用于在主从同步的通信过程中 , 关闭 TCP 的 nagle 算法 , 使从节点能够快速地和主节点进行同步 .

3.2 主从复制的拓扑结构

拓扑结构指的就是若干个节点之间 , 按照什么样的方式来进行组织和连接 .

在 Redis 中支持多种拓扑结构

  1. 一主一从结构 : 主节点和从节点存储的数据是一样的 , 主节点负责写数据 , 从节点负责读数据 , 但是从节点不能写数据

  1. 一主多从结构 : 在实际开发中 , 往往读请求是远远超过写请求的 , 所以还要进一步增强读请求的处理能力

  1. 树形主从结构

3.3 主从复制的基本流程

我们重点关注数据同步的过程 , 也就是同步数据集和命令持续复制阶段

在 Redis 中 , 提供了一个 psync 命令来去同步数据 . 一般是从节点负责执行 psync , 也就是从节点负责从主节点拉取数据

psync 不需要我们手动执行 , Redis 服务器在建立好主从关系之后 , 会自动执行 psync

我们也可以手动输入 psync 命令 : psync replicationid offset , 我们来分析一下参数的含义

replicationid 的作用

replication 指的就是复制 , 那 replicationid 就是复制 ID 喽 . replicationid 是主节点在启动的时候就会生成的

即使是同一个主节点 , 每次重启生成的 replicationid 都是不一样的

可以通过 info replication 获取到当前 replicationid 的值

当从节点和主节点建立了复制关系 , 从节点就会从主节点这边获取到 replicationid , 来作为对应的身份标识 .

那我们也可以看到 , replid 有两个 , 那第二个 replid 是什么含义呢 ?

一般情况下 , replid2 是用不上的 , 只有在少数情况下会用到 .

比如 : 有一个主节点 A , 还有一个从节点 B . 主节点会生成 replid , 从节点就会获取到主节点的 replid , 如果 A 和 B 通信过程中出现了一些网络抖动 , 从节点就会认为主节点挂了 , 那从节点就会变身为主节点 , 然后自动生成 replid , 但是从节点也会记录之前的旧的 repllid , 这就是 replid2 .

后续网络稳定了 , 从节点 B 还可以根据 replid2 来去找到之前的主节点 A , 然后继续之前的主从复制 .

offset 的作用

offset 叫做偏移量 , 主节点和从节点都有维护这个偏移量

  • 主节点上会收到很多修改命令 , 每个命令都需要占据几个字节 , 那主节点会把这些修改命令的字节数累加 , 就会得到一个不断变大的数字
  • 从节点的偏移量指的是从节点的数据同步到哪里了

replicationid 和 offset 共同描述了一个数据集合 , replicationid 描述的是数据从哪个节点上同步 , offset 就表示同步的进度 . 如果发现两个机器的 replication id 一样 , offset 也一样 , 就可以认为这两个 Redis 机器上存储的数据就是完全一样的 .

psync 的执行流程

3.4 全量复制和部分复制

全量复制的流程

全量复制的无硬盘模式

部分复制 : 从节点需要从主节点这里进行全量复制 , 那全量复制他的开销是很大的 . 但是有的时候从节点已经持有了主节点绝大部分数据 , 这个时候全量复制就不太适合了 .

部分复制一般出现在比如说网络抖动 , 主节点这边最近修改的数据可能就无法及时同步过来了 , 更严重的情况下从节点就感知不到主节点从而自动升级为主节点了 (但是网络抖动一般都是暂时的 , 几秒之后就能自动回复了) . 当从节点和主节点重新建立连接之后 , 就需要进行数据的同步 .

在最刚开始从节点全量获取主节点数据的时候 , 就已经获得了具体的 replid 和 offset 的值 , 那主节点就需要根据 psync 的 offset 参数来去进行判定当前这次复制是全量复制还是部分复制

3.5 实时复制

我们之前介绍过

  • 全量复制 : 从节点刚开始连接上主节点之后 , 获取主节点全部数据的过程
  • 部分复制 : 由于网络抖动等原因 , 导致从节点与主节点断开连接 . 等到再次连接的时候 , 从节点就需要获取丢失的数据 .

那实时复制是从节点已经和主节点同步好数据了 , 但是主节点之后也会不断收到一些新的数据 , 那就需要同步给从节点 . 从节点就需要和主节点之间建立 TCP 长连接 , 然后主节点就需要把收到的修改数据的请求通过 TCP 长连接发送给从节点 , 从节点再根据这些修改请求来去修改内存中的数据 .

那通过 TCP 长连接将数据同步给从节点这个过程也是需要时间的 . 正常来说这个延时是比较短的 , 但是如果是多层从节点 (树形主从结构) , 那延时就有可能很大 .

在实时复制的时候 , 需要始终保证连接处于可用状态 , 采用的是心跳包机制 .

  • 主节点默认每 10s 就给从节点发送一个 ping 命令 , 从节点收到就会返回 pong . 如果 60s 还未收到 pong , 就会认为从节点下线
  • 从节点默认每隔 1s 就会给主节点发送一个特定的请求 , 请求中就包含了当前从节点复制数据的进度 (也就是 offset)

3.6 从节点什么情况下会自动升级成主节点

从节点是否会自动升级成主节点 :

  1. 从节点主动和主节点断开连接 : 使用 slaveof no one 命令 , 这个时候从节点就能够晋升为主节点
  2. 主节点挂了 : 这个时候从节点不会自动晋升成主节点 , 必须通过人工干预的方式恢复主节点

四 . 小结

主从复制解决了单点问题 :

  1. 单个 Redis 节点可用性不高
  2. 单个 Redis 节点性能有限

主从复制的特点 :

  1. 通过 Redis 内部的复制功能实现主节点的多个副本
  2. 要求主节点用来写 , 从节点用来读 , 这样就降低了主节点的压力
  3. 支持多种拓扑结构 : 一主一从、一主多从、树形主从结构
  4. 复制分为全量复制、部分复制、实时复制
  5. 主节点和从节点通过心跳机制来验证主从节点是否正常连接

配置主从复制

  1. 主节点配置无需改动
  2. 从节点在配置文件中加入 slaveof 主节点IP 主节点端口

主从复制的缺点 : 从节点如果过多 , 就会存在非常高的延时性


主从复制的机制就给大家介绍完毕了 , 不知道你掌握多少呢 ? 不如先给个一键三连 ?
在这里插入图片描述

这篇关于掌握 Redis 数据冗余:主从服务器的角色与职责的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141767

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X