当前位置: 首页 > news >正文

【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理

文章目录

  • 前言
  • 一、对 Redis 主从结构的认识
    • 1.1 什么是主从结构
    • 1.2 主从结构解决的问题
  • 二、主从结构创建
    • 2.1 配置并建立从节点
      • 2.2.1 从节点配置文件
      • 2.2.2 启动并连接 Redis 主从节点
      • 2.2.3 SLAVEOF 命令
      • 2.2.4 断开主从关系
    • 2.2 查看主从节点的信息
      • 2.2.1 INFO REPLICATION 命令
      • 2.2.2 对于各个信息字段的说明
  • 三、主从复制的拓扑结构
    • 3.1 一主一从结构
    • 3.2 一主多从结构
    • 3.3 树形主从结构
  • 四、主从复制原理剖析
    • 4.1 主从节点建立复制流程
    • 4.2 PSYNC 命令
    • 4.3 runid 和 replid
      • 4.3.1 runid 和 replid 的区别
      • 4.3.2 查看 runid 和 replid
    • 4.4 数据同步
      • 4.4.1 复制偏移量
      • 4.4.2 复制积压缓冲区
      • 4.4.3 主节点运行 ID
  • 五、主从结构的全量复制、部分复制与实时复制
    • 5.1 全量复制
    • 5.2 部分复制
    • 5.3 实时复制
  • 六、其他问题
      • 6.1 关于 Redis 从节点晋升为主节点的时机问题
      • 6.2 关于 Redis 配置了主从结构后无法启动的问题


前言

在分布式系统中,为了解决单点问题,通常需要将数据复制成多个副本,并将它们分别部署在不同的服务器上,以实现故障恢复和负载均衡等需求。

单点问题:
分布式系统中的单点问题(Single Point of Failure,简称SPOF)指的是系统中存在的一些关键组件或节点,如果出现故障,将导致整个系统或部分系统无法正常运行。这个关键组件或节点是系统中的薄弱环节,因为其故障或不可用性会对系统的可用性、稳定性和可靠性产生重大影响。

对于 Redis 来说,它也提供了这样的复制功能,可以实现多个 Redis 实例之间的数据复制。这个复制功能是 Redis 高可用性的基础,而 Redis 的其他机制,如哨兵和集群,都是在这个复制功能的基础上构建的。

本文的主要内容的深入探讨 Redis 复制功能的创建、配置以及底层原理。希望通过阅读本文,可以帮助我们对 Redis 的主从结构产生更加深刻的理解。

一、对 Redis 主从结构的认识

1.1 什么是主从结构

在 Redis 中,主从结构是一种数据复制机制,它包括一个 Redis 主节点(Master)和一个或多个 Redis 从节点(Slave)。其中主节点主要负责处理写数据操作(数据的写入和更新),而从节点则负责复制主节点的数据并处理读请求。通过这样的主从结构,提高了 Redis 服务器的性能和高可用。

1.2 主从结构解决的问题

主从结构解决了多个问题,包括但不限于:

  • 高可用性: 主节点故障时,从节点可以接管服务,保证系统的可用性。
  • 负载均衡: 读操作可以分担到多个从节点上,分散主节点的读压力。
  • 数据备份: 数据可以在多个节点上备份,提高数据的安全性。
  • 数据分发: 可以将数据分发到不同地理位置的从节点,降低访问延迟。

二、主从结构创建

2.1 配置并建立从节点

2.2.1 从节点配置文件

由于现在我只有一个云服务器,因此就需要为不同的节点分配不同的端口号来启动多个 Redis 服务器。在此处约定,本来的 6379 端口号对应的 Redis 服务器作为主节点,另外分配两个端口号 6380 和 6381 作为从节点。

此时,就需要分别为这两个从节点分别创建一个 Redis 配置文件。

例如,为从节点 6380 创建配置文件:

1)首先直接拷贝一份原本 Redis 的配置文件

[root@VM-16-9-ubuntu redis-conf]# cp /etc/redis/redis.conf ./slave1.conf

2)需要对 slave1.conf 修改的地方如下

  1. 端口号
  2. RDB 和 AOF 文件的存放路径

    将其修改为:/root/redis-conf/slave1。其目的在于不要让从节点的持久化文件与主节点的配置文件相同,造成主节点无法启动的问题;同时也增加了对数据的备份次数,提高了数据的安全性。

3)添加 slaveof 命令

在配置文件的结尾添加命令:salveof 127.0.0.1 6379。其作用是让当前从节点以端口号为 6379 的节点为自己的主节点。

此时关于从节点 slave1 的配置就完成了,然后可以使用同样的方式对从节点 slave2 进行配置。

2.2.2 启动并连接 Redis 主从节点

启动主从节点:

所有的从节点都配置完成后,就可以启动主从节点了。主节点已经启动了,直接启动从节点:

注意,在启动从节点的时候,需要在 redis-server 命令后面指定该从节点的配置文件。最后通过 ps 命令即可查看当前服务器中所有的 redis-server 服务了。

