redis--主从复制

redis主从复制

Redis 主从复制是一种用于实现数据复制和数据备份的机制,它允许将一个 Redis 服务器的数据复制到其他 Redis 服务器上。主从复制在 Redis 中通常用于构建高可用性架构、读写分离以及数据分析等场景。

主从复制的角色

主服务器(Master): 主服务器是数据源,它负责处理客户端的写操作和读操作。主服务器会将自己的数据发送给从服务器,以便实现数据复制。

从服务器(Slave): 从服务器是主服务器的副本,它会复制主服务器上的数据。从服务器通常用于处理只读操作,以减轻主服务器的负担,同时也可以提供备份和故障恢复的能力。

在这里插入图片描述

相关命令

命令说明
SLAVEOF master-ip master-port在从服务器上设置主服务器连接信息
MASTERAUTH password在从服务器上设置主服务器的密码
INFO replication检查主从复制的状态
SLAVEOF NO ONE断开从服务器与主服务器的连接
INFO clients在主服务器上查看从服务器信息
INFO server在从服务器上查看主服务器信息

主从复制的流程

主从复制的过程大致可以分为三个阶段:

建立连接阶段:

在这个阶段,从节点需要设置主节点的地址和端口,然后向主节点发起连接请求。这可以通过以下三种方式实现:

  • 配置文件:在从节点的配置文件中加入 slaveof masterip masterport 选项。
  • 启动命令:在从节点启动时,使用 redis-server --slaveof masterip masterport 命令。
  • 客户端命令:在从节点启动后,使用 slaveof masterip masterport 命令。

无论使用哪种方式,从节点都会将主节点的地址和端口保存到服务器状态的属性里面。然后,从节点会创建一个socket连接,并向主节点发送 PING 命令来检测主节点的状态。如果主节点正常响应,则继续进行身份验证(如果有设置密码);如果超时或返回其他结果,则断开连接并重试。

身份验证是通过向主节点发送 AUTH 命令进行的,参数为配置文件中的 masterauth 的值。如果主节点设置密码的状态与从节点 masterauth 的状态一致(一致是指都存在且密码相同,或者都不存在),则身份验证通过;如果不一致,则断开连接并重试。

数据同步阶段:

在这个阶段,从节点会向主节点发送 PSYNC 命令(Redis 2.8 以前是 SYNC 命令),开始同步数据。根据从节点是否有保存主节点的复制偏移量(offset)和运行ID(runid),可以分为全量复制和部分复制两种情况:

  • 全量复制:如果从节点是第一次连接主节点,或者从节点保存的偏移量和运行ID与主节点不匹配,那么就需要进行全量复制。
    全量复制的过程:
    • 主节点会执行 BGSAVE 命令来生成一个 RDB 文件,并将自己执行过的写命令缓存起来;
    • 然后主节点会将 RDB 文件以及缓存的写命令发送给从节点,并向从节点返回 +FULLRESYNC [runid] [offset] 消息;
    • 从节点会接收并加载 RDB 文件,并执行收到的写命令,最终达到与主节点一致的状态。
  • 部分复制:如果从节点保存的偏移量和运行ID与主节点匹配,那么就可以进行部分复制。
    部分复制的过程:
    • 主节点会根据从节点提供的偏移量,发送从该偏移量之后执行过的写命令;
    • 从节点会接收并执行这些写命令,最终达到与主节点一致的状态。

命令传播阶段:

在这个阶段,主节点会将自己执行的写命令实时地发送给从节点,从节点会接收并执行这些写命令,保持与主节点的数据一致性。在命令传播阶段,从节点默认会以每秒一次的频率,向主节点发送 REPLCONF ACK [offset]命令,其中 [offset] 是从节点当前的复制偏移量。

这个命令有三个作用:

  • 检测主从服务器的网络状态。
  • 辅助实现 min-slaves 选项。
  • 检测命令丢失。

主从复制中三种常用模式

一主二仆

这是最简单的主从复制模式,就是一个主节点对应两个或多个从节点,从节点直接连接到主节点,接收并执行主节点发送的写命令。这种模式的优点是可以提高数据的可靠性和可用性,同时可以实现读写分离,提高读性能。缺点是如果主节点宕机,需要手动选择一个从节点来升级为主节点,并且重新配置其他从节点的连接。

假设现在我们6379端口的redis服务器是主服务器,6380端口和6381端口的redis服务器为6379服务器的从服务器。

主从复制中,如果从机中途宕机后重启,数据是否还会同步?

