Redis 面试:假设 Redis 的 master 节点宕机了,你会怎么进行数据恢复?

让我们制定您的定制课程计划,以学习 Redis。该计划将特别关注 Redis主节点故障时数据恢复的场景。

感谢您阅读这篇文章。更多面试问题:
https://programmerscareer.com/zh-cn/software-interview-set/

主题:Redis架构


Redis 的全称是 Remote Dictionary Server,它是一个开源的内存数据结构存储,可以用作数据库、缓存和消息代理。其中一个主要原因是它在内存中执行所有操作并避免了磁盘操作所需的寻址时间。

Redis 支持各种数据结构,例如字符串、哈希、集合、列表等。让我们深入了解 Redis 架构。

Redis 服务器和客户端

Redis 数据存储系统的基本角色有两个:Redis 客户端和 Redis 服务器。

Redis 客户端 是一个独立的应用程序,与 Redis 服务器连接并执行命令。客户端可以是任何内容,从一个小的脚本来管理应用程序会话,到一个大型系统来使用 Redis 缓存数据以提高访问速度。

Redis 服务器 是主要的功能单元。它是数据存储的位置,数据被缓存到内存中,数据结构被维护,并处理客户端发送的所有命令。

Redis 数据结构

了解 Redis 架构的核心原理是它是一个键值数据存储,这意味着您存储在 Redis 服务器中的每一项数据都包含一个键和一个值。Redis 的独特之处在于它可以存储各种值类型。Redis 支持以下数据结构:

  • 字符串
  • 哈希
  • 列表
  • 集合
  • 有序集合

每种数据结构都有自己的命令集来管理数据。例如,如果您正在处理列表,则可以执行命令,例如 LPUSHLRANGE 等来操作列表。这些数据结构使 Redis 非常灵活,能够有效地解决许多不同类型的问题。

持久性——一瞥

Redis 的一个关键组件是它能够将数据持久化到磁盘。想象一下,如果您的 Redis 服务器关闭时所存储的数据都会被清除——这不是非常有效的吗?为了避免这种情况,Redis 提供了一些持久化到磁盘的策略,以便在故或关闭时可以恢复数据。我们将在后续课程中详细讨论这个方面。

现在,我们已经了解了 Redis 基本架构的要素,我们将逐步深入更复杂的主题,例如数据复制、备份和 Redis Sentinel 高可用性等。

主题:Redis 复制


复制是一种机制,允许您的数据自动复制从主服务器到一个或多个副本服务器。复制提供两大好处:

  • 性能提升:您可以将读操作分发到副本服务器以分担主服务器的负载。这允许主服务器处理更少的请求并提高整体性能。
  • 数据冗余:您的数据将存储在多个服务器上,为了提供冗余选项,如果主服务器出现故障。这种容错性在生产环境中是必不可少的。

了解 Redis 主从复制配置

当在 Redis 中设置复制时,它遵循主从复制配置。主服务器包含数据的原始副本,并将其复制到副本服务器。

在 Redis 中设置复制是简单的。基本上,这涉及创建一个主服务器并然后将一个或多个从服务器连接到主服务器上使用 SLAVEOF 命令,指定主服务器的 IP 和端口。

让我们了解如何在主服务器上的变更传递到从服务器:

  1. 当在主服务器上的数据集上发生变化(例如,写操作)时,主服务器会将命令发送到连接的从服务器。
  2. 每个从服务器将接收命令并执行它们,从而使其数据集与主服务器的数据集同步。

要了解的重要是数据操作是异步的——主服务器不会等待从服务器确认并执行命令。然而,主服务器会记录哪些命令被每个从服务器确认。

这种复制方案提供了一种强大的数据冗余和性能缩放机制。然而,它并不无挑战,例如,如果主节点出现故障怎么办?如何确保高可用性和数据一致性?Redis 是如何处理这些场景的?我们将在后续课程中详细讨论这些问题。

主题:Redis持久化深入分析


Redis主要在内存空间操作数据,提供快速访问和修改数据。然而,数据的持久化变得至关重要,以防止服务器崩溃或关闭时的数据丢失。Redis 包含两种方法来将内存中的数据保存到磁盘上,即 RDB 和 AOF。

RDB (Redis 数据库备份)

RDB 持久化通过定期将数据集的快照保存到磁盘上来实现。这是怎样工作的:

  • Redis 会 fork 一个子进程。
  • 子进程会写入整个数据集到磁盘上(到 RDB 文件),以捕获数据在该时刻的快照。

可以配置 RDB 的保存频率。例如,您可以配置 Redis 在过去 15 分钟内至少发生了一次更改时保存到磁盘上。

RDB 的快照非常适合备份。如果您需要重建数据库,具有时间点快照非常有用。

AOF (追加只写文件)

AOF 持久化则是记录每次接收到的写操作,然后可以在服务器启动时播放回来。这是怎样工作的:

  • 当接收到一个命令修改数据集时,它会被追加到 AOF 缓冲区中。
  • Redis 经常将 AOF 缓冲区数据写入磁盘上。

可以配置 AOF 在磁盘上写入数据的频率。

