Redis高可用方案—主从(masterslave)架构
mhr18 2024-10-25 12:40 30 浏览 0 评论
在上篇文章Linux安装Redis中我们在Linux服务器上完成了Redis的安装,并且也能正常使用了。但只有一个redis节点提供服务会存在一个很明显的问题,这台redis挂了怎么办?那就会导致所有的请求全都被打到数据库,降低系统的性能。所以,我们需要部署多个redis节点来保证高可用性。redis最常见的保证高可用的方案有三种:主从(master-slave)模式、哨兵模式和集群。本篇文章主要介绍主从复制模式的原理及搭建。
什么是主从模式
主从复制模式就是,部署多台redis节点,其中只有一台节点是主节点(master),其他的节点都是从节点(slave),也叫备份节点(replica)。只有master节点提供数据的事务性操作(增删改),slave节点只提供读操作。所有slave节点的数据都是从master节点同步过来的。该模式的架构图如下:
该图只是最简单的一种主从结构方式,所有的slave节点都挂在master节点上,这样做的好处是slave节点与master节点的数据延迟较小;缺点是如果slave节点数量很多,master同步一次数据的耗时就很长。针对这一问题,可以使用下图中的主从架构:
master下面只挂一个slave节点,其他的slave节点挂在这个slave节点下面,这样,master节点每次只需要把数据同步给它下面的那一个slave节点即可,后续slave节点的数据同步由这个slave节点完成。这样做虽然降低了master节点做数据同步的压力,但也导致slave节点与master节点数据不一致的延迟更高。
主从模式原理
从主从模式的架构图可以看出,主从模式的核心就是master节点与slave节点之间的数据同步。需要注意的是,Redis和大部分中间件的主从模式中的数据同步都是由slave节点主动发起的,原因是主从模式中只有一个master节点,剩余的全是slave节点,如果由master节点主动推送数据到各个slave节点,首先维护成本太大,master节点上要维护所有slave的地址信息,而且在增加slave节点的时候,也要同步维护到master上,这样master才能将数据同步到所有的slave上面;其次master性能受影响,节点之间同步数据肯定要通过网络传输数据,由master节点建立所有slave节点的连接会对master的性能产生较大影响。而由slave发起数据同步则避免了上述问题,只需在每个slave中维护一个master的地址即可。
Redis中主从节点数据同步有两种方式:全量数据同步和增量数据同步。
全量数据同步
全量数据同步一般发生在slave节点初始化阶段,需要将master上的所有数据全部复制过来。全量同步的流程图如下:
- slave节点根据配置的master节点信息,连接上master节点,并向master节点发送SYNC命令;
- master节点收到SYNC命令后,执行BGSAVE命令异步将内存数据生成到rdb快照文件中,同时将生成rdb文件期间所有的写命令记录到一个缓冲区,保证数据同步的完整性;
- master节点的rdb快照文件生成完成后,将该rdb文件发送给slave节点;
- slave节点收到rdb快照文件后,丢弃所有内存中的旧数据,并将rdb文件中的数据载入到内存中;
- master节点将rdb快照文件发送完毕后,开始将缓冲区中的写命令发送给slave节点;
- slave节点完成rdb文件数据的载入后,开始执行接收到的写命令。
以上就是master-slave全量同步的原理,执行完上述动作后,slave节点就可以接受来自用户的读请求,同时,master节点与slave节点进入命令传播阶段,在该阶段master节点会将自己执行的写命令发送给slave节点,slave节点接受并执行写命令,从而保证master节点与slave节点的数据一致性。
增量数据同步
Redis2.8版本之前,是不支持增量数据同步的,只支持全量同步。增量数据同步是指slave节点初始化完成后,master节点执行的写命令同步到slave节点的过程。该过程比较简单,master节点每执行一个写命令后就会将该命令发送给slave节点执行,从而达到数据同步的目的。
但有一点需要注意,当增量复制过程中发生了异常导致同步失败时,是要支持断点续传的,也就是在异常恢复之后,是要支持从上次断掉的地方继续同步的,而不是全量数据同步。这就需要在master节点和slave节点分别维护一个复制偏移量(offset),代表master向slave节点同步的字节数。master节点每次向slave节点发送N个字节后,master节点的offset增加N;slave节点每次接收到master节点发送过来的N个字节后,slave节点的offset增加N。master节点和slave节点的这两个偏移量分别保存在master_repl_offset和slave_repl_offset这两个字段中。
主从模式搭建
- 首先准备三台虚拟机,我使用的是VMware+CentOS7,可以参考我之前的文章虚拟机环境搭建(VMware Workstation14 + centos7.0)和VMware+CentOS7 网络及静态IP配置安装好虚拟机环境;
- 每台虚拟机上装好Redis,安装教程参考我之前的文章Linux安装Redis;
- 两台slave节点上配置master节点信息,有三种方式:
(1) redis.conf配置文件中添加:replicaof master节点IP master节点端口;
(2) 启动命令后加上:--replicaof master节点IP master节点端口;
(3) slave节点启动后,直接执行命令:replicaof master节点IP master节点端口。
这里我们使用常用的配置文件的方式配置:
4. 重启3台redis服务,查看slave节点的启动日志,可以看到master的节点信息.
5.验证主从结构是否可用。
(1) 首先,master和slave上的数据都是空的;
(2) master节点上添加一条数据,然后去slave节点上发现已经把这条数据同步了过来。
(3) slave节点上执行写命令会报错:
(4) 在master节点上执行:info replication命令可以看到自己的slave节点信息:
至此,说明我们的主从架构已经搭建成功了。
主从模式的好处
主从模式的优点有很多,下面列举几个最明显的好处:
- 数据备份。同样的数据在多个节点都存一份,起到了备份数据的作用。
- 故障恢复。当master节点发生故障后,可以选择一个slave节点作为master节点继续提供服务。
- 读写分离,提高性能。写操作交给master,读操作交给slave。
- 配置简单,容易搭建。只需要在slave节点上维护master节点的地址信息就可实现。
以上就是redis主从架构的实现原理和搭建过程。
点关注不迷路,跟我一起学技术!
相关推荐
- 订单超时自动取消业务的 N 种实现方案,从原理到落地全解析
-
在分布式系统架构中,订单超时自动取消机制是保障业务一致性的关键组件。某电商平台曾因超时处理机制缺陷导致日均3000+订单库存锁定异常,直接损失超50万元/天。本文将从技术原理、实现细节、...
- 使用Spring Boot 3开发时,如何选择合适的分布式技术?
-
作为互联网大厂的后端开发人员,当你满怀期待地用上SpringBoot3,准备在项目中大显身手时,却发现一个棘手的问题摆在面前:面对众多分布式技术,究竟该如何选择,才能让SpringBoot...
- 数据库内存爆满怎么办?99%的程序员都踩过这个坑!
-
你的数据库是不是又双叒叕内存爆满了?!服务器监控一片红色警告,老板在群里@所有人,运维同事的电话打爆了手机...这种场景是不是特别熟悉?别慌!作为一个在数据库优化这条路上摸爬滚打了10年的老司机,今天...
- springboot利用Redisson 实现缓存与数据库双写不一致问题
-
使用了Redisson来操作Redis分布式锁,主要功能是从缓存和数据库中获取商品信息,以下是针对并发时更新缓存和数据库带来不一致问题的解决方案1.基于读写锁和删除缓存策略在并发更新场景下,...
- 外贸独立站数据库炸了?对象缓存让你起死回生
-
上周黑五,一个客户眼睁睁看着服务器CPU飙到100%——每次页面加载要查87次数据库。这让我想起2024年Pantheon的测试:Redis缓存能把WooCommerce查询速度提升20倍。跨境电商最...
- 手把手教你在 Spring Boot3 里纯编码实现自定义分布式锁
-
为什么要自己实现分布式锁?你是不是早就受够了引入各种第三方依赖时的繁琐?尤其是分布式锁这块,每次集成Redisson或者Zookeeper,都得额外维护一堆配置,有时候还会因为版本兼容问题头疼半...
- 如何设计一个支持百万级实时数据推送的WebSocket集群架构?
-
面试解答:要设计一个支持百万级实时数据推送的WebSocket集群架构,需从**连接管理、负载均衡、水平扩展、容灾恢复**四个维度切入:连接层设计-**长连接优化**:采用Netty或Und...
- Redis数据结构总结——面试最常问到的知识点
-
Redis作为主流的nosql存储,面试时经常会问到。其主要场景是用作缓存,分布式锁,分布式session,消息队列,发布订阅等等。其存储结构主要有String,List,Set,Hash,Sort...
- skynet服务的缺陷 lua死循环
-
服务端高级架构—云风的skynet这边有一个关于云风skynet的视频推荐给大家观看点击就可以观看了!skynet是一套多人在线游戏的轻量级服务端框架,使用C+Lua开发。skynet的显著优点是,...
- 七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得
-
前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...
- mysql mogodb es redis数据库之间的区别
-
1.MySQL应用场景概念:关系型数据库,基于关系模型,使用表和行存储数据。优点:支持ACID事务,数据具有很高的一致性和完整性。缺点:垂直扩展能力有限,需要分库分表等方式扩展。对于复杂的查询和大量的...
- redis,memcached,nginx网络组件
-
1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...
- SpringBoot+Vue+Redis实现验证码功能
-
一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis...
- AWS MemoryDB 可观测最佳实践
-
AWSMemoryDB介绍AmazonMemoryDB是一种完全托管的、内存中数据存储服务,专为需要极低延迟和高吞吐量的应用程序而设计。它与Redis和Memcached相似,但具有更...
- 从0构建大型AI推荐系统:实时化引擎从工具到生态的演进
-
在AI浪潮席卷各行各业的今天,推荐系统正从幕后走向前台,成为用户体验的核心驱动力。本文将带你深入探索一个大型AI推荐系统从零起步的全过程,揭示实时化引擎如何从单一工具演进为复杂生态的关键路径。无论你是...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
Java SE Development Kit 8u441下载地址【windows版本】
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
Oracle如何创建用户,表空间(oracle19c创建表空间用户)
-
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis结构 (53)
- redis 订阅 (54)
- redis 登录 (62)
- redis 面试 (58)
- redis问题 (54)
- 阿里 redis (67)
- redis的缓存 (57)
- lua redis (59)
- redis 连接池 (64)