Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败问题
1、问题:在Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败,一直报私有IP连接失败
14 14:57:49.180 WARN 22012 --- [ioEventLoop-6-4] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6384]: connection timed out: /192.168.0.19:6384
2020-08-14 14:57:49.180 WARN 22012 --- [ioEventLoop-6-3] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6383]: connection timed out: /192.168.0.19:6383
2020-08-14 14:57:49.182 WARN 22012 --- [ioEventLoop-6-2] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6382]: connection timed out: /192.168.0.19:6382
2020-08-14 14:57:49.182 WARN 22012 --- [ioEventLoop-6-1] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6381]: connection timed out: /192.168.0.19:6381
2020-08-14 14:57:49.190 WARN 22012 --- [ioEventLoop-6-1] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6385]: connection timed out: /192.168.0.19:6385
2020-08-14 14:57:49.191 WARN 22012 --- [ioEventLoop-6-2] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6386]: connection timed out: /192.168.0.19:6386
2020-08-14 14:57:59.389 WARN 22012 --- [ioEventLoop-6-3] i.l.core.cluster.RedisClusterClient : connection timed out: /192.168.0.19:6382
2020-08-14 14:58:09.391 WARN 22012 --- [ioEventLoop-6-4] i.l.core.cluster.RedisClusterClient : connection timed out: /192.168.0.19:6381
2020-08-14 14:58:19.393 WARN 22012 --- [ioEventLoop-6-1] i.l.core.cluster.RedisClusterClient : connection timed out: /192.168.0.19:6383
2020-08-14 14:58:29.396 WARN 22012 --- [ioEventLoop-6-2] i.l.core.cluster.RedisClusterClient : connection timed out: /192.168.0.19:6384
2020-08-14 14:58:39.399 WARN 22012 --- [ioEventLoop-6-3] i.l.core.cluster.RedisClusterClient : connection timed out: /192.168.0.19:6386
2020-08-14 14:58:49.402 WARN 22012 --- [ioEventLoop-6-4] i.l.core.cluster.RedisClusterClient : connection timed out: /192.168.0.19:6385
2、配置文件
创建6个配置文件:redis-6381.conf,redis-6382.conf,redis-6383.conf,redis-6384.conf,redis-6385.conf,
redis-6386.conf。配置文件内容如下:
# 配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改#默认是 protected-mode yes,即开启保护模式, no=关闭
#在redis的配置文件中会遇到protected-mode,它直译为保护模式。
#如果设置为yes,那么只允许我们在本机的回环连接,其他机器无法连接。
#线上Redis服务,为了安全,我们建议将protected-mode设置为yes。
#protected-mode设置为yes的情况下,为了我们的应用服务可以正常访问Redis,我们需要设置Redis的bind参数或者密码参数#requirepass。
protected-mode yes
#端口号
port 6381
# IP绑定,redis不建议对公网开放,这里绑定了服务器私网IP及环回地址
bind 192.168.0.19 127.0.0.1
requirepass 123456
# redis数据文件存放的目录
dir /redis/workdata
# 日志文件
logfile "/redis/logs/cluster-node-6381.log"
# 开启AOF
appendonly yes
#后台启动
daemonize yes # 开启集群
cluster-enabled yes
# 集群持久化配置文件,内容包含其它节点的状态,持久化变量等,会自动生成在上面配置的dir目录下
cluster-config-file cluster-node-6381.conf
# 集群节点不可用的最大时间(毫秒),如果主节点在指定时间内不可达,那么会进行故障转移
cluster-node-timeout 5000
3、springboot集成redis集群有以下配置,二选一:
1:代码配置
@Configuration
public class RedisClusterConfig {@Beanpublic RedisConnectionFactory redisConnectionFactory() {// 客户端读写分离配置LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder().readFrom(ReadFrom.REPLICA_PREFERRED).build();RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList("42.192.119.238:6381","42.192.119.238:6382","42.192.119.238:6383","42.192.119.238:6384","42.192.119.238:6385","42.192.119.238:6386"));return new LettuceConnectionFactory(redisClusterConfiguration, clientConfig);}
}
2:yml 配置
#集群模式
spring:redis:cluster:max-redirects: 3nodes:- 42.192.119.238:6381- 42.192.119.238:6382- 42.192.119.238:6383- 42.192.119.238:6384- 42.192.119.238:6385- 42.192.119.238:6386database: 0
# host: 42.192.119.238
# port: 6380password: timeout: 5000s #连接超时时长# 连接池最大连接数(使用负值表示没有限制)jedis:pool:max-active: 8 #连接池最大连接数量,负数表示无限,默认为8max-idle: 8 #连接池最大空闲数量,默认8min-idle: 0 #连接池最小空闲数量,默认0
4、解决链接报错问题
让Redis暴露公网IP其实在redis.conf配置文件里是能找到的,这里我们可以手动指定Redis的公网IP、端口以及总线端口(默认服务端口加10000)。
手动指定了公网ip后,Redis集群中的节点会通过公网IP进行通信,也就是外网访问。因此相关的总线端口,如下面的16381等总线端口必须在云服务器中的安全组中放开
# 配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改#默认是 protected-mode yes,即开启保护模式, no=关闭
#在redis的配置文件中会遇到protected-mode,它直译为保护模式。
#如果设置为yes,那么只允许我们在本机的回环连接,其他机器无法连接。
#线上Redis服务,为了安全,我们建议将protected-mode设置为yes。
#protected-mode设置为yes的情况下,为了我们的应用服务可以正常访问Redis,我们需要设置Redis的bind参数或者密码参数#requirepass。
protected-mode yes
#端口号
port 6381
# IP绑定,redis不建议对公网开放,这里绑定了服务器私网IP及环回地址
bind 192.168.0.19 127.0.0.1
requirepass 123456
# redis数据文件存放的目录
dir /redis/workdata
# 日志文件
logfile "/redis/logs/cluster-node-6381.log"
# 开启AOF
appendonly yes
#后台启动
daemonize yes # 开启集群
cluster-enabled yes
# 集群持久化配置文件,内容包含其它节点的状态,持久化变量等,会自动生成在上面配置的dir目录下
cluster-config-file cluster-node-6381.conf
# 集群节点不可用的最大时间(毫秒),如果主节点在指定时间内不可达,那么会进行故障转移
cluster-node-timeout 5000# 云服务器上部署需指定公网ip
cluster-announce-ip 42.192.119.238
# Redis总线端口,用于与其它节点通信
cluster-announce-bus-port 16381
根据以上配置修改每一个redis节点的配置,注意端口不能相同
在src 目录下执行命令:
./redis-cli -c -p 6381 -h 192.168.0.19 -a 123456 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
6297ab04ff4bbfcad778b80315619defc2f6e513 42.192.119.238:6382@16382 master - 0 1696924087000 2 connected 5461-10922
19d3955d4bacd04892c13e7a05e13c7744085896 42.192.119.238:6381@16381 myself,master - 0 1696924087000 1 connected 0-5460
3a21d6c05255229741593340a781affbdcad6236 42.192.119.238:6385@16385 slave df0858e942b03f5b3c848d1acb2a4fde1f70e290 0 1696924088000 3 connected
546c8528a07abee29a1e383a3130d4f306447f0e 42.192.119.238:6386@16386 slave 19d3955d4bacd04892c13e7a05e13c7744085896 0 1696924086000 1 connected
56b730c5631515b2359bbf9b6d4306460da8502c 42.192.119.238:6384@16384 slave 6297ab04ff4bbfcad778b80315619defc2f6e513 0 1696924088460 2 connected
df0858e942b03f5b3c848d1acb2a4fde1f70e290 42.192.119.238:6383@16383 master - 0 1696924089469 3 connected 10923-16383
可以发现,各节点暴露的IP全是公网IP了。
5、故障转移期间Lettuce客户端连接问题
解决方式:
1、yml指定使用jedis
2、代码配置
1)、更换Redis客户端
@Configuration
public class RedisClusterConfig {@Beanpublic RedisConnectionFactory redisConnectionFactory() {RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList("42.192.119.238:6381","42.192.119.238:6382","42.192.119.238:6383","42.192.119.238:6384","42.192.119.238:6385","42.192.119.238:6386"));return new JedisConnectionFactory(redisClusterConfiguration);}
}
参考链接:
https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster
https://github.com/lettuce-io/lettuce-core/wiki/Client-options#cluster-specific-options
2)、更改实现配置
@Configuration
public class RedisClusterConfig {@Beanpublic RedisConnectionFactory redisConnectionFactory() {// 开启自适应集群拓扑刷新和周期拓扑刷新,不开启相应槽位主节点挂掉会出现服务不可用,直到挂掉节点重新恢复ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder().enableAllAdaptiveRefreshTriggers() // 开启自适应刷新,自适应刷新不开启,Redis集群变更时将会导致连接异常.adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30)) //自适应刷新超时时间(默认30秒),默认关闭开启后时间为30秒.enablePeriodicRefresh(Duration.ofSeconds(20)) // 默认关闭开启后时间为60秒 .build();ClientOptions clientOptions = ClusterClientOptions.builder().topologyRefreshOptions(clusterTopologyRefreshOptions).build();// 客户端读写分离配置LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder().clientOptions(clientOptions).build();RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList("42.192.119.238:6381","42.192.119.238:6382","42.192.119.238:6383","42.192.119.238:6384","42.192.119.238:6385","42.192.119.238:6386"));return new LettuceConnectionFactory(redisClusterConfiguration, clientConfig);}
}
参考文档:https://developer.aliyun.com/article/1167633
相关文章:
Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败问题
1、问题:在Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败,一直报私有IP连接失败 14 14:57:49.180 WARN 22012 --- [ioEventLoop-6-4] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6384]: connection …...
解决方案 | 法大大电子签精准击破销售场景签约难题
新商业形态及新交易模式不断涌现,电子签已经成为现代商业活动中不可或缺的一部分。特别是在销售场景中,电子签的应用不仅可以提高销售效率,还可以降低成本,提高客户满意度。本文将详细分析电子签在销售场景中的应用价值能力&#…...
ARM按键中断控制事件
设置按键中断,按键1按下,LED亮,再按一次,灭按键2按下,蜂鸣器响。再按一次,不响按键3按下,风扇转,再按一次,风扇停 src/key_it.c #include"key_it.h" //GPIO初…...
微信小程序之本地生活(九宫格)
文章目录 一.创建项目二.配置修改json三.编写WXML四.编写WXSS五.最终效果 一.创建项目 创建新的项目,名称为:本地生活 二.配置修改json 在app.json中删除其他页面 将index改为grid 自动生成新的文件 添加自己的轮播图片 源代码: <!--…...
【Linux 安装Kibana 及 Es 分词器安装】
一、客户端Kibana安装 Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。参考文档 1. 下载并解压缩Kibana 下载路径 选择的版本是和 ElasticSearch 对应(7.17.3) 下载后上传到Linux 系统中,并放在 /root/ 下&a…...
python-arima模型statsmodels库实现-有数据集(续)-statsmodels-0.9.0版本
python-arima模型statsmodels库实现-有数据集(续) 这篇博客是上一篇python-arima模型statsmodels库实现的续集,上一篇采用的statsmodels版本应该要高一点,如果使用低版本的statsmodels代码会有bug,这一篇则是针对stat…...
JVM源码剖析之线程的创建过程
说在前面: 对于Java线程的创建这个话题,似乎已经被"八股文"带偏~ 大部分Java程序员从"八股文"得知创建Java线程有N种方式,比如new Thread、new Runnable、Callable、线程池等等~ 而笔者写下这篇文…...
ansible的介绍安装与模块
目录 一、ansible简介 二、ansible特点 三、Ansible核心组件与工作原理 1、核心组件 2、工作原理 四、ansible的安装 五、ansible 命令行模块 1.command 模块 2.shell 模块 3.cron 模块 4.user 模块 5.group 模…...
el-form简单封装一个列表页中的搜索栏
父组件如何使用 代码中注释很多, 应该很容易理解 <template><div><wgySearchv-model"searchDefault":fields"searchFields"reset"reset"submit"submit"><!-- 通过 slot 自定义的组件 传啥都行 --><te…...
【Python 2】列表 模式匹配 循环 dict set 可变对象与不可变对象
Python内置的一种数据类型是列表:list 变量classmates就是一个list。用len()函数可以获得list元素的个数 用索引来访问list中每一个位置的元素 当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界…...
深度学习—cv动物/植物数据集
文章目录 动物相关植物相关 动物相关 Edinburgh Pig Behavior Video Dataset:https://homepages.inf.ed.ac.uk/rbf/PIGDATA/ WLD 动物目标检测数据集: https://github.com/hellock/WLD 猪脸识别:https://blog.51cto.com/u_15404184/5289690 AFD动物面部数据集&…...
高效团队协作软件推荐:提升工作效率的优选方案!
使用团队协作软件有什么好处?可以摆脱过时的电子表格,有了单一的真实来源,您可以随时检查任何任务并获得可用的最新信息。 一目了然地查看所有正在进行的工作,看板式面板、甘特图和燃尽图等可视化工具可让您随时轻松获得项目的高级…...
Mac中使用virtualenv和virtualenvwrapper
Virtualenv 介绍 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题;亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。 因此,我们需要对于不同的工程使…...
wpf webBrowser控件 常用的函数和内存泄漏问题
介绍 WebBrowsers可以让我们在窗体中进行导航网页。 WebBrowser控件内部使用ie的引擎,因此使用WebBrowser我们必须安装ie浏览器(windows默认安装的)。 使用 直接在xmal中使用webBrowser控件 <WebBrowser x:Name"WebBrowser1"…...
AI游戏设计的半年度复盘;大模型+智能音箱再起波澜;昇思大模型技术公开课第2期;出海注册经验分享;如何使用LoRA微调Llama 2 | ShowMeAI日报
👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 进步or毁灭:Nature 调研显示 1600 科学家对AI的割裂态度 国际顶级期刊 Nature 最近一项调研很有意思,全球 160…...
多线程 - 锁策略 CAS
常见的锁策略 此处谈到的锁策略,不局限于 Java,C,Python,数据库,操作系统……但凡是涉及到锁,都是可以应用到下列的锁策略的 乐观锁 vs 悲观锁 锁的实现者,预测接下来锁冲突(锁竞争,两个线程针对一个对象加锁,产生阻塞等待了)的概率是大,还是不大,根据这个冲突的概率,来接下…...
VP记录——The 2021 CCPC Weihai Onsite
网址 2021CCPC威海 赛时过题与罚时 A.Goodbye, Ziyin! 签到题,队友写的 #include<bits/stdc.h> using namespace std; int cnt[10], de[1000010]; int main() {int n;cin >> n;for(int i 1; i < n; i) {int u, v;scanf("%d %d", &…...
JavaWeb---Servlet
1.Srvlet概述 Servlet是运行在java服务器端的程序,用于接收和响应来着客户端基于HTTP协议的请求 如果想实现Servlet的功能,可以通过实现javax。servlet。Servlet接口或者继承它的实现类 核心方法:service()…...
英语——方法篇——单词——谐音法+拼音法——50个单词记忆
theatre,剧场,太后th吃eat热re食物,就去剧场了 loud dolphin,做do脸皮厚plh在。。。里 humid,hu湖mi米d的 blender,b爸lend借给er儿。 tragedy,tr土人...
35道Rust面试题
这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 ,下面哪个是打印变量language的正确方法? A,println("{}", language); B,println(language); C,println!("{}", langu…...
开源流程编排引擎FlowCue:基于DAG与事件驱动的自动化工作流实践
1. 项目概述:FlowCue是什么,以及它为何值得关注如果你是一名开发者,尤其是经常和API、数据流、自动化任务打交道的后端或全栈工程师,那么你肯定对“流程编排”这个概念不陌生。简单来说,就是把一系列独立的操作&#x…...
从零实现神经网络:前向传播、反向传播与梯度下降原理详解
1. 项目概述:从“黑箱”到“白箱”的探索之旅“人工神经网络”这个词,听起来总带着点科幻和神秘色彩,仿佛一个能自己思考的“黑箱”。很多刚接触的朋友,包括几年前的我,都曾被它吓住——又是矩阵运算,又是梯…...
数字电路跨时钟域信号传输:从亚稳态到同步器设计实践
1. 跨时钟域信号传输:从亚稳态到可靠同步在数字芯片和FPGA设计中,只要系统里存在多个时钟,就绕不开跨时钟域(CDC)信号传输这个经典问题。这可不是什么高深莫测的理论,而是每个硬件工程师在画第一块板子、写…...
CTP接口实战:从零构建量化交易系统(附完整源码)
1. CTP接口入门:量化交易的第一块基石 第一次接触CTP接口时,我盯着那堆C代码发呆了半小时——这玩意儿比我想象的复杂多了。后来才发现,其实把它理解成期货市场的普通话就简单了。就像我们用普通话跟人交流,程序用CTP接口跟期货交…...
Taotoken Token Plan套餐在实际开发中的成本控制体感
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken Token Plan套餐在实际开发中的成本控制体感 1. 套餐选择与预算锚定 在项目开发初期,团队或个人开发者面临的…...
僧伽罗文语音本地化迫在眉睫!斯里兰卡新《数字服务法》2024年10月生效前,你必须掌握的7项ElevenLabs合规配置
更多请点击: https://intelliparadigm.com 第一章:僧伽罗文语音本地化的法律动因与技术紧迫性 斯里兰卡《官方语言法》(No. 33 of 1956)及2023年修订的《国家数字包容战略》明确要求:所有面向公众的政府数字服务必须支…...
天地协同:卫星如何成为5G物联网“组合拳”的关键一环
未来的物联网连接格局并非“卫星取代地面”或“地面压制卫星”的零和博弈,而是一个基于场景需求、优势互补的“组合式”解决方案。卫星连接的价值在于补充和增强更广泛的连接组合,与5G等地面蜂窝网络协同工作,共同构建一张无处不在、经济高效…...
番茄小说下载器:从网页到电子书的完整离线阅读解决方案
番茄小说下载器:从网页到电子书的完整离线阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 番茄小说下载器是一款基于Rust语言开发的开源工具ÿ…...
如何快速上手小米手表表盘设计:免费工具Mi-Create的终极指南
如何快速上手小米手表表盘设计:免费工具Mi-Create的终极指南 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 还在为小米手表找不到心仪的表盘而烦恼…...
网易云音乐增强脚本架构解析:基于用户脚本技术的云音乐生态扩展方案
网易云音乐增强脚本架构解析:基于用户脚本技术的云音乐生态扩展方案 【免费下载链接】myuserscripts 网易云音乐油猴脚本:歌曲下载、转存云盘、云盘歌曲快传、云盘匹配纠正... 项目地址: https://gitcode.com/gh_mirrors/my/myuserscripts 项目愿景与价值主张…...