连接主从节点:

主节点:
主节点的连接方式直接使用 redis-cli 命令连接即可。

从节点:

注意在连接从节点的时候,需要使用 redis -p xxxx命令,其中 -p 代表需要连接指定的端口号的 Redis 节点。

当所有的主从节点都连接完成之后,我们可尝试进行一下读写操作:

主节点写入数据:

使用两个从节点分别读取数据:


此时发现,向主节点写入的数据,也同步到了两个从节点中。

但是,如果尝试向从节点写入数据,能否写入成功呢?

此时发现报错了,错误信息提示当前节点只能够读取,不能够进行写入。

2.2.3 SLAVEOF 命令

SLAVEOF 命令是 Redis 中用于配置主从复制关系的命令。它用于当前服务设置为指定服务器的从节点,从而实现主从结构。SlAVEOF 命令的使用语法如下:

SLAVEOF masterip masterport
  • masterip 是主节点的 IP 地址
  • masterport 是主节点的端口号

执行了上面的命令之后,当前的 Redis 则会成为指定主节点的从节点,然后开始从主节点上复制数据。

这个命令不但可以在 Redis 的客户端上发送执行,也可以像上文那样将其设置到 Redis 的配置文件中,再启动 Redis 服务器的时候就会自动执行该命令成为指定节点的从服务器。

例如:在刚才启动的主从服务器中,我们可以使用 SALVEOF 命令让 salve2 变成 slave1 的从节点:

然后可以使用命令 INFO replication 查看主从关系相关信息,可以发现此时 slave2 就成为了 slave1 的从节点了。

2.2.4 断开主从关系

如果想要断开主从关系,也需要使用到 SLAVEOF 命令,其语法如下:

SLAVEOF NO ONE

其含义表示,当前节点不再作为其他节点的从节点了,自己要成为一个独立的节点。

例如,让 slave2 断开与 slave1 的主从关系:

此时,slave2 就成为了一个独立的节点。

2.2 查看主从节点的信息

2.2.1 INFO REPLICATION 命令

想要查看主从关系的相关信息可以使用命令 INFO REPLICATION 来查看。

例如:

2.2.2 对于各个信息字段的说明

  1. role: 表示当前 Redis 服务器的角色。在这个示例中,它是主服务器(master)。Redis 可以扮演主服务器或从服务器的角色,主服务器负责处理写操作,而从服务器复制主服务器的数据并处理读操作。

  2. connected_slaves: 表示当前主服务器连接的从服务器数量。在这个示例中,主服务器连接了两个从服务器。

  3. slave0slave1: 这两行提供了与每个从服务器相关的详细信息。在这个示例中,有两个从服务器,分别是 slave0slave1

    • ipport: 表示从服务器的 IP 地址和端口号。
    • state: 表示从服务器的状态。在这个示例中,两个从服务器都处于 “online” 状态,表示它们正常工作。
    • offset: 表示从服务器已复制的主服务器的偏移量。偏移量用于追踪从服务器复制的进度。
    • lag: 表示从服务器相对于主服务器的滞后时间,单位是字节。在这个示例中,lag 为 0 和 1,分别表示两个从服务器相对于主服务器的数据同步滞后情况。
  4. master_replid: 表示当前主服务器的复制ID(Replication ID)。这个ID用于唯一标识主服务器,从服务器使用它来识别主服务器的复制数据。在这个示例中,master_replid 是一个长字符串。

  5. master_replid2: 这个字段在主服务器上通常为全零,只在一些特殊情况下才会用到,用于实现故障切换。

  6. master_repl_offset: 表示当前主服务器的复制偏移量。这个偏移量表示主服务器上的数据复制到了哪个位置,从服务器使用它来追赶主服务器的数据。

  7. second_repl_offset: 这个字段通常为 -1,它表示一个备用的复制偏移量,一般不使用。

  8. repl_backlog_active: 表示复制日志(replication backlog)是否处于激活状态。如果为1,表示复制日志正在使用;如果为0,表示未使用。

  9. repl_backlog_size: 表示复制日志的大小,以字节为单位。在这个示例中,大小为 1048576 字节(1MB)。

  10. repl_backlog_first_byte_offset: 表示复制日志中的第一个字节的偏移量。

  11. repl_backlog_histlen: 表示复制日志的历史长度,也就是复制日志中包含了多少字节的数据。

这些信息一起提供了关于 Redis 复制状态的详细信息,包括主从服务器的关系、复制进度以及滞后情况等。这对于监控和管理 Redis 复制非常有用,可以帮助我们确保数据的一致性和高可用性。

三、主从复制的拓扑结构

在 Redis 主从复制中,可以根据需求选择不同的拓扑结构来构建主从关系,以满足不同的应用场景和需求。以下是三种常见的主从复制拓扑结构:

3.1 一主一从结构

