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

news2024/11/24 0:48:10

背景

项目的某个模块集成了 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: 8
        max-idle: 8
        min-idle: 0
        max-wait: 1000
      shutdown-timeout: 100
    cluster:  #集群配置
      max-redirects: 3
      nodes: # 配置 - 间隔一个好像也没报错呢。
        - 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.coloradmin.cn/o/795363.html

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

相关文章

Android Studio 的版本控制Git

Android Studio 的版本控制Git。 Git 是最流行的版本控制工具,本文介绍其在安卓开发环境Android Studio下的使用。 本文参考链接是:https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 一:Android Studio 中设置Git …

智安网络|实现数据安全:探索数据动态脱敏的落地策略

在当今数字化时代,数据安全成为企业和组织管理中的头等大事。然而,数据共享和数据大规模处理的需求也日益增长,这就需要在数据传输和存储过程中采取措施来保护用户的隐私。数据动态脱敏技术应运而生,为解决数据隐私和保护的问题提…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块3

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Doris(二) -通过外部表同步数据

前言 参考网址 1.官网 2.ODBC External Table Of Doris 3.Apache doris ODBC外表使用方式 第一步 创建 RESOURCE DROP RESOURCE IF EXISTS mysql_test_odbc; CREATE EXTERNAL RESOURCE mysql_test_odbc PROPERTIES ( "type" "odbc_catalog", "…

《JeecgBoot系列》 表单实现指定列导出Excel“合并单元格“

表单"合计"列导出Excel合并单元格 注解: Excel 参数:mergeVertical,参数设置为Boolean类型,默认为false。当设置为true时,可以纵向合并内容相同的单元格 1.需求 介绍:每个类别下有多个型号&…

linux免交互

免交互 指不需要人为控制就可以完成的自动化操作。 shell脚本和免交互是一个概念,但是有两种写法。shell脚本基于bash。 here Document 免交互 它是一种标准输入,只能接收正确的命令,它主要是使用i/o重定向的方式将命令的列表提供给交互式…

BFS()

目录 多源BFS 矩阵距离 最小步数模型 魔板 八数码 双端队列广搜 电路维修 双向广搜 字串变换 A* 第K短路 多源BFS 单源BFS是求一个点到起点的最短距离 多源BFS是求有很多个起点,某一点到离它最近一个起点的距离 矩阵距离 给定一个 N 行M 列的 01矩阵…

【每日一题】—— C. Tiles Comeback (Codeforces Round 888 (Div. 3))

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

FTP客户端登录报错:Login failed

FTP客户端登录报错:Login failed 是selinux的问题,一般用户无法登录用户主目录 [rootchenshuyi ~]# setsebool -P tftp_home_dir 1

Filebeat学习笔记

Filebeat基本概念 简介 Filebeat是一种轻量级日志采集器,内置有多种模块(auditd、Apache、Nginx、System、MySQL等),针对常见格式的日志大大简化收集、解析和可视化过程,只需一条命令即可。之所以能实现这一点&#…

【Go语言】Golang保姆级入门教程 Go初学者介绍chapter1

Golang 开山篇 Golang的学习方向 区块链研发工程师: 去中心化 虚拟货币 金融 Go服务器端、游戏软件工程师 : C C 处理日志 数据打包 文件系统 数据处理 很厉害 处理大并发 Golang分布式、云计算软件工程师:盛大云 cdn 京东 消息推送 分布式文…

集睿致远推出CS5466多功能拓展坞方案:支持DP1.4、HDMI2.1视频8K输出

ASL新推出的 CS5466是一款Type-C/DP1.4转HDMI2.1的显示协议转换芯片,,它通过类型C/显示端口链路接收视频和音 频流,并转换为支持TMDS或FRL输出信令。DP接收器支持81.Gbp s链路速率。HDMI输出端口可以作为TMDS或FRL发射机工作。FRL发射机符合HDMI 2.1规范…

08综合评价作业

某核心企业需要在6个待选的零部件供应商中选择一个合作伙伴,各待选供应商有关数据如表1所列,试从中选择一个最优供应商(理想解法) 评价指标产品质量产品价格/元地理位置/km售后服务/h技术水平经济效益供应能力/件市场影响度交货情况10.83326213.20.20.1…

Emacs之实现鼠标/键盘选中即拷贝外界内容(一百二十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

linux操作历史history定制

history记录 Linux中历史操作记录history是一个很有用的功能,有时忘记了,翻翻以前的命令,十分方便。 # 展示所有历史记录 history # 筛选历史记录 history | grep nginx # 清除全部记录 -c history -c # 指定删除某一行,15是行号 history -…

5-Ngnix配置基于用户访问控制和IP的虚拟主机

目录 5.1.Ngnix配置基于用户访问控制的多虚拟主机 5.1.1.前提条件 5.1.2.Ngnix配置基于用户访问控制的多虚拟主机 5.2.Ngnix配置基于IP的虚拟主机 5.3.Ngnix配置基于IP的多虚拟主机 Nginx配置文件在/usr/local/nginx/conf下,文件名为nginx.conf 5.1.Ngnix配置…

如何部署MySQL读写分离

目录 第一步 部署MySQL主从复制 第二步 导入依赖环境文件 第三步 赋权并执行 第四步 优化文件名称 第五步 修改配置文件 第六步 刷新文件并查看详细信息 第七步 安装Amoeba 第八步 配置开放权限 第九步 修改配置文件 第十步 修改配置文件内容 第十一步 修改另一个配…

排队理论简介

排队理论简介 1. 理论背景2. 研究的数学方法3. 拒绝型排队系统与等候型排队系统4. 拒绝型排队系统 本文参考文献为Вентцель Е. С.的《Исследование операций》。 1. 理论背景 排队理论又称大众服务理论,顾名思义指的是在有限的服务条…

防风固沙功能重要性评价

1.3 防风固沙功能重要性评价 1.3.1 评估模型 以生态系统防风固沙服务能力指数作为评估指标,计算公式为: 式中:Sws为防风固沙服务能力指数,NPPmean为多年植被净初级生产力平均值,K 为土壤可蚀性因子,Fq为多…

算法(1)

位运算 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 快速计算1比特数 x x&(x-1) 将数字的最后一位变成0直到x0,就可以计算出每一个数字中的1比特数。不过要求O(N) 动态规划 奇数:二进制表示中,奇数一定比前面那个偶数多一个 1&…