Redis 从入门到精通【进阶篇】之redis主从复制详解

文章目录

  • 0. 前言
    • (1)概述
    • (2) 主从复制设计的目的:
  • 1. 原理解析
    • 1.1 全量复制
    • 1.2 增量复制
  • 2. 主从节点配置
  • 3. 常见问题
    • 3.1. 当主服务器不进行持久化时复制的安全性
    • 3.2. 为什么主从全量复制使用RDB而不使用AOF?
    • 3.3. 为什么还有无磁盘复制模式?
    • 3.4. 为什么还会有从库的从库的设计?
    • 3.5. 读写分离及其中的问题
  • 3. Redis从入门到精通系列文章
  • 4. 面试简答
    • 4.1. 什么是Redis主从复制?
    • 4.2. Redis主从复制有什么作用?
    • 4.3. Redis主从复制的原理是什么?
    • 4.4. 如何配置Redis主从复制?
    • 4.5. Redis主从复制的流程是怎样的?
    • 4.6. 主从复制过程中可能会出现什么问题?
    • 4.7.主从复制有哪些优点?
    • 4.8. 主从复制有哪些缺点?
    • 4.8.主从复制的配置文件有哪些关键参数?
    • 4.9. 主从复制中的主节点和从节点有什么区别?
    • 4.10. Redis主从复制是否支持多级复制?
    • 4.11. Redis主从复制中如何处理网络故障和节点故障?
    • 4.12. 如何监控Redis主从复制的状态?
    • 4.13. Redis主从复制中如何实现数据同步?
    • 4.14. 主从复制中的数据一致性如何保证?
    • 4.15. 主从复制中的数据延迟问题如何解决?
    • 4.16. 主从复制中的并发写入如何处理?
    • 4.17. 主从复制是否支持数据双向同步?
    • 4.18. 主从复制是否支持故障切换?
    • 4.19. 主从复制中的节点角色可以切换吗?
    • 4.20. Redis主从复制和Sentinel有什么区别?

在这里插入图片描述

0. 前言

Redi 它支持主从复制来提高系统的可用性。本章节我们来聊一下关于Redis主从复制配置和原理。
Redis主从复制也是面试的一个热点我大概总结了如下面试常见面试题
以下是20道关于Redis主从复制的常见面试题

  1. 什么是Redis主从复制?
  2. Redis主从复制的作用是什么?
  3. Redis主从复制的原理是什么?
  4. Redis主从复制的流程是怎样的?
  5. Redis主从复制有哪些优点?
  6. Redis主从复制有哪些缺点?
  7. 如何配置Redis主从复制?
  8. Redis主从复制的配置文件有哪些关键参数?
  9. Redis主从复制中的主节点和从节点有什么区别?
  10. Redis主从复制是否支持多级复制?
  11. Redis主从复制中如何处理网络故障和节点故障?
  12. 如何监控Redis主从复制的状态?
  13. Redis主从复制中如何实现数据同步?
  14. Redis主从复制中的数据一致性如何保证?
  15. Redis主从复制中的数据延迟问题如何解决?
  16. Redis主从复制中的并发写入如何处理?
  17. Redis主从复制是否支持数据双向同步?
  18. Redis主从复制是否支持故障切换?
  19. Redis主从复制中的节点角色可以切换吗?
  20. Redis主从复制和Redis Sentinel有什么区别?

希望我们这个章节学完,我们能简答这些题。

(1)概述

Redis主从复制是一种数据复制机制,它允许将一个Redis服务器(称为主节点)的数据复制到一个或多个其他Redis服务器(称为从节点)上。主从复制在Redis中具有重要的作用,可以提高系统的可用性、扩展性和数据冗余性。