一主一从结构是最简单的主从复制拓扑,它包括一个主服务器(Master)和一个从服务器(Slave)。主服务器负责处理所有写操作(数据的写入和更新),而从服务器复制主服务器的数据,并处理读操作。这种结构适用于小规模的应用场景,其中对高可用性和负载均衡的需求不是特别高。

主要特点:

  • 单一主服务器负责写入和更新数据,从服务器负责读取数据,可以提高读操作的性能。
  • 从服务器可以用于备份主服务器的数据,提高数据的安全性。
  • 适用于简单的应用场景,不需要复杂的主从关系。

3.2 一主多从结构

一主多从结构包括一个主服务器和多个从服务器。主服务器负责处理写操作,而多个从服务器复制主服务器的数据并处理读操作。这种结构适用于需要高读性能和负载均衡的应用场景,因为多个从服务器可以并行处理读请求,分担主服务器的读负载。

主要特点:

  • 主服务器负责写操作,多个从服务器负责读操作,可以提高读性能和负载均衡。
  • 适用于读多写少的应用场景,可以有效减轻主服务器的负担。
  • 多个从服务器之间可以互相复制数据,提高数据的可用性和冗余性。

3.3 树形主从结构

树形主从结构是一种更复杂的拓扑结构,其中多个从服务器不仅复制主服务器的数据,还可以成为其他从服务器的主服务器,形成一个层级结构。这种结构适用于复杂的数据分发和备份需求,可以构建多层级的主从关系。

主要特点:

  • 主服务器负责写操作,多个从服务器可以复制主服务器的数据。
  • 从服务器不仅可以复制主服务器的数据,还可以成为其他从服务器的主服务器,构建多层级的主从关系。
  • 适用于需要将数据分发到不同地理位置或数据中心的应用场景,以提高数据的可用性和冗余性。

四、主从复制原理剖析

4.1 主从节点建立复制流程

主从节点建立复制流程图如下:

下面是主从节点建立复制的详细流程说明:

  1. 保存主节点信息

    • 在开始配置主从同步关系之前,从节点只保存主节点的地址信息,如IP地址和端口号。此时复制流程还没有开始,从节点的连接状态为下线。
  2. 建立网络连接

    • 从节点内部通过每秒运行的定时任务维护复制相关逻辑。
    • 定时任务会尝试与主节点建立基于TCP的网络连接。
    • 如果连接失败,定时任务会无限重试直到连接成功或者用户停止主从复制。
  3. 发送PING命令

    • 连接建立成功后,从节点会发送PING命令给主节点,用来确认主节点在应用层上正常工作。
    • 如果PING命令的结果为PONG回复超时,从节点会断开TCP连接,并等待定时任务下次重新建立连接。
  4. 权限验证

    • 如果主节点设置了requirepass参数(即密码验证),则需要密码验证。
    • 从节点通过配置masterauth参数来设置密码,如果验证失败,从节点的复制将会停止。
  5. 同步数据集

    • 对于首次建立复制的场景,主节点会将当前持有的所有数据全部发送给从节点。这是耗时最长的步骤,因此可以分为两种情况:全量同步和部分同步。
    • 全量同步:主节点发送完整的数据集给从节点,确保从节点的数据与主节点一致。
    • 部分同步:一旦全量同步完成,主节点将持续发送写入命令给从节点,以确保从节点跟踪主节点的数据变化。

这个过程确保了主从节点之间的数据一致性,并允许主节点的数据更新能够被从节点复制,从而实现了主从复制的基本功能。主从复制对于数据备份、提高读性能和实现高可用性非常有用。

4.2 PSYNC 命令

从节点使用 PSYNC 命令来完成部分复制和全量复制的功能。PSYNC 命令的格式为 PSYNC {runId} {offset},其中参数的含义如下:

  • {runId}:从节点所复制的主节点的运行ID。
  • {offset}:当前从节点已复制的数据偏移量。

PSYNC 命令的执行流程如下图所示:

PSYNC命令执行流程

  1. 从节点发送 PSYNC 命令给主节点,其中 runIdoffset 的默认值分别是 “?” 和 “-1”。

  2. 主节点根据 PSYNC 命令的参数和自身数据情况来决定响应结果:

    • 如果主节点回复 “+FULLRESYNC runId offset”,则从节点需要执行全量复制流程。
    • 如果主节点回复 “+CONTINUE”,从节点执行部分复制流程。
    • 如果主节点回复 “-ERR”,说明 Redis 主节点的版本过低,不支持 PSYNC 命令。从节点可以使用 SYNC 命令来进行全量复制。

需要注意的是,PSYNC 命令不需要手动执行,Redis 会在主从复制模式下自动调用执行。 PSYNC 命令的目的是确保从节点能够正确获取主节点的增量数据更新,以保持数据的一致性。根据主节点的响应,从节点将执行全量复制或部分复制流程。

4.3 runid 和 replid

4.3.1 runid 和 replid 的区别