与 RDB 相比,AOF 文件更耐久,因为它是追加只写的。这意味着即使在写操作期间发生了一次崩溃或电源故障,您也可能会收到命令的完整历史,直到故障之前的短时间内。 而 RDB 则可能会丢失更多数据,这取决于您的保存条件(具体取决于您的配置)。

RDB 和 AOF 之间的选择

没有一个全面的答案。这取决于您的应用程序和数据的重要性。某些人喜欢 RDB 因为快速备份可以轻松地移动。其他人喜欢 AOF 因为它提供了更高的耐久性。

Redis Actually 允许同时使用 RDB 和 AOF!如果启用了两者,Redis 会在迭代数据集时为 AOF 重写生成数据库的快照。

您可以考虑这是一个混合方法,享受了两种方法的优势。

主题:Redis 备份


没有可靠和定期的备份,数据就面临丢失的风险,特别是在硬件或软件故障时。对 Redis 来说,快照功能,或者 Redis 数据库备份(RDB),提供了一种可靠的备份方式。它提供了一致和压缩的点到时间快照。

RDB 持久化模型通过在不同的时间间隔上保存数据集来操作,您可以指定这些间隔,例如,每 15 分钟内至少发生了 5 个键的更改,或者每 1 小时内至少发生了 1 个键的更改等等。

创建备份

Redis 允许您在任何时候手动生成一个 RDB 文件,使用 SAVEBGSAVE 命令。

SAVE 命令同步执行并会阻塞所有其他客户端,因此对生产环境来说,更好的是使用 BGSAVE 命令,它会分叉一个新进程来保存数据,而您的 Redis 服务器继续为客户端请求服务。

请注意,这个过程可能会消耗大量的 I/O 和 CPU,取决于数据的大小。

还原备份

还原 RDB 文件非常简单,只需要停止 Redis 服务器,替换 RDB 文件并重新启动服务即可。

启动时,Redis 会从 RDB 文件中加载数据到内存并继续正常操作。在加载数据到内存之前,写入新数据到 Redis 存储或从存储中读取数据都不能进行。

了解备份是 Redis 的关键部分,因为它形成了任何灾难恢复计划的基础。正确和可靠的备份是保护数据并确保应用程序的顺利运行的关键。


主题:Redis Sentinel


现在,让我们讨论 Redis 的一个重要方面,Redis Sentinel 系统。它帮助完成两项主要功能——监控自动故障转移。让我们来详细了解一下。

监控:Redis Sentinel 不断地检查主节点和副本实例是否正常运行。它不仅确认实例的可用性(运行中),还验证它们是否能够接受连接并响应查询。

自动故障转移:如果主节点失败,Sentinel 系统会自动检测这一点并开始故障转移过程。这个过程包括选择一个副本,提升它为新的主节点,并重新配置其他副本以使用新的主节点。

这些功能为 Redis 环境提供高可用性和耐性。在下一课中,我们将处理主节点故障的场景,常见的故障原因和 Redis 是如何处理这些事件的。

值得注意的是 Quorum,它表示最少需要多少个 Sentinel 节点同意才能进行故障转移。例如,如果您有五个 Sentinel 节点,Quorum 可能是三个。这意味着至少三个 Sentinel 节点需要同意主节点确实不可用,并且应该进行故障转移。

Redis Sentinel 为需要高可用性的应用程序提供了很大的价值。在下一课中,我们将处理主节点故障的场景,常见的故障原因和 Redis 是如何处理这些事件的。

主题:Redis主节点故障——一个概述


Redis主节点故障虽然不常见,但可能会对未经配置的Redis架构造成挑战。了解故障的可能原因并为其制定处理策略是至关重要的。

主节点故障可能的原因包括:

  1. 硬件故障:这可能是硬件损坏或硬盘的磨损。偶尔,内存组件也可能会失败,导致服务器崩溃。
  2. 网络中断:网络连接中断可能会导致主节点(或任何节点)与其他节点失去联系。这可能是暂时的问题或永久性问题,取决于基础设施的特性。
  3. 磁盘满错误:Redis可能会关闭以防止数据不一致性。
  4. 软件错误/服务器过载:软件BUG或服务器过载可能会导致崩溃,导致主节点故障。

当主节点故障时,关键问题是确保无中断的服务。这就是Redis哨兵系统和Redis复制的地方。

如果发现故障,哨兵系统将开始自动故障转移过程。故障转移过程包括提升副本并将其配置为新主节点,其他副本将被自动重配置以使用此新主节点。

了解故障的可能原因并了解后续恢复机制是维持高可用性的关键。

在下一课中,我们将深入探讨Redis主节点数据恢复过程后主节点故障。


主题:Redis主节点数据恢复


当Redis主节点因某些未预见的事件而崩溃时,恢复数据从备份中变得至关重要,以确保平稳的运行。

作为我们前面所学的,哨兵系统在主节点故障时会开始自动故障转移过程。其中一个副本将被提升为新主节点,其他副本将被自动重配置以使用此新主节点。

但是,我们也需要考虑如何恢复原始主节点并将其添加回系统,一恢复并同步后,可以重新配置。