主从复制的实现基于异步复制的方式。当一个Redis主节点接收到写命令时,它会将这些命令记录在内存中,并将这些命令发送给所有的从节点。从节点在接收到这些命令后,会执行相同的操作来保持与主节点的数据一致性。从节点还可以处理读请求,这样可以减轻主节点的负载。
主从复制的配置包括以下几个步骤:

  1. 配置主节点:在主节点的配置文件中,需要设置replicaof指令来告诉主节点它的从节点是谁。例如,replicaof 。此外,还需要设置masterauth指令来设置主节点的密码(如果有的话)。

  2. 配置从节点:在从节点的配置文件中,需要设置slaveof指令来告诉从节点它的主节点是谁。例如,slaveof 。还可以设置slave-read-only指令来控制从节点是否可以处理读请求。

  3. 启动Redis服务:分别启动主节点和从节点的Redis服务。

  4. 检查复制状态:使用info replication命令可以查看主从节点的复制状态。如果复制状态正常,从节点的角色会显示为slave,并且会显示主节点的IP地址和端口号。

(2) 主从复制设计的目的:

  1. 提高可用性:当主节点出现故障时,可以快速切换到从节点,保证系统的可用性。从节点可以承担主节点的读写请求,确保服务的连续性。
  2. 扩展性:可以通过添加多个从节点来提高系统的读取能力。从节点可以处理读请求,分担主节点的压力。
  3. 数据冗余:从节点存储了主节点的数据副本,可以在主节点发生故障时快速恢复数据。

需要注意的是,主从复制是异步的,这意味着从节点的数据可能会有一定的延迟。此外,主从复制只能实现单向的数据复制,即主节点到从节点的复制,不能实现从节点到主节点的复制。如果需要实现双向复制,可以使用Redis的哨兵模式或集群模式。

1. 原理解析

Redis主从复制的原理主要包括全量复制和增量复制。

  1. 配置主节点:首先,需要在Redis中配置一个主节点。主节点是负责处理客户端的读写请求,并将数据复制到从节点。

  2. 配置从节点:在主节点配置完成后,可以配置一个或多个从节点。从节点会连接到主节点,并主动请求复制数据。

  3. 数据同步:主节点会将写操作记录在内存中的数据变更发送给从节点,从节点接收到变更后,会将其应用到自己的数据库中,保持与主节点的数据一致性。

  4. 异步复制:主节点和从节点之间的数据复制是异步的,即主节点无需等待从节点的确认,可以继续处理其他请求。这样可以提高系统的性能和响应速度。

  5. 增量复制:主从复制使用的是增量复制,即主节点只发送发生变化的数据给从节点,而不是完整的数据集。这样可以减少网络传输的数据量,提高复制的效率。

  6. 故障恢复:如果主节点发生故障,从节点可以自动切换成主节点,继续提供服务。当主节点恢复后,可以重新配置为从节点,实现主从切换和故障恢复。

我们着重讲解 全量复制增量复制

1.1 全量复制

全量复制是指从服务器在初次连接主服务器时,主服务器将自己当前的数据库全部数据传输给从服务器的过程。全量复制操作一般在从服务器重启或者初次连接主服务器时进行。

全量复制的过程:

  1. 从服务器连接主服务器并发送SYNC命令。
  2. 主服务器接收到SYNC命令后,在后台创建一个RDB文件,并将当前数据库的所有数据写入该文件。
  3. 主服务器将RDB文件发送给从服务器,从服务器接收并保存该文件。
  4. 从服务器载入该RDB文件,将所有的数据写入本地数据库中。
    *图片来自极客时间

1.2 增量复制

增量复制是指从服务器在完成全量复制后,主服务器对数据库进行更新时,将更新操作发送给从服务器的过程。增量复制操作在全量复制完成后,主从服务器之间一直保持连接并进行数据同步。

增量复制的过程如下:

  1. 主服务器接收到客户端的写命令,将写命令发送给所有连接的从服务器。
  2. 从服务器接收到写命令并执行,将执行结果返回给主服务器。
  3. 主服务器将执行结果发送给所有连接的从服务器,并让它们执行相同的操作。
    Redis 从入门到精通【进阶篇】之redis主从复制详解_第1张图片*图片来自极客时间