在 Redis 主从复制中,runidreplid 是两个重要的标识符,用于唯一标识主节点和从节点以及它们之间的复制关系。

  1. runid(Run ID)

    • runid 是 Redis 服务器的运行标识符,用于唯一标识 Redis 服务器的每个运行实例。
    • 每次 Redis 服务器启动时,都会生成一个新的 runid,并在运行过程中保持不变,除非服务器重新启动。
    • 在主从复制中,主节点和从节点都有自己的 runid,用于唯一标识它们自己的运行实例。
    • 主节点的 runid 在复制关系建立时会被从节点保存,以便从节点可以识别主节点的身份。
  2. replid(Replication ID)

    • replid 是主节点用于标识自己的复制ID,它唯一标识主节点的数据副本。
    • 主节点在每次重新同步(如全量复制)或部分同步(如部分复制)时,都会生成一个新的 replid
    • replid 主要用于从节点识别主节点的数据更新,确保从节点可以正确复制主节点的数据。
    • 在主从复制中,从节点会定期向主节点发送请求,获取主节点的最新 replid,以便跟踪数据的变化。

综合来说,runid 用于标识 Redis 服务器的唯一性,每个 Redis 服务器都有自己的 runid,而 replid 用于标识主节点的数据副本,确保从节点可以正确复制主节点的数据。这两个标识符在主从复制中起到关键的作用,确保数据的一致性和正确性。通过使用这些标识符,Redis 可以准确识别不同的服务器实例以及它们之间的复制关系。

4.3.2 查看 runid 和 replid

在 Redis 中,可以通过以下命令来查看主节点(Master)和从节点(Slave)的 runidreplid

  1. 查看 replid

    • 可以使用 INFO replication 命令来查看主从节点的 runid

主节点:

从节点 slave1:

从节点 slave2:

通过观察上面的信息可以发现,两个从节点的 master_replid 和主节点的 master_replid 一样,说明这两个从节点是从这个主节点上复制数据的。

  1. 查看runid

    • 查看主从节点的 runid,可以使用 INFO server 命令。

主节点:


从节点 slave1:

从节点 slave2:

通过查看上面不同节点的信息可以发现其 runid 都是不同的,表明了 runid 是用于唯一标识 Redis 服务器的每个运行实例。

4.4 数据同步

在Redis中,数据同步是通过PSYNC命令完成的,主从数据同步过程分为全量复制和部分复制两种情况:

  • 全量复制:

全量复制通常用于首次建立主从复制关系的情况。在早期版本的Redis中,只支持全量复制,这意味着主节点会将全部数据一次性发送给从节点。当数据量较大时,全量复制可能会对主从节点和网络造成较大的开销。

  • 部分复制:

部分复制用于处理主从复制中由于网络断开等原因导致的数据丢失情况。当从节点重新连接到主节点时,如果条件允许,主节点会向从节点发送缺失的数据。由于补发的数据远小于全量数据,因此部分复制可以有效减少开销。

此外,PSYNC命令的运行需要以下组件的支持:

  1. 主从节点各自的复制偏移量(replication offset)。
  2. 主节点的复制积压缓冲区(replication backlog)。
  3. 主节点的运行 ID。

4.4.1 复制偏移量

参与复制的主从节点都会维护自身复制偏移量。主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在info replication中的master_repl_offset指标中:

127.0.0.1:6379> info replication
# Replication
role:master
...
master_repl_offset:1055130

从节点(slave)每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量,统计指标如下:

127.0.0.1:6379> info replication
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=1055214,lag=1

从节点在接受到主节点发送的命令后,也会累加记录自身的偏移量。统计信息在info replication中的slave_repl_offset指标中:

127.0.0.1:6380> info replication
# Replication
role:slave
...
slave_repl_offset:1055214

复制偏移量的维护如图所示,通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

复制偏移量维护

4.4.2 复制积压缓冲区

复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB。当主节点有连接的从节点(slave)时被创建,这时主节点(master)响应写命令时,不仅会把命令发送给从节点,还会写入复制积压缓冲区。

复制积压缓冲区图示

由于缓冲区本质上是先进先出的定长队列,所以能实现保存最近已复制数据的功能,用于部分复制和复制命令丢失的数据补救。复制缓冲区相关统计信息可以通过主节点的info replication中查看:

127.0.0.1:6379> info replication
# Replication
role:master
...
repl_backlog_active:1 // 开启复制缓冲区
repl_backlog_size:1048576 // 缓冲区最大长度
repl_backlog_first_byte_offset:7479 // 起始偏移量,计算当前缓冲区可用范围
repl_backlog_histlen:1048576 // 已保存数据的有效长度

根据统计指标,可以算出复制积压缓冲区内的可用偏移量范围:[repl_backlog_first_byte_offset, repl_backlog_first_byte_offset + repl_backlog_histlen]。

这个相当于一个基于数组实现的环形队列。上述区间中的值就是"数组下标"。

4.4.3 主节点运行 ID

