Redis系列(三):深入解读Redis主从同步机制

首发博客地址

https://blog.zysicyj.top/

Redis高可靠靠什么保证?

为什么要提这个呢,因为Redis主从库目的呢其实就是为了实现高可靠。上篇文章中我们说过Redis的AOF、RDB日志其实就是为了减少数据丢失,这是高可靠的一部分。

这篇文章呢,我们聊聊Redis实现高可靠的另一方面:尽量减少服务中断。这里Redis是怎么做的呢?Redis的做法是增加副本冗余,将一份数据同时保存在多个实例上。这样某个实例挂掉并不影响其它实例提供对外服务,保证我们的业务正常运行。

Redis有哪些手段提高高可用呢?

  1. 数据持久化:Redis 支持多种数据持久化方式,包括快照(snapshotting)和日志(append-only file)。快照会定期将内存中的数据保存到磁盘文件,而日志会记录每次写操作,以便在重启时进行恢复。这些持久化方式可以确保即使服务器意外关闭,数据也不会丢失。

  2. 主从复制:Redis 支持主从复制机制,其中一个 Redis 实例作为主节点,负责写操作,而其他实例作为从节点,负责复制主节点的数据。这种方式可以实现数据的备份和负载均衡,从而提高可靠性和性能。

  3. Sentinel 哨兵:Redis Sentinel 是一个监控和自动故障恢复系统,可以监控 Redis 实例的健康状态并在主节点故障时自动进行故障切换。它可以确保系统在主节点发生故障时能够自动切换到备用的从节点,保证服务的连续性。

  4. Cluster 集群:Redis Cluster 是一种分布式系统,将数据分布在多个节点上,以提高可用性和扩展性。每个节点都持有部分数据,并且可以容忍部分节点的故障。当节点发生故障时,集群可以自动重新分配数据,确保服务的可靠性和高可用性。

如何保证副本数据一致?

首先我们要知道,Redis提供了主从库模式,以保证副本一致,主从库之间采用的是读写分离的方式。

Redis主从库和读写分离
Redis主从库和读写分离

Redis中的读写分离基本原理和步骤

Redis 读写分离是一种架构设计,将读操作和写操作分别路由到不同的 Redis 节点上,以提高性能和扩展性。在 Redis 读写分离中,通常会有一个主节点负责写操作,多个从节点负责读操作。

  1. 主节点(写节点)

    • 主节点负责处理所有的写操作,包括写入、更新和删除等。
    • 写操作在主节点上执行,然后主节点将写操作的结果同步到所有从节点。
  2. 从节点(读节点)

    • 从节点负责处理读操作,例如获取数据、查询等。
    • 从节点从主节点复制数据,并在本地保存一份与主节点相同的数据副本。
  3. 读写分离的实现

    • 客户端根据需要的操作类型将请求分发到主节点或从节点。
    • 读操作可以通过负载均衡策略,将请求分发到不同的从节点,实现负载分担。
    • 写操作仍然发送给主节点,确保数据的一致性和完整性。

需要注意的是,Redis 读写分离并不是完全的数据实时同步,因为从节点的数据可能会有一定的延迟。另外,读写分离适用于大多数场景下的负载均衡和性能优化,但在一些特定情况下,例如有序集合等复杂数据结构的查询,仍然需要访问主节点。

实现 Redis 读写分离需要正确配置主从节点的关系,以及在客户端中使用合适的策略进行读写操作的路由。同时,需要注意主节点和从节点之间的数据同步和故障处理,以确保系统的稳定性和可靠性。

Redis主从库第一次同步是如何实现的?

  1. 建立连接: 从服务器会向主服务器发送 PSYNC 命令,表示要进行同步。主服务器收到 PSYNC 命令后,会创建一个专门用于复制的后台线程(replication thread),并等待从服务器的连接。

  2. 全量复制(第一次同步): 当从服务器连接到主服务器后,主服务器会将自己的数据发送给从服务器。这个过程叫做全量复制,主服务器会遍历自己的数据集,将所有数据发送给从服务器。

    • 主服务器会在一个 RDB 文件中保存当前数据集的快照,然后将这个 RDB 文件发送给从服务器。从服务器接收到 RDB 文件后,会加载这个文件,将自己的数据集替换成主服务器的数据集。

    • 在 RDB 文件传输的过程中,主服务器会将在传输期间的写操作记录下来,称为命令传播(command propagation)。这样一来,主服务器就能够在发送完 RDB 文件后,将期间的写操作重新发送给从服务器,以保证从服务器的数据集与主服务器保持一致。

  3. 增量复制: 在完成全量复制后,主从服务器之间会保持一个 TCP 连接,主服务器会将自己的写操作发送给从服务器,从服务器执行这些写操作,从而保持数据一致性。增量复制的数据同步是异步的,但通过记录写操作,主从服务器之间的数据最终会达到一致状态。