2. 主从节点配置

1. 下载并安装Redis。以centos7为示例

  1. 更新系统: bash sudo yum update
  2. 安装必要的依赖: sudo yum install epel-release yum-utils sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm sudo yum-config-manager --enable remi
  3. 安装Redis: sudo yum install redis
  4. 启动Redis服务: sudo systemctl start redis
  5. 设置Redis开机自启动: sudo systemctl enable redis
  6. 检查Redis是否成功安装: redis-cli ping
    如果返回 “PONG”,则表示Redis已成功安装。

自定义Redis的配置,可以编辑 /etc/redis.conf 文件进行相应的修改。

2. 在主节点上,打开Redis的配置文件redis.conf,并进行以下更改:

   port 6379                 # 设置主节点的端口号,默认为6379
   bind 127.0.0.1           # 设置主节点的IP地址
   daemonize yes           # 设置为守护进程模式
   pidfile /var/run/redis/redis-server.pid   # 设置主节点的pid文件路径
   appendonly yes         # 开启AOF持久化
   
   # 设置主节点的密码认证(可选)
   requirepass your_password
   
   # 启用主节点的复制功能
   replicaof no one

3. 在从节点上,打开Redis的配置文件redis.conf,并进行以下更改:

port 6380                 # 设置从节点的端口号,默认为6380
bind 127.0.0.1           # 设置从节点的IP地址
daemonize yes           # 设置为守护进程模式
pidfile /var/run/redis/redis-server.pid   # 设置从节点的pid文件路径
appendonly yes         # 开启AOF持久化

# 设置从节点的密码认证(可选)
requirepass your_password

# 启用从节点的复制功能,将主节点的IP地址和端口号填入以下配置
replicaof 127.0.0.1 6379

4. 保存并关闭配置文件。

5. 启动Redis主节点和从节点。在终端中分别输入以下命令:

redis-server /path/to/redis.conf   # 启动主节点
redis-server /path/to/redis.conf   # 启动从节点

6. 确保主节点和从节点已经成功启动,并且没有报错信息。

7. 在主节点上,你可以使用命令redis-cli连接到Redis服务器,并进行一些操作,如设置键值对等。

8. 在从节点上,使用命令redis-cli连接到Redis服务器,并使用命令INFO replication检查从节点的状态。如果复制成功,你应该能够看到主节点的相关信息。

3. 常见问题

3.1. 当主服务器不进行持久化时复制的安全性

当主服务器不进行持久化时,主从复制的安全性可能会受到影响。如果主服务器在发生故障时没有进行持久化操作,那么从服务器就无法从主服务器中获取最新的数据。因此,建议在主服务器上开启持久化功能,以确保数据的安全性。

3.2. 为什么主从全量复制使用RDB而不使用AOF?

主从全量复制使用RDB而不使用AOF主要是因为RDB文件的体积比AOF文件小得多,传输速度更快,且在从服务器恢复数据时,从RDB文件中加载数据比从AOF文件中加载数据更快。

3.3. 为什么还有无磁盘复制模式?

无磁盘复制模式是指从服务器不写入任何磁盘数据,而是将所有的数据都存储在内存中。这种模式可以提高从服务器的性能,并减少磁盘I/O的负载。但是,这种模式下,从服务器在重启后需要重新进行全量复制。

3.4. 为什么还会有从库的从库的设计?

从库的从库设计可以进一步提高系统的可用性和性能。当主服务器发生故障时,从服务器可以立即接管主服务器的工作。而从库的从库设计可以将这个过程进一步优化,使得从服务器可以更快地接管主服务器的工作。但是,从库的从库设计会增加系统的复杂度,并且可能会导致数据同步延迟的问题。

3.5. 读写分离及其中的问题