现在,在故障期间写入的数据是否会丢失取决于持久性配置:

  1. AOF (追加只写文件) 持久性配置:在AOF中,所有写操作都会记录,如果主节点故障,AOF文件将继续记录这些操作,直到主节点恢复并与此副本同步。
  2. RDB (Redis数据库备份) 持久性配置:在RDB中,在配置的间隔内进行快照。因此,在两个快照之间写入的数据可能会丢失,如果故障发生。

简而言,处理Redis主节点故障的机制主要取决于配置、哨兵系统和持久性设置。您可以根据使用场景和数据安全要求选择最适合的策略。

主题:复习和评估


我们已经详细探讨了 Redis 各方面的多个方面。让我们回顾我们所学的核心概念:

  1. Redis 架构:我们开始了解 Redis 的底层架构。
  2. Redis 复制:研究了 Redis 数据复制的概念并了解了它是如何实现的。
  3. Redis 持久性:深入了解 Redis 数据持久化的过程并了解它是为什么重要的。
  4. Redis 备份:学习了如何在 Redis 中建立备份并了解了它们在数据恢复中的角色。
  5. Redis Sentinel:了解了 Redis Sentinel 的原理并了解它在维持高可用性方面的作用。
  6. 主节点故障:讨论了 Redis 主节点故障的可能原因。
  7. 主节点数据恢复:了解了 Redis 主节点故障时的详细过程。

现在,重要的是回顾并重新评估我们的理解。这就是交互性评估的地方。它们为我们提供了一种机会来检查我们的理解、应用所学知识并纠正任何遗漏。

例子问题:假设您正在为应用设置数据存储系统。您决定使用 Redis 并需要配置它。您有两台服务器可用。如何确保数据安全和高可用性?


现在,让我们测试你的知识。

问题 1:

根据你所学的 Redis 内部结构,描述 Redis 架构的基本组成部分。

问题 2:

解释 Redis Sentinel 的角色并说明它是如何帮助维持 Redis 基础设施的高可用性的。

问题 3:

Redis 在主节点故障时会采取哪些步骤?

对于每个问题,请分享你的答案。

示例问题是:假设您正在为应用程序设置数据存储系统,并决定使用 Redis。需要配置它。您有两台服务器可用。如何确保数据安全和高可用性?

为了确保数据安全和高可用性,您可以按以下步骤设置 Redis环境:

  1. 使用两台服务器:在两台服务器上安装 Redis。其中一台将作为主服务器,另一台将作为从服务器(slave)。
  2. 数据持久性:在两台服务器上配置数据持久性机制。这将确保数据更改不会丢失,提供数据安全性。例如,您可能会选择 RDB 以获取较低的数据库备份程度,但更少的资源使用,或者 AOF 以获取更高的数据库备份程度,但更多的资源使用。
  3. 主从复制:将第二台服务器设置为主服务器的副本。这意味着主服务器上写入的数据也会写入副本。这在主服务器(设计为主服务器)出现故障时尤其重要。
  4. Redis 哨兵:为了维持高可用性,请使用 Redis 哨兵。哨兵将监视两台服务器,并在主服务器出现故障时提升副本为新主服务器。
  5. 配置您的应用程序:配置您的应用程序以将写入操作发送到主服务器,并将读取操作均衡分配到两台服务器上。

这些步ZZ将为高可用性(通过主从复制和 Redis 哨兵)和数据安全性(通过数据持久性机制)提供平衡。

问题 1:Redis 架构的基本构件包括:

  • Redis 客户端:这些是发送命令给 Redis 以执行数据存储操作的应用程序或用户。
  • Redis 服务器:这是 Redis 安装和运行的地方。它负责在内存中存储数据并执行操作。
  • 数据结构:Redis 支持多种数据结构,包括字符串、列表、集合、有序集合等。每种结构都有特定的命令相关联。
  • 数据库持久性:Redis 提供两种数据库持久性机制——RDB 和 AOF。RDB 在特定时间间隔内拍摄数据集。AOF 记录每次写入服务器接收到的操作。
  • 复制:这是设置主从节点以确保数据冗余的过程。如果主节点失败,其中一个从节点将被提升为新主节点,并且其他从节点将被重新配置以使用新主节点。

问题 2:Redis 哨兵(如果配置)可识别主节点的故障。它将开始故障转移过程。Redis 哨兵系统将选举一个副本并将其提升为新主节点,并且其他副本将被重新配置以使用新主节点。应用程序也会被通知关于新主节点以重定向其查询。


问题 3:当 Redis 主节点失败时,发生以下步骤:

  1. Redis 哨兵(如果配置)检测主节点的故障。
  2. 一台哨兵开始故障转移,其他哨兵确认此操作。
  3. Redis 哨兵将选举一个副本并将其提升为新主节点。
  4. 其他副本将被重新配置以使用新主节点。
  5. 在解决问题后,失败的主节点将加入回来作为副本到当前主节点。它需要对新主节点进行完全同步。

English post: https://programmerscareer.com/redis-interview3/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

Redis 面试:如何用Redis实现分布式锁 Redis 面试:简述 Redis 中如何防止缓存雪崩和缓存击穿

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×