需要注意的是,在第一次全量复制的过程中,可能会有一些网络故障、主从服务器负载等情况影响同步。为了提高稳定性和安全性,Redis 提供了一些配置选项和机制,如持久化、复制偏移量、主服务器验证等,来确保主从复制的正常进行。 主从库第一次同步的流程

PSYNC命令

当 Redis 主从复制中的从服务器(Slave)需要与主服务器(Master)进行数据同步时,可以使用 PSYNC(Partial SYNC)命令。PSYNC 命令在 Redis 2.8 版本引入,用于提高数据同步的效率和可靠性。

PSYNC 命令包括两种模式:完全同步(Full Sync)和部分同步(Partial Sync)。

  1. 完全同步(Full Sync): 完全同步在以下情况下发生:

    • 从服务器初次连接主服务器时。
    • 从服务器需要进行初次同步,或者复制偏移量与主服务器的偏移量差距较大时。
    • 主服务器没有保存 RDB 快照文件,所以无法进行部分同步。

    完全同步的过程如下:

    • 从服务器向主服务器发送一条 PSYNC 命令,并附带上自己的复制积压缓冲区的偏移量(offset)和 replid(复制 ID)。
    • 主服务器使用 bgsave命令,生成RDB文件,接着将文件发给从库。
    • 从库接收到RDB文件后,会先清空当前数据库,然后加载RDB文件。
  2. 部分同步(Partial Sync): 部分同步在以下情况下发生:

    • 从服务器已经复制了一部分数据,并且复制偏移量与主服务器的偏移量差距较小时。

    部分同步的过程如下:

    • 主库将后续所有 写操作记录到内存中的replication buffer中
    • 从服务器向主服务器发送一条 PSYNC 命令,并附带上自己的复制积压缓冲区的偏移量和 replid。
    • 主库将所有保存的写操作发送给从库,具体来说,就是当RDB发送完成后,就会把此时replication buffer中的修改发给从库,从库再重新执行这些操作。这样一来,主从库就实现同步了

PSYNC 命令的目标是在保证数据一致性的前提下,尽可能地减少数据同步所需的数据传输量,从而提高复制效率。完全同步和部分同步的选择取决于从服务器与主服务器之间的复制状态和数据差距。

主库的烦恼

这里我们能分析得到主库做全量同步时的两个耗时操作:

  1. 生成RDB文件
  2. 传输RDB文件

这里设想一个场景,如果是一主多从的架构,那么主节点就要生成多份RDB并传输给从节点,很显然,这种操作是非常耗时的。这里主要占用两块资源

  1. 通过fork子进程生成RDB快照会 阻塞主线程处理请求
  2. 传输RDB文件会占用 网络带宽

那么有什么方法可以解决这些问题呢? 这里呀,我们就引入了“主-从-从”架构,很容易理解,就是主库只需要同步一份给某从库A,其他从库从从库A同步数据。

如何理解 主-从-从 架构?

主从(Master-Slave)架构是一种常见的数据库复制和数据备份方案。在这种架构中,存在一个主数据库(主服务器)和一个或多个从数据库(从服务器),主数据库负责处理写操作和读操作,从数据库负责复制主数据库的数据,以提供读取操作和备份。

主从架构的工作方式如下:

  1. 主数据库(主服务器):

    • 主数据库是系统的主要数据库,负责处理所有的写操作(数据的插入、更新、删除)和部分读操作。
    • 当主数据库接收到写操作时,会将这些写操作记录到自己的日志文件(例如 MySQL 的二进制日志)中,并发送给从数据库。
    • 主数据库也会保存一个复制积压缓冲区(replication backlog buffer),其中存储了一部分的写操作数据,用于满足部分同步和断线重连的需求。
  2. 从数据库(从服务器):

    • 从数据库是主数据库的复制副本,负责从主数据库复制数据以供读取操作和备份。
    • 从数据库会连接到主数据库,并发送复制请求(如 PSYNC 命令)以获取主数据库的数据更新。
    • 从数据库会持续地复制主数据库的写操作,将写操作应用到自己的数据副本中,以保持与主数据库的数据一致性。
    • 从数据库可以处理读取请求,从而减轻主数据库的读取压力。