读写分离是指将读操作和写操作分别分配到不同的服务器上执行的过程。这种方式可以提高系统的性能,并减少单个服务器的压力。在Redis中,可以通过将主服务器用于写操作,将从服务器用于读操作来实现读写分离。然而,读写分离也会带来一些问题。首先,由于主从复制的延迟,从服务器可能无法及时地获取最新的数据。其次,读写分离可能会造成数据不一致的问题,因为写操作和读操作之间可能存在时间差。为了解决这些问题,可以使用一些技术手段,如使用一致性哈希算法、使用Redis Sentinel或使用Redis Cluster等。这些方法可以帮助系统更好地实现读写分离,并保证数据的一致性和可用性。

3. Redis从入门到精通系列文章

《Redis 从入门到精通【进阶篇】之Redis事务详解》
《Redis从入门到精通【进阶篇】之对象机制详解》
《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
《Redis从入门到精通【进阶篇】之持久化 AOF详解》
《Redis从入门到精通【进阶篇】之持久化RDB详解》
《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》

4. 面试简答

当面试涉及Redis主从复制时,以下是一些常见的问题:

4.1. 什么是Redis主从复制?

  • Redis主从复制是一种数据复制机制,通过配置一个或多个从节点,使其复制主节点的数据。主节点负责接收写操作并将数据复制到从节点,从节点则负责接收读操作并返回数据。

4.2. Redis主从复制有什么作用?

-主从复制可以提高系统的可用性、扩展性和数据冗余性。当主节点出现故障时,从节点可以接替主节点继续提供服务;同时,通过增加从节点来分担主节点的读写负载,提高系统的性能;此外,主从复制还可以用于数据备份和灾备。

4.3. Redis主从复制的原理是什么?

  • 主从复制的原理是通过Redis的内部机制(例如:全量复制和增量复制)来实现数据的同步。主节点将写操作记录到内存中的命令缓冲区,并将这些命令发送给从节点进行执行,从而实现数据的同步。

4.4. 如何配置Redis主从复制?

  • 配置Redis主从复制需要在主节点和从节点的Redis配置文件中进行相应的设置。主节点需要设置 replicaof 命令来指定从节点的地址和端口,从节点需要设置 replicaof 命令来指定主节点的地址和端口。

4.5. Redis主从复制的流程是怎样的?

主从复制的流程如下:

  • 从节点连接到主节点并发送SYNC命令,请求全量数据同步。
  • 主节点接收到SYNC命令后,开始执行BGSAVE命令生成RDB快照文件,并将期间的写命令记录在复制缓冲区中。
  • 当BGSAVE完成后,主节点将RDB快照文件发送给从节点,并将缓冲区中的写命令发送给从节点。
  • 从节点接收到RDB文件和写命令后,先加载RDB文件恢复数据,然后再执行写命令,使得从节点的数据与主节点保持一致。
  • 之后,主节点会持续地将写命令发送给从节点,保持数据的同步。

4.6. 主从复制过程中可能会出现什么问题?

  • 在主从复制过程中,可能会出现网络故障、主节点宕机、从节点宕机等问题。这些问题可能导致数据同步中断或数据丢失。为了解决这些问题,可以配置Redis的故障转移机制,如哨兵模式或集群模式。

4.7.主从复制有哪些优点?

  • 提高系统的可用性:当主节点出现故障时,可以快速切换到从节点,保证系统的持续可用性。
  • 扩展性和负载均衡:通过增加从节点来分担主节点的读写负载,提高系统的性能。
  • 数据冗余和备份:从节点可以作为主节点的副本,用于数据的备份和灾备。

4.8. 主从复制有哪些缺点?

  • 数据延迟:主从复制是异步的,从节点的数据可能会有一定的延迟。
  • 单点故障:如果主节点出现故障,并且没有设置故障切换机制,整个系统可能会不可用。
  • 写操作限制:从节点默认是只读的,不能进行写操作,需要在需要写操作时将其设置为可写。

4.8.主从复制的配置文件有哪些关键参数?

