Spring Boot 集成 Redis 三种模式实践汇总

背景

项目的某个模块集成了 SpringBoot Redis 包,客户端使用 Lettuce,Redis 测试环境单机模式。但是现场反馈的 Redis 环境是集群,如果简单的修改 spring.redis 配置为集群的配置信息,程序能否能无缝衔接呢?

本文记录这个问题的验证过程:

  1. 集群配置和单机配置,直接改配置,Redis 操作是否正常?「可以」。
  2. 同时配置单机和集群信息,哪个配置会优先呢?「集群优先」。
  3. 集群模式下,主备份切换过程中,程序能否自动找到新的主节点正常读写呢?「Jedis 客户端可以,Luttcue 需要改造」
  4. 温故一下 Redis 的三种多节点部署方案及其优缺点。

基础准备

第一,Redis 客户端种类, Jedis 、Lettuce 、Redisson,本文选择的是 Lettuce 。

第二,Redis 版本选择 6.2.13,在目标主机上编译完成后并安装:

  1. 下载 6.2.13 版本,上传服务器。
  2. 解压,执行编译命令:make
  3. 安装,指定安装目录:make install PREFIX=/usr/local/redis6.2.13

第三,Redis 高可用部署方式有三种:

  1. 主从模式,出现故障需要人工干预;主节点可以读写,从节点只能读不能写。
  2. 哨兵模式,是对主从的高可用改进,哨兵监控集群状态,出现故障自动处理。
  3. 集群模式,Redis 的分布式方案,数据分散在多个节点上,无中心的。连接从节点执行写入操作,会自动重定向到主节点完成写入。

集群环境搭建

首先,要注意,6.2.13 版本的集群部署后,会占据两个端口,一个是 Redis 的通信端口,是配置文件中配置的 port 值,另一个是集群通信端口,port + 1000 ,所以集群配置时需要注意端口,配置小一点,否则总会莫名其秒端口被占用。

例如,我最初设计的集群各节点的端口是 16793,26793,36793,结果启动的时候总有几个节点启动时端口被其他 Redis 进程占据了。

其次,由于资源有限,在一台主机上,部署三主三从6个 Redis 实例。选择节点从 7000 到 7005 ,搭建集群。

  1. 进入安装目录 /usr/local/redis6.2.13,按实例端口创建文件夹 mkdir 7000。
  2. 到 Redis 源码文件夹下,拷贝一个标准配置文件 redis.conf 到 7000 中。
  3. 编辑 redis.conf 修改跟集群配置相关的几项信息。
bind 0.0.0.0
daemonize yes
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
pidfile /var/run/redis_7000.pid
logfile /usr/local/redis6.2.13/7000/7000.log
dbfilename 7000.rdb

接着,继续创建其他 5 个节点配置文件:

  1. 以 7000 目录 为基础,拷贝:cp -r 7000 7001,编辑 7001/redis.conf , 命令模式下执行字符串替换操作::%s/7000/7001 替换所有的 7000 。
  2. 以此拷贝出 7002-7005 个配置文件。
  3. 启动节点:进入 bin 目录下 redis-server ../7000/redis.conf 依次启动全部节点。

最后一步,使用 redis-cli 客户端创建集群:./redis-cli --cluster create 192.168.xx:7000 192.168.xx:7001 192.168xx:7002 192.168.xx:7003 192.168.xx:7004 192.168.xx:7005 --cluster-replicas 1

一路 yes ,耐心等待集群创建完成,查看集群节点进程:
在这里插入图片描述
查看某个 Redis 节点的进程端口,可以看到一个 Redis 进程启动了两个端口。因为每个Redis集群中的节点都需要打开两个TCP连接,一个连接用于正常的给Client提供服务,比如 6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,参考该文 《Redis 集群节点启动的两个端口说明》。

参考网上 5.x 版本的部署方案,只有一个端口,可能 6 的版本跟 5 的有差距吧。

验证集群配置

当前应用直接改配置,是否支持集群?

直接修改应用的 redis 配置信息,添加集群配置:

spring:redis:password: x  #密码lettuce:  #lettuce连接池配置pool:max-active: 8max-idle: 8min-idle: 0max-wait: 1000shutdown-timeout: 100cluster:  #集群配置max-redirects: 3nodes: # 配置 - 间隔一个好像也没报错呢。- 192.168.x:7000- 192.168.x:7001- 192.168.x:7002- 192.168.x:7003- 192.168.x:7004- 192.168.x:7005