主从架构的优势:

  • 负载均衡: 通过将读操作分发给从数据库,可以分担主数据库的读取压力,提高整体系统的吞吐量。
  • 高可用性: 当主数据库出现故障时,可以将其中一个从数据库提升为新的主数据库,从而实现快速故障切换。
  • 数据备份: 从数据库可以作为主数据库的数据备份,用于恢复数据和灾难恢复。
  • 数据分析: 从数据库可以用于读取操作,以进行数据分析、报表生成等工作,而不影响主数据库的性能。

需要注意的是,主从架构并不是完全实时的,因为从数据库需要时间来同步主数据库的数据更新。因此,在考虑使用主从架构时,需要权衡数据一致性和性能之间的需求。 级联的“主-从-从”模式

如何配置主从从架构呢

  1. 安装和配置主服务器(Master):

    • 安装Redis主服务器并确保主服务器正常运行。
    • 在主服务器的配置文件(redis.conf)中开启持久化(通常使用RDB快照或AOF日志)和监听端口,确保配置项如下:
      port 6379
      save 900 1
      appendonly yes  # 如果使用AOF日志
    • 如果需要对外提供访问,确保防火墙或网络设置允许访问主服务器的6379端口。
  2. 安装和配置第一个从服务器(Slave1):

    • 在从服务器1上安装Redis数据库。
    • 在从服务器1的配置文件中配置主从关系。在配置文件中添加类似如下的内容,其中 masterauth是主服务器的密码, master是主服务器的IP和端口:
      slaveof master_ip master_port
      masterauth your_master_password
    • 重启从服务器1使配置生效。
  3. 安装和配置第二个从服务器(Slave2):

    • 在从服务器2上安装Redis数据库。
    • 在从服务器2的配置文件中配置主从关系,与从服务器1相似。确保配置项不冲突。
    • 重启从服务器2使配置生效。
  4. 重启主服务器:

    • 在主服务器上查看主服务器的信息,如IP和端口。通常使用以下命令:
      INFO server
  5. 测试主从从架构:

    • 在主服务器上进行写操作,如插入、更新或删除数据。
    • 查看从服务器1和从服务器2是否同步了主服务器的数据。

需要注意的是,Redis的主从从架构在部署和配置上与主从架构类似,只是需要在从服务器上再次配置主从关系。另外,Redis还可以配置更多高可用性的功能,如哨兵(Sentinel)和集群(Cluster),以实现更强大的架构。具体配置细节可能会因版本和需求而有所不同,建议参考官方文档或相关资源进行详细了解和配置。

主从库间网络断了怎么办?

在 Redis 2.8 之前,如果主从库在命令传播时出现了网络闪断,那么,从库就会和主库重新进行一次全量复制,开销非常大。

2.8之后呢是支持增量同步的,那么Redis是怎么实现增量同步的呢? 当Redis主从库之间的网络断开后,网络恢复时从库需要进行增量同步,以获取在网络断开期间主库中的更新数据。Redis实现增量同步的方式是通过Redis复制机制,具体流程如下:

  1. 保存主服务器的数据: 主服务器会将更新的数据写入内存,并在内存中保存一份副本。同时,主服务器会将更新的数据写入AOF(Append-Only File)日志文件,以便在断电或宕机情况下能够进行数据恢复。

  2. 记录复制偏移量: 在主服务器的复制过程中,主服务器会记录一个复制偏移量(replication offset),表示从服务器在主服务器中的数据位置。这个偏移量会随着数据的更新而递增。

  3. 网络恢复: 当网络恢复时,从服务器会尝试连接主服务器并请求进行复制。

  4. 发送SYNC命令: 从服务器会发送SYNC命令给主服务器。如果是初次连接复制,从服务器发送的SYNC命令中不包含任何参数。如果是增量同步,从服务器会发送带有偏移量参数的SYNC命令。

  5. 全量复制或部分复制: 根据情况,主服务器会执行全量复制或部分复制:

    • 全量复制(初次连接): 如果是初次连接复制,主服务器会执行全量复制。它会创建一个RDB快照(数据库快照),将数据库中的数据快照发送给从服务器。这样从服务器就能够拥有主服务器的完整数据集。
    • 部分复制(增量同步): 如果是增量同步,主服务器会从记录的偏移量处开始,将从偏移量后的所有更新数据发送给从服务器。这样从服务器就能够获取在断开网络期间主服务器的更新数据。
  6. 复制数据传输: 主服务器会将全量数据或增量数据通过网络传输给从服务器。从服务器会接收并处理这些数据,更新自己的数据集。

  7. 复制过程继续: 一旦复制数据传输完成,从服务器会持续地与主服务器保持连接,接收来自主服务器的增量更新。这样,主从库之间的数据保持同步。

