分布式系列教程(04) -分布式Redis缓存 (事务&主从复制&哨兵机制)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 分布式系列教程(04) -分布式Redis缓存 (事务&主从复制&哨兵机制)

代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringBoot-Redis-Demo

在上一篇博客《分布式系列教程(03) -分布式Redis缓存(二)》主要讲解了SpringBoot是如何整合Redis的。接下来主要继续讲解Redis的事务、主从复制以及哨兵机制。

本文目录结构:

l____1.Redis事务

l________1.1 SpringBoot操作Redis事务

l____2.Redis主从复制

l________2.1 主从复制过程

l________2.2 如何实现主从复制?

l____3.Redis哨兵机制

l________3.1 哨兵模式配置

l____总结


附:阅读前可以参考之前我写过的博客:

1.Redis事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务
  2. 命令入队
  3. 执行事务

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
127.0.0.1:6379> GET book-name
QUEUED
127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
127.0.0.1:6379> SMEMBERS tag
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "Programming"
   3) "C++"

1.1 SpringBoot操作Redis事务

直接贴核心代码:(Github版本:7b94bc1830ad5ffb1f0bcb41fe6c9acd9402fcc3)

public void setStringTransactoin(String key, Object object){
    stringRedisTemplate.setEnableTransactionSupport(true);
    // 开启事务
    stringRedisTemplate.multi();
    try {
        // 如果是String 类型
        String value = (String) object;
        stringRedisTemplate.opsForValue().set(key, value);
        //int i = 1/0;//如果解注释这一句,抛异常,会回滚到初始状态
    } catch (Exception e) {
        // 回滚
        stringRedisTemplate.discard();
    } finally {
        // 提交
        stringRedisTemplate.exec();
    }
}

2.Redis主从复制

redis的复制功能是支持多个数据库之间的数据同步。

一类是主数据库(master)一类是从数据库(slave)主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据。

一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

优点:通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。

2.1 主从复制过程

1.当一个从数据库启动时,会向主数据库发送sync命令,

2.主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来

3.当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。

4.从数据库收到后,会载入快照文件并执行收到的缓存的命令。

2.2 如何实现主从复制?

1.修改从Redis服务器(slave)的 redis.conf文件

vi /usr/local/redis/etc/redis.conf  
# 修改内容:
# slaveof 192.168.162.131 6379  --- 主redis服务器ip和端口
# masterauth 123                --- 主redis服务器配置了密码,则需要配置

2.启动主Redis服务器(master),启动后,可以看到是没有任何数据的:

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a "123"
 keys *

2.启动从Redis服务器(slave),启动后,可以看到是没有任何数据的:

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a "123"
 keys *

3.现在向主Redi服务写入数据

4.从Redis服务器获取name

可以看到,slave服务器从主服务器复制内容过来了。

5.尝试向从服务器写内容,发现是不能写入的(只读),提示:(error) READONLY You can’t write against a read only slave.

3.Redis哨兵机制

Redis的哨兵(sentinel音标:[ˈsentɪnl]) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:

  • 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
  • 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。

特点:

  1. 哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。
  2. 每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的”主观认为宕机” Subjective Down,简称sdown)。
  3. 若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置。
  4. 虽然哨兵(sentinel) 释出为一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel)。
  5. 哨兵(sentinel) 的一些设计思路和zookeeper非常类似

单个哨兵(sentinel):

3.1 哨兵模式配置

接着前面的环境

Redis服务器ip 定义
192.168.162.131 主Redis服务器
192.168.162.132 从Redis服务器
192.168.162.133 哨兵服务器

首先在哨兵服务器(192.168.162.133)搭建环境,参考《分布式系列教程(02) -分布式Redis缓存(简介&安装&基础)》

继续下面操作:

1.拷贝到etc目录

cp sentinel.conf  /usr/local/redis/etc

2.修改sentinel.conf配置文件

sentinel monitor mymast  192.168.110.133 6379 1  #主节点 名称 IP 端口号 选举次数
sentinel auth-pass mymast 123

3. 修改心跳检测 30毫秒、做多多少合格节点

sentinel down-after-milliseconds mymaster 30
sentinel parallel-syncs mymaster 2

4. 启动哨兵模式,可以看到主Redis和从Redis

/usr/local/redis/bin/redis-server /usr/local/redis/etc/sentinel.conf --sentinel &

5.现在把主Redis服务器关掉

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a "123" shutdown

6.可以看到哨兵服务器控制台打印,从Redis现在晋升为master了:

7.在从Redis服务器,查看详情,可以看到现在变为master,并且有读写权限

info replication

8.启动主Redis,查看详情,可以看到主Redis变为了从Redis了:

info replication

如果还是操作失败,可以参考博文:《Sentinel 哨兵》

总结

目录
相关文章
|
2月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
203 2
|
2月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
109 0
|
24天前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
18天前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
18天前
|
监控 NoSQL Redis
Redis哨兵机制
Redis哨兵机制用于解决主从复制中主节点故障无法自动恢复的问题。通过独立进程监控主节点状态,在主节点宕机时,多个哨兵协作选举新主节点并完成故障转移,实现高可用性。哨兵机制具备监控、故障转移和通知功能,支持自动切换主从关系,但无法提升存储容量和完全避免数据丢失。
|
3月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
7月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
628 0
分布式爬虫框架Scrapy-Redis实战指南
|
3月前
|
NoSQL Redis
Lua脚本协助Redis分布式锁实现命令的原子性
利用Lua脚本确保Redis操作的原子性是分布式锁安全性的关键所在,可以大幅减少由于网络分区、客户端故障等导致的锁无法正确释放的情况,从而在分布式系统中保证数据操作的安全性和一致性。在将这些概念应用于生产环境前,建议深入理解Redis事务与Lua脚本的工作原理以及分布式锁的可能问题和解决方案。
133 8
|
5月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
322 67
|
8月前
|
NoSQL Java 中间件
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
本文介绍了从单机锁到分布式锁的演变,重点探讨了使用Redis实现分布式锁的方法。分布式锁用于控制分布式系统中多个实例对共享资源的同步访问,需满足互斥性、可重入性、锁超时防死锁和锁释放正确防误删等特性。文章通过具体示例展示了如何利用Redis的`setnx`命令实现加锁,并分析了简化版分布式锁存在的问题,如锁超时和误删。为了解决这些问题,文中提出了设置锁过期时间和在解锁前验证持有锁的线程身份的优化方案。最后指出,尽管当前设计已解决部分问题,但仍存在进一步优化的空间,将在后续章节继续探讨。
1057 131
【📕分布式锁通关指南 02】基于Redis实现的分布式锁