如果从机在复制数据过程中发生宕机并在之后重新启动,数据是否会继续同步取决于配置和具体情况。

  • 手动配置复制关系: 如果在启动过程中没有直接在从机的配置文件中定义主机(Master)信息,而是通过命令行启动并使用类似于 SLAVEOF 127.0.0.1 6379 的命令将从机连接到主机,那么在从机宕机后重新启动时,它将会以自己作为主机的状态启动,并不会自动恢复数据同步。为了使数据同步重新开始,需要再次手动执行 SLAVEOF 127.0.0.1 6379 这样的命令,将其重新设为主机的从机,以实现数据同步。

  • 配置文件定义复制关系: 如果在从机的配置文件中明确指定了主机的信息,那么在从机宕机后重新启动时,它会自动尝试连接到指定的主机并恢复数据同步。这种情况下,从机会重新以从属身份连接到主机,继续同步数据。

主从复制中,如果主机宕机,两台从机会怎么样?

主机宕机后: 当主机宕机时,从机不会立即意识到主机的状态变化。它们会继续认为主机是活跃的,但是在执行命令 info replication 时,会显示主机状态为 “down”。这表示从机意识到主机无法响应。从机仍会尝试与主机保持连接,但由于主机已宕机,连接将无法建立。

主机重启后: 当主机再次复活并重启后,从机会重新尝试连接到主机。如果从机的配置正确,并且主机恢复正常运行,从机会重新建立与主机的连接,并开始从主机同步数据。从机会继续将主机视为其复制源,继续按照复制规则同步数据。

需要注意的是,在主机宕机期间,从机无法从主机获取新的数据更新。当主机恢复后,从机将会努力迎头赶上,并确保与主机的数据保持同步。

薪火相传

"薪火相传"是在主从复制中一种用于构建多层级的复制拓扑结构,以分散主机的负担并实现数据同步。当有大量的从机需要与主机同步数据时,直接将所有从机连接到主机可能会对主机的性能和带宽造成压力。因此,通过构建多级复制关系,可以分散这种负担,但也会引入一些潜在的问题。

例如,如果将从机分为多级,当处于上游的从机(靠近主机)宕机时,会导致下游从机无法获取数据。这是薪火相传模型的一个缺点。以下是详细的操作步骤:

  1. 假设我们有一主机(6379)和三个从机(6380、6381、6382)。
  2. 将主机(6379)配置为主服务器,允许从机连接和复制数据。
  3. 将从机 6380 配置为连接到主机 6379 的从服务器。这样,6380 将直接与主机同步数据。
  4. 将从机 6381 配置为连接到从机 6380 的从服务器。在这一级别,6381 作为 6380 的从服务器,而 6380 本身是主机的从服务器。这样,6381 从 6380 获取数据,6380 再从主机获取数据。
  5. 同样,可以将从机 6382 配置为连接到从机 6380 的从服务器,形成更深层次的复制结构。

针对从机 6381,可以使用命令 SLAVEOF 127.0.0.1 6380 或者在配置文件 redis6381.conf 中修改 replicaof 127.0.0.1 6380,使其成为从机 6380 的从服务器。
针对从机 6382,同样可以使用类似的命令或配置来连接到 6380。

反客为主

"反客为主"指的是在主从复制中,如果主机宕机,可以让某个从机自动升级为新的主机,以保持系统的可用性。为了实现这种自动切换,引入了哨兵模式(Sentinel Mode),它能够监控主机的健康状态并在必要时自动执行主从切换操作。

哨兵模式

在哨兵模式中,一组哨兵进程负责监控主机和从机的状态。当主机宕机或发生故障时,哨兵会根据一定的规则和投票机制,自动选择一个从机作为新的主机,确保系统的高可用性。

哨兵模型选择从服务器的条件优先顺序依次为:
1、优先级靠前的(redis.conf中replica-priority 的值越小,优先级越高)
2、偏移量最大的(获得原主机数据最全的)
3、runid最小的(每个redis实例启动后都会随机生成一个40位的runid)

哨兵模式的核心目标是监控主服务器的状态并在需要时执行故障转移,其工作流程如下:

  1. 配置哨兵: 在一组独立的哨兵服务器上,分别创建 sentinel.conf 配置文件,指定要监控的主服务器(mymaster)的IP和端口,配置规则等。
  2. 启动哨兵: 在每个哨兵服务器上运行 redis-sentinel sentinel.conf 命令,启动哨兵进程。哨兵之间会进行通信,共同监控主服务器的状态。
  3. 监控主服务器: 哨兵周期性地向主服务器发送PING命令,检测主服务器是否健康。
  4. 故障检测: 如果主服务器无法响应,哨兵会将主服务器标记为“主观下线”。
  5. 投票和选举: 哨兵之间进行通信,进行投票并选举出新的主服务器。多数哨兵同意后,新的主服务器被选举出来。
  6. 自动切换: 哨兵将从服务器中选择一个成为新的主服务器,并更新其他从服务器以从新的主服务器同步数据。
  7. 客户端重定向: 当主从切换完成后,哨兵会通知客户端进行重定向,使其连接到新的主服务器。

配置步骤:

  1. 在redis.conf同级目录下创建 sentinel.conf 配置文件,配置内容如下:
# 设置监控的主服务器名称、IP、端口和投票数
sentinel monitor mymaster 127.0.0.1 6379 2# 设置故障转移的超时时间
sentinel down-after-milliseconds mymaster 5000# 设置故障转移的最小投票数
sentinel failover-timeout mymaster 10000# 设置密码认证(如果有)
sentinel auth-pass mymaster PASSWORD
  1. 启动哨兵进程
    运行以下命令启动哨兵进程:redis-sentinel sentinel.conf
  2. 监控和故障转移
    哨兵会周期性地向主服务器发送PING命令,检测主服务器是否健康。如果主服务器无法响应,哨兵会根据配置的规则和投票数自动进行故障转移。一旦新的主服务器选出,其他从服务器会同步到新的主服务器。

反客为主中的故障恢复如图:
在这里插入图片描述

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

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

相关文章

【AI视频教程】只需5步,AI作出鸡你太美视频

1.视频效果 黄昏见证虔诚的信徒 2.准备工作 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境剪辑一段【鸡你太美】原版视频stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 部署步骤参考制作ikun图片的文章…

laravel框架中批量更新数据

在php框架中 tp中就有批量更新封装好的 SaveAll 在laravel中有批量插入没有批量更新操作;因此我们可以自己去封装一个 然后批量进行更新操作 封装参考代码: /*** 批量更新** param $tableName 表名称* param string $pk 更新的字段* param array $multipleData 要更新的数据*…

redis事务对比Lua脚本区别是什么

redis官方对于lua脚本的解释:Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别…

攻防世界-PHP2

原题 解题思路 这题需要查看页面的phps文件(这玩意从没见过)。phps的文件是存放php的源代码的,但是不是所有网站都有。 只要让传入的idadmin就可以得到key了。 但是直接传入admin不行。用burp编码。 结果还是不行: 那就再…

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告:不赞成…

excel逻辑函数篇1

1、AND(logical1,[logical2],…):用于测试所有条件是否均为TRUE 检查所有参数均为true,如果是则返回true 2、OR(logical1,[logical2],…):用于测试是否有为TRUE的条件 如果任意参数值为true,即返回true;只有当所有参数…

视频云存储/安防监控/视频汇聚EasyCVR平台新增经纬度选取功能

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…

绘制原型图的常用工具之墨刀

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.墨刀是什么 二.墨刀的作用 三.墨刀界…

react-native-webview使用postMessage后H5不能监听问题(iOS和安卓的兼容问题)

/* 监听rn消息 */ const eventListener nativeEvent > {//解析数据actionType、extraconst {actionType, extra} nativeEvent.data && JSON.parse(nativeEvent.data) || {} } //安卓用document,ios用window window.addEventListener(message, eventLis…

微信小程序胶囊位置计算,避开胶囊位置

由于小程序在不同的手机上顶部布局会发生变化,不能正确避开胶囊位置,所以通过官方给出的胶囊信息,可以计算出胶囊位置,并避开 图示例: 此处思路是,获取胶囊底部位置,并拉开10个px 计算出来的…

Maven方式构建SpringBoot项目

目录 1、创建maven项目 2、添加springboot相关依赖 3、配置启动端口 4、修改APP文件 5、配置controller 6、启动应用 1、创建maven项目 项目如下&#xff1a; 2、添加springboot相关依赖 <parent><groupId>org.springframework.boot</groupId><arti…

人工智能与云计算实训室建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

函数(2)

6. 函数的声明和定义 6.1 函数声明&#xff1a; 1. 告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放…

系统架构设计专业技能 · 软件工程之需求工程

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…

Centos7安装docker后默认开启docker0的网卡|卸载默认网卡

docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升…

12. Docker可视化工具

目录 1、前言 2、Docker UI 2.1、部署Docker UI 2.2、管理容器 3、Portainer 3.1、部署Portainer 3.2、管理容器 3.3、添加远程Docker 4、Shipyard 1、前言 Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。…

使用Jmeter自带recorder代理服务器录制接口脚本

脚本录制 配置线程组 添加代理服务器 端口 和 录制脚本放置位置可根据需要设置 启动录制 点击启动后 弹出创建证书提示&#xff0c;点击OK 这个证书后续需要使用到 然后可见 一个弹窗。 Recorder . 本质是代理服务录制交易控制 可设置对应数据 方便录制脚本的查看 证书配置…

SystemVerilog之接口详解

1.入门实例 测试平台连接到 arbiter的例子&#xff1a;包括测试平台, arbiter仲裁器, 时钟发生器 和连接的信号。 ㅤㅤㅤ ㅤ ㅤㅤㅤㅤㅤ Arbiter里面可以自定义发送的权重&#xff0c; 是轮询还是自定义 grant表示仲裁出来的是哪一个&#xff0c;也即只有0&#xff0c;1&am…

第六阶|见道明心的笔墨(上)从书法之美到生活之美——林曦老师的线上直播书法课

如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程 如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程