需要注意的是,当网络断开时间较长或断开期间数据更新较大时,增量同步可能会导致从服务器落后于主服务器。在网络恢复后,从服务器需要足够的时间来接收和处理更新数据,以保持与主服务器的数据同步。 alt

一般的排查流程

  1. 检查网络连接问题: 首先,确保网络连接问题的确是造成主从库通信中断的原因。检查网络配置、防火墙规则、路由等设置,确保主从库之间可以互相访问。

  2. 重新连接网络: 如果网络问题是暂时的,你可以尝试恢复网络连接,让主从库之间恢复通信。

  3. 检查主从状态: 在主从库网络连接恢复后,使用INFO replication命令检查主从库的同步状态。确保主库已将数据同步到从库。

  4. 手动重新同步: 如果主从库之间的网络断开时间较长,可以考虑进行手动重新同步:

    • 在从库上,使用 SLAVEOF NO ONE命令解除从库状态。
    • 在从库上,删除持久化文件(RDB文件或AOF文件)。
    • 在从库上,执行 SLAVEOF master_ip master_port命令,将其重新设置为主库的从库。
    • 在主库上,执行 SLAVEOF NO ONE命令解除主库状态。
    • 在主库上,执行 SLAVEOF slave_ip slave_port命令,将其重新设置为从库的主库。
  5. 手动复制数据: 如果网络断开时间较长且重新同步不可行,你可能需要手动复制数据。在主库上导出数据,并在从库上导入数据。

  6. 备份和恢复: 如果网络问题无法解决,你可能需要在网络恢复后考虑从主库重新备份数据,然后在从库上进行数据恢复。

总结

文章中介绍了Redis主从库架构以及如何配置、维护和解决主从库网络断开的问题。以下是文章中涉及到的主要内容:

  1. Redis主从库架构及其保证的高可靠性:

    • Redis主从库的目的是实现高可靠性,通过数据持久化、主从复制、Sentinel哨兵和Cluster集群等方式来保障数据的安全性和可用性。
  2. 如何保证副本数据一致:

    • Redis通过全量复制和部分复制(增量同步)来保证主从库之间的数据一致性。复制偏移量和复制积压缓冲区等机制用于记录和传输数据。
  3. 主从库第一次同步的过程:

    • 主从库之间的第一次同步涉及主服务器创建RDB快照,发送给从服务器,以及记录期间的写操作进行命令传播。
  4. PSYNC命令和增量同步:

    • PSYNC命令用于主从库网络断开后的增量同步。完全同步用于初次连接,部分同步用于增量同步,从而减少数据传输量。
  5. 主从从架构及其优势:

    • 主从从架构是在主从架构基础上的扩展,通过级联的方式减轻主服务器的复制压力,实现更高的可用性和负载均衡。
  6. 配置主从从架构的步骤:

    • 安装和配置主服务器,从服务器1和从服务器2。
    • 重启主服务器,查看主服务器信息。
    • 进行测试,验证主从库之间是否同步。
  7. 解决主从库间网络断开问题:

    • 检查网络连接问题,确保主从库之间可以互相访问。
    • 重新连接网络,恢复通信。
    • 检查主从状态,确保同步。
    • 手动重新同步,尝试恢复数据一致性。
    • 手动复制数据或备份恢复数据。

本文由 mdnice 多平台发布

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

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

相关文章

Lua 位和字节

一、位运算 从 Lua 5.3 版本开始&#xff0c;提供了针对数值类型的一组标准位运算符&#xff0c;与算数运算符不同的是&#xff0c;运算符只能用于整型数。 运算符描述&按位与|按位或&#xff5e;按位异或>>逻辑右移<<逻辑左移&#xff5e;&#xff08;一元运…

Git 如何使用TortoiseGit 操作本地仓库

初始化仓库 方法一: 新建一个文件夹,进入文件夹内部操作 1、右键--> 在这里创建Git 版本库 注意: 不要直接在桌面上操作,否则桌面就是一个仓库 方法二: 1、右键-->Git GUI here 方法三: 命令行模式 1、 git init 创建完毕仓库,我们发现,此时我们创建的文件夹下…

leetcode做题笔记83删除排序链表中的重复元素

给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 思路一&#xff1a;模拟题意 struct ListNode* deleteDuplicates(struct ListNode* head){i…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统运行篇

相关文章 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;环境搭建篇 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;系统启动篇 开发环境 Win10 64位 VS Code&#xff0c;ssh 远程连接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01&a…

React 全栈体系(二)

第二章 React面向组件编程 一、基本理解和使用 1. 使用React开发者工具调试 2. 效果 2.1 函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函数式组件</title> </head> &l…