每个 Redis 节点启动后都会动态分配一个40位的十六进制表示的运行 ID。运行 ID的主要作用是用来唯一标识 Redis 节点,比如从节点可以使用主节点的运行 ID 来识别自己正在复制的哪个主节点。这个 ID 随着 Redis 的重新启动会发生变化,可以通过info server命令查看当前节点的运行 ID:

127.0.0.1:6379> info server
# Server
...
run_id:545f7c76183d0798a327591395b030000ee6def9

运行 ID 在 Redis 集群和复制中都扮演着重要的角色,它确保了节点的唯一性和可识别性,有助于维护数据的一致性和跟踪节点的运行状态。

综上所述,Redis 的数据同步是通过 PSYNC 命令实现的,可以根据需要选择全量复制或部分复制,并且需要主从节点各自的复制偏移量、主节点的复制积压缓冲区以及主节点的运行 ID 的支持。这些组件共同协作,确保了数据在主从节点之间的高效同步和一致性维护。

五、主从结构的全量复制、部分复制与实时复制

5.1 全量复制

全量复制是 Redis 最早支持的复制方式,也是在建立主从复制关系时必须经历的阶段。全量复制的运行流程如下图所示:

全量复制流程

以下是各个步骤的说明:

  1. 从节点发送psync命令给主节点以进行数据同步。由于是第一次进行复制,从节点没有主节点的运行ID和复制偏移量,因此发送psync时的参数是-1

  2. 主节点根据命令解析出要进行全量复制,并回复+FULLRESYNC响应。

  3. 从节点接收主节点的运行信息并保存。

  4. 主节点执行bgsave操作来生成 RDB 文件,将数据持久化到磁盘。

  5. 从节点发送请求,要求主节点传输 RDB 文件,从节点接收并保存 RDB 数据到本地。

  6. 主节点在 RDB 生成期间会执行写命令,并将这些写命令的操作记录在缓冲区中。一旦从节点加载完 RDB 文件后,主节点将缓冲区内的数据补发给从节点,以保持主从数据的一致性。

  7. 从节点清空自身的旧数据,为加载 RDB 数据做准备。

  8. 从节点加载 RDB 文件,从而获得与主节点一致的数据。

  9. 如果从节点在加载 RDB 完成后开启了 AOF 持久化功能,它会执行bgrewrite操作,以获取最新的 AOF 文件。

需要注意的是,全量复制是一项高成本的操作,它涉及主节点执行bgsave操作、RDB 文件在网络上传输、从节点清空旧数据、加载 RDB 数据等多个步骤。因此,一般情况下,应尽量避免对已经拥有大量数据集的 Redis 进行全量复制。全量复制适用于初次建立主从复制关系的场景,而在之后的数据同步中,更多地采用部分复制来减小复制的开销。

5.2 部分复制

部分复制是 Redis 为了优化全量复制的高开销而引入的一种复制方式,它使用psync命令结合runIdoffset参数来实现。

  • 在部分复制中,如果从节点在复制主节点的过程中遇到网络中断、命令丢失等异常情况,它可以向主节点请求补发丢失的命令数据。

  • 如果主节点的复制积压缓冲区中存在相应的数据,主节点会直接将这些数据发送给从节点,从而保持主从节点之间的数据一致性。

  • 由于补发的数据通常远小于全量数据,因此部分复制的开销较小。

以下是部分复制的整体流程:

部分复制流程

以下是各个步骤的说明:

  1. 当主从节点之间出现网络中断,并且超过了repl-timeout所配置的时间,主节点会认为从节点故障,并终止复制连接。

  2. 主从连接中断期间,主节点依然响应命令,但这些复制命令由于网络中断而无法及时发送给从节点,因此主节点会将这些命令暂时保存在复制积压缓冲区中。

  3. 当主从节点之间的网络恢复后,从节点再次连接到主节点。

  4. 从节点将之前保存的运行ID和复制偏移量作为psync命令的参数发送给主节点,请求进行部分复制。

  5. 主节点接收到psync请求后,进行必要的验证。然后,根据offset参数查询复制积压缓冲区,找到合适的数据,并响应+CONTINUE给从节点。

  6. 主节点将需要同步给从节点的数据发送给它,最终完成数据的一致性。

需要注意的是,部分复制是一种用于处理主从节点之间网络闪断或命令丢失等异常情况的复制方式,它通过补发丢失的数据来保持数据的一致性,从而减小了全量复制的开销。

5.3 实时复制

实时复制是主从节点在建立复制连接后需要维护的长连接,并相互发送心跳命令以保持连接的活性和数据的一致性。

以下是实时复制的工作原理:

  1. 主从节点都具备心跳检测机制,它们模拟对方的客户端进行通信。

  2. 主节点默认每隔约10秒向从节点发送一条PING命令,以检测从节点的存活性和连接状态。这可以帮助主节点确保从节点正常运行。

  3. 从节点默认每隔约 1 秒向主节点发送一条 REPLCONF ACK {offset} 命令,其中 {offset} 表示从节点当前的复制偏移量。这样,从节点可以向主节点报告自己复制的进度。