启动应用,执行 Redis 操作正确,说明直接用框架的自动注入,是支持集群的

集群主节点故障验证

登录 7000 节点,使用 cluster nodes 查看集群节点,找到一个 master 节点的端口号,登录该主节点后,shutdown 命令停掉该主节点。

引用 Redis 集群的程序在获取 RedisConnection 时出现了超时异常,而且即使主节点恢复了,程序依旧报错,这就涉及到了 《Lettuce 客户端的另外一个坑》。

因为不确定到底使用 Redis 集群还是单机,所以对 Lettuce 自动刷新集群拓扑图配置类注入使用一个开关参数控制,如果是集群,就可以保证集群变更时,客户端实时感知了。

从执行日志来看,无论我停止那个主节点,应用都会报该节点连接异常,继续重试。

DefaultClusterTopologyRefresh  : Unable to connect to [192.168.x:7005]: connection timed out: /192.168.x:7005

猜测应该是这个定时刷新任务会对配置的集群节点逐个轮训发送数据判断是否可达吧。

配置优先级

同时配置 host 和 cluster 会怎么样?

集群模式下,只配置一个 host 单机配置,会报错,因为有些请求会产生 moved 或者重定向等问题。同时配置单机节点和集群,集群优先。

判断依据:停掉一个集群主节点后,后台开始刷新重连接尝试,应用正常运行。

集群模式下的读写操作

./redis-cli -h 192.168.X -p 7000 -c

Redis 自带的客户端,-c 这个参数代表集群模式,集群模式下,如果连接从节点,执行写入操作,会自动重定向到主节点完成写入:
在这里插入图片描述
不带 -c 参数,会提示一个 moved 地址,需要手动转到该地址执行写入操作:
在这里插入图片描述

启示录

集群模式跟主备模式不同,不同节点上执行 keys 的时候,并不是所有节点都有相同的数据。因为集群的本质就是数据分散存储,并不是每个节点上都存储了全部的数据的。

验证完本文这个问题后,把《Redis 开发与运维》这本书拿出来翻了翻,全忘光了。脑子不够用了,还是手动敲一遍,作为笔记留存吧!

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

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

相关文章

音视频——帧内预测

H264编码(帧内预测) 在帧内预测模式中,预测块P是基于已编码重建块和当前块形成的。对亮度像素而言,P块用于44子块或者1616宏块的相关操作。44亮度子块有9种可选预测模式,独立预测每一个44亮度子块,适用于带有大量细节的图像编码&…

HTTPS简介

一、简介与原理 http协议是明文传输的,因此很容易被截取和解析,泄漏个人数据。https协议是在http和tcp之间多添加了一层,进行身份验证和数据加密。 HTTPS 原理 ① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器 ②…

Gempy三维结构地质建模简明教程

Gempy 是一个开源 Python 库,用于生成完整的 3D 结构地质模型。 该库是一个完整的开发,用于从界面、断层和层方向创建地质模型,它还关联地质层的顺序以表示岩石侵入和断层顺序。 推荐:用 NSDT设计器 快速搭建可编程3D场景。 地质建…

LLaMA2可商用|GPT-4变笨|【2023-0723】【第七期】

一、大咖观点: 傅盛:ChatGPT时代如何创业 - BOTAI - 博客园Google 已经被OpenAI 超越了吗?| AlphaGo 之父深度访谈《人民日报》:大模型的竞争,是国家科技战略的竞争WAIC 2023 | 张俊林:大语言模型带来的交…

Node.js:execSync执行一个shell命令

默认输出是Buffer对象 const { execSync } require(child_process)let out execSync("echo hi") console.log(out); // <Buffer 68 69 0a>需要转为字符串 const { execSync } require(child_process)let out execSync("echo hi") console.log(…

设计模式之状态模式

状态决定行为。由于状态在运行期间是可以被改变的。在VoteManager类中根据条件来创建不同的状态实现类&#xff0c;于是到最后就会调用不同的逻辑。 看起来同一个对象&#xff0c;在不同的运行时刻&#xff0c;行为是不一样的&#xff0c;就像是类被修改了一样&#xff01; 场…

labview 信号量实现互斥 避免竞争写

上一篇文章中描述了事件发生、集合点、通知器、信号量。 本文进一步举例描述信号量实现互斥&#xff0c;避免竞争写。 1.不用信号量的例子 图1-不用信号量的结果都不同&#xff0c;不为0 图2-不用信号量的例子&#xff0c;程序框图 2.用信号量的例子 图3-用信号量的例子&…