计算机竞赛 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

软件压力测试对软件产品起到什么作用?

一、软件压力测试是什么? 软件压力测试是一种通过模拟正常使用环境中可能出现的大量用户和大数据量的情况&#xff0c;来评估软件系统在压力下的稳定性和性能表现的测试方法。在软件开发过程中&#xff0c;经常会遇到一些性能瓶颈和稳定性问题&#xff0c;而软件压力测试的作…

C语言刷题指南(一)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &am…

认识excel篇3之数据的有效性(数据验证)

数据有效性不仅能够对单元格的输入数据进行条件限制&#xff0c;还可以在单元格中创建下拉列表菜单方便用户选择输入。如果没有做数据验证&#xff0c;单元格内默认可以输入任意类型的数据。数据验证就是限制单元格输入数据&#xff08;必须输入符合要求的才能输入&#xff09;…

VS2022如何查看类成员都在哪里被调用了(VS如何打开Call Hierarchy视图)

文章目录 打开Call Hierarchy视图查看成员的调用 打开Call Hierarchy视图 单击菜单栏的“视图” > “调用层次结构”&#xff0c;即可打卡Call Hierarchy视图。 查看成员的调用 在代码编辑窗口&#xff0c;右键单击想要查看的类成员&#xff0c;然后选择“查看调用层次结…

机器学习算法之-逻辑回归(2)

为什么需要逻辑回归 拟合效果太好 特征与标签之间的线性关系极强的数据&#xff0c;比如金融领域中的 信用卡欺诈&#xff0c;评分卡制作&#xff0c;电商中的营销预测等等相关的数据&#xff0c;都是逻辑回归的强项。虽然现在有了梯度提升树GDBT&#xff0c;比逻辑回归效果更…

一、数学建模之线性规划篇

1.定义 2.例题 3.使用软件及解题 一、定义 1.线性规划&#xff08;Linear Programming&#xff0c;简称LP&#xff09;是一种数学优化技术&#xff0c;线性规划作为运筹学的一个重要分支&#xff0c;专门研究在给定一组线性约束条件下&#xff0c;如何找到一个最优的决策&…

JavaScript请求数据的4种方法总结(Ajax、fetch、jQuery、axios)

JavaScript请求数据有4种主流方式&#xff0c;分别是Ajax、fetch、jQuery和axios。 一、Ajax、fetch、jQuery和axios的详细解释&#xff1a; 1、 Ajax Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用JavaScript在用户的浏览器上发送请求的技术&…

使用低版本vcpkg时,bootstrap-vcpkg.bat无法生成vcpkg.exe的可能原因

缘由 需要使用vcpkg中低版本的第三方库&#xff0c;下载vcpkg后&#xff0c;回退至指定版本&#xff0c;运行bootstrap-vcpkg.bat生成vcpkg.exe时&#xff0c;命令行窗口总是一闪而过&#xff0c;但是vcpkg.exe却没有生成。 添加pause&#xff0c;查看错误 编辑bootstrap-vc…

docker的网络模式

docker0网络 docker容器的 虚拟网关loopback &#xff1a;回环网卡、TCP/IP网卡是否生效virtual bridge&#xff1a;linux 自身继承了一个虚拟化功能&#xff08;kvm架构&#xff09;&#xff0c;是原生架构的一个虚拟化平台&#xff0c;安装了一个虚拟化平台之后就会系统就会自…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiLSTM双向长短…

【回溯】总结

1、 组合和子集问题 组合问题需要满足一定要求才算作一个答案&#xff0c;比如数量要求&#xff08;k个数&#xff09;&#xff0c;累加和要求&#xff08;target&#xff09;。 子集问题是只要构成一个新的子集就算作一个答案。 进阶&#xff1a;去重逻辑。 一般都是要对同…

Linux 5种网络IO模型

Linux IO模型 网络IO的本质是socket的读取&#xff0c;socket在linux系统被抽象为流&#xff0c;IO可以理解为对流的操作。刚才说了&#xff0c;对于一次IO访问&#xff08;以read举例&#xff09;&#xff0c;数据会先被拷贝到操作系统内核的缓冲区中&#xff0c;然后才会从操…

LL库实现SPI MDA发送方式驱动WS2812

1&#xff0c;首先打卡STM32CubeMX&#xff0c;配置一下工程&#xff0c;这里使用的芯片是STM32F030F4P6。 时钟 SPI外设 SPI DMA 下载接口&#xff0c;这个不配置待会下程序后第二次就不好下载调试了。 工程配置&#xff0c;没啥说的 选择生成所有文件 将驱动都改为LL库 然后直…