如果主节点发现从节点的通信延迟超过了配置的 repl-timeout 值(默认为60秒),主节点会判定从节点为下线状态,并断开与从节点的复制客户端连接。当从节点恢复连接后,心跳机制会继续运行,确保主从节点之间的复制连接保持活跃。

实时复制的机制有助于确保主从节点之间的数据同步持续进行,并可以自动处理部分复制中出现的网络断连等异常情况,从而保持主从节点之间的数据一致性。

六、其他问题

6.1 关于 Redis 从节点晋升为主节点的时机问题

在 Redis 中,从节点(slave)可以在特定情况下晋升为主节点(master)。这种情况通常出现在以下两种情况下:

  1. 手动晋升: 管理员可以手动将从节点升级为主节点。这通常是在需要切换主节点或者原主节点故障时执行的操作。要手动晋升从节点为主节点,需要在从节点上执行SLAVEOF NO ONE命令,这将取消从节点的复制关系并将其变成主节点。

  2. 自动故障切换: Redis Sentinel(哨兵机制) 或者 Redis Cluster 集群管理工具可以监控主节点的状态。如果主节点发生故障,监控工具可以自动将一个从节点晋升为新的主节点,以确保高可用性。这通常是在配置了 Redis 高可用性解决方案时使用的机制。

需要注意的是,将从节点升级为主节点会中断与先前主节点的复制关系,因此在执行此操作之前,需要确保已经备份了重要数据,并且明白这可能会导致数据不一致。此外,晋升后的新主节点将开始接受写入操作,因此需要确保新主节点的性能和资源足够满足写入操作的需求。

6.2 关于 Redis 配置了主从结构后无法启动的问题

如果在配置 Redis 主从结构后无法启动,通常是由于配置文件或者网络连接问题引起的。以下是一些可能导致启动问题的常见原因和解决方法:

  1. 配置文件错误: 检查 Redis 配置文件(redis.conf)中的主从配置是否正确。确保主节点的配置包含slaveof指令,指向正确的主节点地址和端口。从节点的配置应包含slaveof指令,指向主节点。

  2. 网络连接问题: 确保主从节点之间的网络连接是正常的。尝试使用ping命令或者其他网络工具测试主从节点之间的连通性。如果有防火墙或网络策略限制,确保已正确配置。

  3. 复制密码错误: 如果在主节点上启用了密码保护,需要在从节点的配置文件中设置正确的密码(使用masterauth指令)。确保密码是正确的。

  4. 端口占用: 确保 Redis 使用的端口没有被其他进程占用。可以通过尝试更改 Redis 端口或者查看端口占用情况来解决。

  5. 数据目录权限: 检查 Redis 数据目录的权限设置。确保 Redis 进程具有足够的权限读写数据目录。

  6. 错误日志查看: 查看 Redis 错误日志文件(通常是 redis-server.log 或者 syslog 中的 Redis 相关日志),以查找有关启动失败的更多信息。日志文件通常会提供有关错误的详细信息,有助于排除问题。

  7. 配置项冲突: 确保配置文件中没有重复或冲突的配置项。有时候,错误的配置项可能导致启动问题。

在排除以上问题后,可以尝试使用 Redis 命令行工具以交互方式启动 Redis,这有助于在启动过程中看到错误消息并进行调试。例如,可以使用以下命令启动 Redis:

redis-server /path/to/redis.conf

替换 /path/to/redis.conf 为自己的配置文件路径。在启动过程中,Redis 会将错误消息输出到终端,有助于识别问题。

相关文章:

【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理

文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…...

CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )

scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…...

9.19号作业

2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…...

Mybatis学习笔记9 动态SQL

Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景&#xff1a; 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…...

element表格 和后台联调

1.配置接口 projectList:/api/goods/xxx,//产品列表2.请求接口(get请求默认参数page) // 产品列表 pageprojectList(params){return axios.get(base.projectList,{params})}3.获取数据 直接放到created里边去了 刷新页面就可以看到 async projectList(page){let res await t…...

基于SSM的智慧城市实验室主页系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

怒赞,阿里P8推荐的Java面试宝典:41个专题PDF(史上最全+面试必备)

《尼恩Java面试宝典》 40岁老架构师 尼恩 经过对大量 Java面试题 的不断梳理、迭代&#xff0c; 编著成5000页的《尼恩Java面试宝典》&#xff0c;致力于体系化&#xff0c; 系统化&#xff0c;形象化 梳理&#xff0c;形成一个大的知识体系&#xff0c;从而帮助大家 进大厂&a…...

线程池各个参数设置说明

1. corePoolSize 核心线程数 看处理业务属于IO密集型还是属于cpu密集型IO密集型: 通常设置为N1&#xff0c;还有一个计算公式&#xff1a;线程数 cpu数*&#xff08;线程等待时间/线程总的处理时间&#xff09; 但是由于服务器除了这个服务可能还部署有其他服务&#xff0c;…...

