什么是Redis主从复制?(redis主从复制getshell)
mhr18 2025-03-28 18:57 21 浏览 0 评论
什么是 Redis 主从复制?
Redis 主从复制是一种数据复制技术,它允许你将一个 Redis 服务器(称为 主服务器,Master)的数据复制到一个或多个其他的 Redis 服务器(称为 从服务器,Slave 或 Replica)。
简单来说,主服务器负责处理所有的写操作(例如 SET, DEL, INCR 等),而从服务器则从主服务器同步数据,并可以处理读操作(例如 GET, LRANGE 等)。
你可以把主从复制想象成一个“老板”和多个“助手”:
- 主服务器(老板): 负责接收客户的“指令”(写操作),并执行这些指令,同时记录下所有的“工作内容”(数据变更)。
- 从服务器(助手): 时刻关注“老板”的工作记录,并“复制”这些记录,保持和“老板”的数据一致。助手可以帮助“老板”处理一些简单的“查询”(读操作),减轻“老板”的压力。
主从复制的主要作用和优势:
- 数据冗余和备份 (Data Redundancy and Backup):
- 从服务器是主服务器数据的副本。当主服务器发生故障时,从服务器仍然拥有完整的数据,可以作为数据备份使用,降低数据丢失的风险。
- 读写分离 (Read-Write Separation):
- 主服务器专注于处理写操作,从服务器可以处理读操作。这样可以将读请求分摊到多个从服务器上,提高系统的整体读取性能和并发能力。
- 特别是在读多写少的应用场景中,主从复制可以显著提升性能。
- 提高读取性能 (Read Scalability):
- 通过增加从服务器的数量,可以线性扩展系统的读取能力,应对高并发的读请求。
- 高可用性 (High Availability) 的基础:
- 主从复制是实现 Redis 高可用性的基础。虽然主从复制本身不能自动进行故障转移,但它是 Redis Sentinel 和 Redis Cluster 等高可用方案的基础组件。
主从复制的工作原理:
主从复制的建立和数据同步过程主要分为以下几个步骤:
- Slave 发起同步请求 (SYNC or PSYNC):
- 当一个 Slave 启动并配置为 Master 的 Slave 后,它会向 Master 发送 SYNC 或 PSYNC 命令(Redis 2.8 之后使用 PSYNC,更高效)。
- SYNC 命令会触发全量复制,PSYNC 命令会尝试增量复制(如果可能)。
- Master 执行 BGSAVE 并发送 RDB 文件 (Full Synchronization - 全量同步):
- 如果 Slave 是第一次连接 Master,或者无法进行增量复制,Master 会执行全量同步。
- Master 接收到 SYNC 命令后,会执行 BGSAVE 命令在后台生成 RDB 快照文件,同时将新的写命令缓存到缓冲区。
- Master 将生成的 RDB 文件发送给 Slave。
- Slave 接收到 RDB 文件后,会先清空自己的旧数据,然后加载 RDB 文件中的数据。
- Master 发送缓冲区中的写命令 (Command Propagation - 命令传播):
- 在发送 RDB 文件的同时,Master 会持续将新的写命令发送给 Slave。
- Slave 接收到这些写命令后,会立即执行,保持与 Master 数据的一致性。
- 后续的增量同步 (Incremental Synchronization - 增量同步):
- 如果 Slave 不是第一次连接,或者网络中断后重新连接,Redis 2.8 及以上版本会尝试使用 PSYNC 命令进行增量同步。
- Master 和 Slave 会维护一个复制偏移量 (replication offset),记录双方数据同步的位置。
- 如果 Slave 重新连接后,发现自己的偏移量和 Master 的偏移量之间存在差异,Master 只会发送差异部分的数据(即增量数据)给 Slave,而不是重新发送整个 RDB 文件,大大提高了同步效率。
- 心跳检测 (Heartbeat):
- Slave 会定期向 Master 发送 PING 命令进行心跳检测,确保连接正常。
- Master 也会定期检测 Slave 的状态。
主从复制的配置:
配置主从复制非常简单,只需要在 Slave 节点的 redis.conf 配置文件中添加一行配置:
复制代码slaveof
例如,如果 Master 的 IP 地址是 192.168.1.100,端口是 6379,则 Slave 的配置应该为:
复制代码slaveof 192.168.1.100 6379
重启 Slave 节点后,它就会自动连接到指定的 Master 节点,并开始进行数据同步。
主从复制的特点和注意事项:
- 异步复制 (Asynchronous Replication): Master 执行写命令后,不需要等待 Slave 同步完成就立即返回客户端。这保证了 Master 的高性能,但也意味着在极端情况下(例如 Master 突然宕机),可能会有少量数据尚未同步到 Slave,导致数据丢失。
- 单向复制 (One-way Replication): 数据只能从 Master 复制到 Slave,不能反向复制。Slave 节点只能进行读操作,默认情况下不能进行写操作(除非配置为可读写,但不推荐)。
- 读写分离的实现: 客户端需要根据业务需求,将写操作发送到 Master 节点,将读操作发送到 Slave 节点。可以使用客户端库或连接池来实现读写分离。
- 故障转移需要手动处理: 当 Master 节点宕机时,需要手动将一个 Slave 节点提升为新的 Master 节点,并修改其他 Slave 节点的配置,以及通知客户端连接新的 Master。 这也是 Redis Sentinel 诞生的原因,Sentinel 可以实现自动故障转移。
- 数据一致性: 由于是异步复制,Slave 节点的数据可能略微落后于 Master 节点,存在一定的延迟。在对数据一致性要求非常高的场景下,需要考虑这种延迟的影响。
总结:
Redis 主从复制是 Redis 高可用和高性能架构的基础。它通过数据冗余、读写分离和读扩展等特性,提高了 Redis 系统的可靠性和性能。虽然主从复制本身不能完全解决高可用性问题(例如自动故障转移),但它是构建更高级的 Redis 高可用方案(如 Sentinel 和 Cluster)的关键组成部分。
相关推荐
- B站收藏视频失效?mybili 收藏夹备份神器完整部署指南
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...
- 中间件推荐初始化配置
-
Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- 后端开发必看!Redis 哨兵机制如何保障系统高可用?
-
你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...
- Redis合集-大Key处理建议
-
以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...
- 深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服
-
大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...
- Redis 中 AOF 持久化技术原理全解析,看完你就懂了!
-
你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...
- Redis合集-必备的几款运维工具
-
Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...
- 别再纠结线程池大小 + 线程数量了,没有固定公式的!
-
我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...
- 网络编程—IO多路复用详解
-
假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...
- 5分钟学会C/C++多线程编程进程和线程
-
前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...
- 尽情阅读,技术进阶,详解mmap的原理
-
1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...
- C++11多线程知识点总结
-
一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...
- 微服务高可用的2个关键技巧,你一定用得上
-
概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...
- Java线程间如何共享与传递数据
-
1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)