主从复制的配置文件中常见的关键参数包括:

  • slaveof:设置主节点的IP地址和端口号。
  • masterauth:设置主节点的密码。
  • slave-read-only:设置从节点是否只读。
  • repl-diskless-sync:设置从节点是否使用无盘同步。
  • repl-diskless-sync-delay:设置从节点使用无盘同步时的延迟时间。

4.9. 主从复制中的主节点和从节点有什么区别?

主节点是数据的源头,负责接收客户端的写操作,并将写命令发送给从节点。从节点是主节点的副本,负责接收主节点发送的写命令,并执行这些命令来保持数据的同步。

4.10. Redis主从复制是否支持多级复制?

是的,Redis主从复制支持多级复制。一个从节点可以作为另一个从节点的主节点,从而形成多级复制的结构。

4.11. Redis主从复制中如何处理网络故障和节点故障?

  • 网络故障:当主节点与从节点之间的网络连接断开时,从节点会尝试重新连接主节点,并等待恢复。
  • 节点故障:当主节点出现故障时,可以手动或自动将一个从节点切换为主节点,继续提供服务。

4.12. 如何监控Redis主从复制的状态?

可以使用Redis内置的命令INFO或者使用第三方工具来监控Redis主从复制的状态。INFO命令可以查看主节点和从节点的相关信息,包括复制状态、延迟时间等。

4.13. Redis主从复制中如何实现数据同步?

主从复制中的数据同步是通过主节点将写命令发送给从节点来实现的。从节点按照接收到的写命令顺序执行,从而保持与主节点的数据一致。

4.14. 主从复制中的数据一致性如何保证?

Redis主从复制中的数据一致性是通过主节点将写命令发送给从节点来保证的。主节点会将写命令记录在复制缓冲区中,并异步地发送给从节点,从节点按照接收到的命令顺序来执行,从而保持数据的一致性。

4.15. 主从复制中的数据延迟问题如何解决?

Redis主从复制中的数据延迟是由于异步复制的特性造成的。可以通过以下方法来解决数据延迟问题:

  • 使用命令WAIT:可以在写命令后面加上WAIT命令,等待指定数量的从节点确认接收到命令后再返回结果。
  • 使用AOF持久化:将主节点的写命令记录到AOF日志中,从节点可以通过读取AOF日志来进行数据同步,从而减少数据延迟。

4.16. 主从复制中的并发写入如何处理?

在Redis主从复制中,只有主节点可以处理写操作,从节点默认是只读的。如果需要在从节点上进行写操作,可以将从节点设置为可写。但是需要注意的是,多个从节点同时对同一个键进行写操作可能会导致数据冲突和不一致。

4.17. 主从复制是否支持数据双向同步?

Redis主从复制默认是单向的,只有主节点向从节点复制数据。如果需要实现数据的双向同步,可以通过设置多个主节点和从节点来实现。

4.18. 主从复制是否支持故障切换?

是的,Redis主从复制支持故障切换。当主节点出现故障时,可以手动或自动将一个从节点切换为主节点,继续提供服务。

4.19. 主从复制中的节点角色可以切换吗?

是的,Redis主从复制中的节点角色是可以切换的。可以手动或自动将一个从节点切换为主节点,或将一个主节点切换为从节点。

4.20. Redis主从复制和Sentinel有什么区别?

Redis主从复制是一种数据复制机制,用于实现数据的异步复制和故障切换。Redis Sentinel是一个用于监控和管理Redis集群的工具,用于实现自动故障发现和故障切换。它可以监控Redis主从复制的状态,并在主节点发生故障时自动进行故障切换。
这些问题涵盖了Redis主从复制的基本概念、原理和配置。在面试中,你可能还会遇到更深入的问题,因此建议你对Redis主从复制的细节进行更深入的了解。

在这里插入图片描述
大家好,我是冰点,今天的redis主从复制详解全部内容就是这些。如果你有疑问或见解可以在评论区留言。

你可能感兴趣的:(redis,面试,后端,java)