springBoot对接多个mq并且实现延迟队列---未完待续

mq调用流程 创建消息转换器 package com.wd.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import o…...

Pytorch从零开始实战04

Pytorch从零开始实战——猴痘病识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——猴痘病识别环境准备数据集模型选择模型训练数据可视化其他模型图片预测 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytor…...

北大C++课后记录:文件读写的I/O流

前言 文件和平常用到的cin、cout流其实是一回事&#xff0c;可以将文件看作一个有限字符构成的顺序字符流&#xff0c;基于此&#xff0c;也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注&#xff1a;这里的指针并不是普…...

详解Linux的grep命令

2023年9月19日&#xff0c;周二晚上 先写这么多吧&#xff0c;以后有空再更新&#xff0c;还要一些作业没写完.... 目录 概述查看grep命令的所有选项grep的常用选项选项-i选项-v选项-n选项-c​编辑选项-l组合使用 概述 grep命令在Linux系统中是一个很重要的文本搜索工具和过…...

spark6. 如何设置spark 日志

spark yarn日志全解 一.前言二.开启日志聚合是什么样的2.1 开启日志聚合MapReduce history server2.2 如何开启Spark history server 三.不开启日志聚合是什么样的四.正确使用log4j.properties 一.前言 本文只讲解再yarn 模式下的日志配置。 二.开启日志聚合是什么样的 在ya…...

glibc: strlcpy

https://zine.dev/2023/07/strlcpy-and-strlcat-added-to-glibc/ https://sourceware.org/git/?pglibc.git;acommit;h454a20c8756c9c1d55419153255fc7692b3d2199 https://linux.die.net/man/3/strlcpy https://lwn.net/Articles/612244/ 从这里看&#xff0c;这个strlcpy、st…...

如何在 Buildroot 中配置 Samba

在 Buildroot 中配置 Samba 在 Buildroot 中配置 Samba 可以通过以下步骤完成&#xff1a; 1. 进入 Buildroot 的根目录。 2. 执行 make menuconfig 命令&#xff0c;打开 Buildroot 的配置菜单。 3. 在配置菜单中&#xff0c;使用键盘导航到 "Target packages" 选…...

SSM02

SSM02 此时我们已经做好了登录模块接下来可以做一下学生管理系统的增删改查操作 首先&#xff0c;我们应当有一个登录成功后的主界面 在webapp下新建 1.main.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…...

day3_QT