结构型设计模式之亨元模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

Unity中使用CSV文件作为关卡数据

要在Unity中使用CSV文件作为关卡数据&#xff0c;并在通关后导入下一关的CSV文件数据&#xff0c;你可以按照以下步骤进行操作&#xff1a; 创建一个空的游戏对象&#xff0c;将其命名为"LevelManager"。 在"LevelManager"对象上创建一个C#脚本&#xff0…

MySQL 主从复制的认识 2023.07.23

一、理解MySQL主从复制原理 1、概念&#xff1a;主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 2、作用&#xff1a;灾备、数据分布、负载平衡、读写分离、提高并发能力 3、原理图 4、具体步骤 (1) M…

Go 工具链详解(四): Golang环境变量设置和查看工具 go env

go env 作用 go env 是 Go 工具链中的一个命令&#xff0c;用于设置和查看当前 Golang 环境的相关信息&#xff0c;对于理解、编译和运行 Golang 程序非常有用。 go 提供的命令及 go 程序的编译运行都会使用到环境变量&#xff0c;如果未设置对应的环境变量&#xff0c;go 则…

Windows nvm 安装后webstrom vue项目编译报错,无法识别node

1 nvm安装流程 卸载原先nodejs用管理员权限打开exe安装nvmnvm文件夹和nodejs文件夹 都授权Authenticated Users 完全控制nvm list availablenvm install 16.20.1nvm use 16.20.1输入node和npm检查版本命令&#xff0c;正常显示确认系统变量和用户变量都有nvm 和nodejs 2 bug情…

Springboot @Async 多线程获取返回值

Springboot Async 多线程获取返回值 需求背景 最近需要用到多线程, 自己维护线程池很麻烦, 正好看到Springboot集成线程池的例子, 这里自己做了个尝试和总结, 记录一下, 也分享给需要的朋友; 不考虑事务的情况下, 这个多线程实现比较简单, 主要有以下几点: 在启动类加上Enab…

iTOP-RK3568开发板Docker 安装 Ubuntu 18.04

Docker 下载安装 Ubuntu18.04&#xff0c;输入以下命令&#xff1a; sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04&#xff0c;输入以下命令&#xff1a; docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数&#xff1a;容器的…

Ftp和UDP的区别之如何加速文件传输

FTP&#xff08;文件传输协议&#xff09;是一种传输大文件的老方法&#xff0c;它的速度慢&#xff0c;而且容易受到网络环境的影响。在当今这个文件越来越大&#xff0c;项目交付时间越来越紧&#xff0c;工作分布在全球各地的时代&#xff0c;有没有办法让 FTP 加速呢&#…

大数据课程D2——hadoop的概述

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解hadoop的定义和特点&#xff1b; ⚪ 掌握hadoop的基础结构&#xff1b; ⚪ 掌握hadoop的常见命令&#xff1b; ⚪ 了解hadoop的执行流程&#xff1b; 一、简介 1…

Java: Hutool工具包

1.IO相关的工具类 IoUtil &#xff1a; 流操作工具类Fileutil &#xff1a; 文件读写和操作的工具类FileTypeUtil &#xff1a;文件类型判断工具类watchMonitor &#xff1a; 目录、文件监听classPathResource &#xff1a; 针对ClassPath中资源的访问封装FileReader &#xf…

adnroid 11. 0 Activity启动流程图解

从Launcher到ActivityTaskManager 从ActivityTaskManagerService 到 ApplicationThread 从ApplicationThread到onCreate

Java三大特性,设计的五大原则的理解

Java三大特性分别是封装&#xff0c;继承&#xff0c;多态。 下面谈谈我对这三个特性的理解&#xff1a; 1.封装 指的是将类的成员变量(属性)和成员方法(方法)隐藏起来&#xff0c;通过使用访问修饰符(如private、public、protected等)来限制外部对类的直接访问&#xff0c;从而…

全面解析 SOCKS5 代理和 HTTP 代理在网络安全与爬虫应用中的技术对比与应用指南

一、SOCKS5 代理和 HTTP 代理的基本原理 SOCKS5 代理&#xff1a;SOCKS5 是一种网络协议&#xff0c;可以在传输层代理 TCP 和 UDP 请求。它不解析请求内容&#xff0c;仅在客户端和代理服务器之间建立连接&#xff0c;并转发数据。SOCKS5 代理支持众多网络协议和端口类型&…