day3_QT 1、文件保存2、始终事件 -闹钟 1、文件保存 2、始终事件 -闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { clas…...

js-map方法中调用服务器接口

在 Array.prototype.map() 方法中调用服务器接口时&#xff0c;可以使用异步函数来处理。 示例&#xff1a; async function fetchData() {try {const response await fetch(https://api.example.com/data); // 通过 fetch 发送请求const data await response.json(); // 解…...

docker 已经配置了国内镜像源,但是拉取镜像速度还是很慢(gcr.io、quay.io、ghcr.io)

前言 国内用户在使用 docker 时&#xff0c;想必都遇到过镜像拉取慢的问题&#xff0c;那是因为 docker 默认指向的镜像下载地址是 https://hub.docker.com&#xff0c;服务器在国外。 网上有关配置 docker 国内镜像源的教程很多&#xff0c;像 腾讯、阿里、网易 等等都会提供…...

[linux(静态文件服务)] 部署vue发布后的dist网页到nginx

所以说&#xff1a; 1.windows下把开发好的vue工程打包为dist文件然后配置下nginx目录即可。 2.linux上不需要安装node.js环境。 3.这样子默认访问服务器ip地址&#xff0c;就可以打开&#xff0c;毕竟默认就是&#xff1a;80端口。...

智华计算机终端保护检查系统使用笔记

使用说明 【智华保密检查右键管理员运行后粘贴密码】—— 点击脚本更改系统时间【智华计算机终端保护检查系统】—— 打开检测软件进行保密检查 检测文件格式 .pdf .doc .docx .xls .pptx 检测时间日志 2023年9月14日A&#xff1a;【34:03秒】2023年9月14日B&#xff1a;【…...

前端面试话术集锦第 15 篇:高频考点(React常考进阶知识点)

这是记录前端面试的话术集锦第十五篇博文——高频考点(React常考进阶知识点),我会不断更新该博文。❗❗❗ 1. HOC 是什么?相比 mixins 有什么优点? 很多人看到高阶组件(HOC)这个概念就被吓到了,认为这东西很难,其实这东西概念真的很简单,我们先来看一个例子: func…...

汽车电子——产品标准规范汇总和梳理(适应可靠性)

文章目录 前言 一、电气性能要求 二、机械性能要求 三、气候性能要求 四、材料性能要求 五、耐久性能要求 六、防护性能要求 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、电气性能要求 《GB/T 28046.2-2019&#xff08;ISO 16750-2&#xff1a;2012&#…...

计算机是如何工作的(上篇)

计算机发展史 世界上很多的高科技发明,来自于军事领域 计算机最初是用来计算弹道导弹轨迹的 弹道导弹 ~~国之重器,非常重要 两弹一星 原子弹,氢弹,卫星(背后的火箭发射技术) 计算弹道导弹轨迹的计算过程非常复杂,计算量也很大 ~~ 但是可以手动计算出来的(当年我国研究两弹一…...

数学建模| 优化入门+多目标规划

优化入门多目标规划 优化入门知识什么是优化问题如何判断是不是优化问题优化模型建模求解器优化问题的分类 多目标规划 优化入门知识 什么是优化问题 优化问题&#xff1a;求最优&#xff0c;例如获利最大、最少损失、最短路径、最小化风险等等。 例如&#xff1a;之前文章提…...

SSM整合Thymeleaf时,抽取公共页面并向其传递参数

第一步 创建一个名为 header.html 的公共头部页面模板&#xff0c;放在 WEB-INF 目录下的 common 文件夹中。在 header.html 中可以编写头部页面的HTML代码&#xff0c;并通过Thymeleaf的语法来接收参数&#xff0c;如下所示&#xff1a; <!DOCTYPE html> <html xml…...

接口测试 —— requests 的基本了解

● requests介绍及安装 ● requests原理及源码介绍 ● 使用requests发送请求 ● 使用requests处理响应 ● get请求参数 ● 发送post请求参数 ● 请求header设置 ● cookie的处理 ● https证书的处理 ● 文件上传、下载 requests介绍 ● requests是python第三方的HTT…...

2023年华为杯数学建模研赛D题思路解析+代码+论文

下文包含&#xff1a;2023华为杯研究生数学建模竞赛&#xff08;研赛&#xff09;D题思路解析代码参考论文等及如何准备数学建模竞赛&#xff08;22号比赛开始后逐步更新&#xff09; C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资…...

AB试验(三)一次试验的规范流程

AB试验&#xff08;三&#xff09;一次试验的规范流程 一次完整且规范的A/B试验可参考下图&#xff1a; 确定目标和假设 核心&#xff1a;A/B测试是因果推断&#xff0c;所以我们首先要确定原因和结果。目标决定了结果&#xff0c;而假设又决定了原因。 如何确定 分析问题&am…...

ROI tracking by using OpenCV

目录 source code: source code: import cv2tracker cv2.TrackerKCF_create() video cv2.VideoCapture(1)while True:ret,frame video.read()cv2.imshow("source frame",frame)k cv2.waitKey(30)if k q:break bbox cv2.selectROI(frame, False) ok tracker.i…...

网页设计与网站建设项目教程/成都百度推广开户公司

网络通信、文件存储中经常需要交换数据&#xff0c;为了减少网络通信流量、文件存储大小以及加密通信规则&#xff0c;经常需要对数据进行双向加解密以保证数据的安全。PHP中实现此功能主要需要使用的函数主要是pack及unpack函数pack压缩资料到位字符串之中。语法: string pack…...

wordpress ip改域名/微信公众号推广方法有哪些

文章目录类C中可以使用struct、class来定义一个类变量名规范参考类实例化成为了对象&#xff0c;对象的内存空间由成员变量决定对象对象的内存布局代码段&#xff08;代码区&#xff09;数据段&#xff08;全局区&#xff09;栈空间堆空间thisthis指针必须用->,不能用. &…...

asp+dreamweaver数据库网站开发与实例教程/产品推广的目的和意义

第7章 接口 接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起&#xff0c;这种抽象的方式能让我们的函数更加的灵活和更具有适应能力 Go语言的接口比较特殊&#xff0c;因为它是满足隐式实现的。也就是说&#xff0c;我们无需给具体类型定义所有…...

疏通下水道网站怎么做/站长网站推广

面向对象 面向对象概述&#xff1a; 类和对象的概念&#xff1a; 类 &#xff1a; 抽象名词&#xff0c;用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 对象 &#xff1a; 具体的事物&#xff0c;通过类定义的数…...

网站的技术解决方案/域名停靠

1、Microsoft Office Word 2007 是一个文档创作程序&#xff0c;集一组全面的写入工具和易用界面于一体&#xff0c;可以帮助用户创建和共享美观的文档。 2、Microsoft Office Excel 2007 是一个功能强大的电子表格程序&#xff0c;您可以用来分析、交流和管理信息&#xff0c;…...

湖南大型网站建设公司排名/seo外包公司哪家专业

MIRACL用户手册译&#xff1a;叶道全yedaoq126.com摘要Miracl库包含100余个例程&#xff0c;涉及多倍精度运算(multiprecision arithmetic)的各个方面。定义了两种新的数据类型——表示大整数的big类型和表示有理数的flash(short for floating-slash)类型。大整数例程基于Knuth…...