Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败问题

这篇具有很好参考价值的文章主要介绍了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 {

  @Bean
  public 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: 3
      nodes:
        - 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
    database: 0
#    host: 42.192.119.238
#    port: 6380
    password: 
    timeout: 5000s #连接超时时长
    # 连接池最大连接数(使用负值表示没有限制)
    jedis:
      pool:
        max-active: 8 #连接池最大连接数量,负数表示无限,默认为8
        max-idle: 8 #连接池最大空闲数量,默认8
        min-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 {

  @Bean
  public 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 {

  @Bean
  public 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文章来源地址https://www.toymoban.com/news/detail-788688.html

到了这里,关于Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IP地址的公网和私网的划分范围

    IP地址分为公网地址和私网地址、IP地址分为5类 A类:地址范围1.0.0.0~127.255.255.255,主要分配给主机数量多、局域网数量少的大型网络; B类:地址范围为128.0.0.0至191.255.255.255,一般为国际大公司及政府机构使用; C类:地址范围为192.0.0.0至223.255.255.255,为一般小型公司校园网研究机构

    2024年02月12日
    浏览(40)
  • 阿里云服务器IP地址查询方法(公网IP和私网IP)

    阿里云服务器IP地址在哪查看?在云服务器ECS管理控制台即可查看,阿里云服务器IP地址包括公网IP和私有IP地址,阿里云百科分享阿里云服务器IP地址查询方法: 目录 阿里云服务器IP地址查询 1、登录到阿里云服务器ECS管理控制台 2、在“实例与镜像”–“实例”中,找到当前

    2024年02月04日
    浏览(48)
  • 计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)

    文章目录 一:静态路由和动态路由 二:静态路由的配置路由信息的方式演示 三:默认路由 四:公网IP和私网IP和NAT技术的基本理解 在说静态路由和动态路由前,我们需要来了解一下,如下网络, 如何让各个计算机之间能够进行通信!! 首先观察计算机0和计算机1的通信情况

    2024年02月14日
    浏览(42)
  • 已知IP地址和子网掩码求最小IP和最大IP、公网IP和私网IP的概念

    1、已知IP地址和子网掩码求最小IP和最大IP 最小IP = 网络号 + 1 最大IP = 广播地址 - 1   首先要通过IP地址和子网掩码求得该网络的网络号以及广播地址,然后才能求出最小IP和最大IP。不知道如何求网络号和广播地址的,可以看我的这篇文章: 由ip地址和子网掩码求网络号、主

    2024年02月06日
    浏览(38)
  • springboot如何集成redis哨兵集群?

    redis主从集群和redis sentinel集群都配置完毕了, 现在我们需要了解spring boot 如何连接上该集群 才能用上这两个集群带来的便利 为什么需要关注这个问题? 怎么配置? 记住. 本章是针对redis已经配置了主从集群和哨兵集群的, 而非cluster集群模式 没有 Redis Sentinel 架构之前,如果主节

    2024年02月09日
    浏览(57)
  • Redis主从复制、哨兵模式、集群模式的搭建与springboot集成

    Redis有三种模式:分别是主从同步/复制、哨兵模式、Cluster 主从复制 :主从复制是高可用Redis的基础,哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单故障恢复。 缺陷:故障恢复无法自动化,写操作无

    2024年02月02日
    浏览(49)
  • SpringBoot Redis 多数据源集成支持哨兵模式和Cluster集群模式

    大家都知道Redis在6.0版本之前是单线程工作的,这导致在一个项目中有大量读写操作的情况下,Redis单实例的性能被其他业务长时间占据,导致部分业务出现延迟现象,为了解决这个问题,部分公司项目选择使用多个Redis实例分别存储不同的业务数据和使用场景,比如IoT网关写

    2024年02月15日
    浏览(43)
  • 搭建redis主从,哨兵配置,集成到springboot中配置读写分离

    文章介绍Ubuntu系统搭建redis,并完成主从的读写分离配置,为主节点搭建三台哨兵服务,并集成到springboot中。 本篇文章是通过其他优秀博文学习后,用作学习记录使用。 大佬博客: https://blog.csdn.net/Wei_Naijia/article/details/125704197 https://blog.csdn.net/lssqk/article/details/127220990 1.Ubunt

    2024年02月09日
    浏览(46)
  • springboot(spring)整合redis(集群)、细节、底层配置讲解

    1.引入依赖.      其实springboot整合其他主流框架直接在后面加上名称即可,比如spring-boot-starter-redis,然后就直接可以用,可以直接注入了.      主要原因大概就是springboot框架已经包含了自动注入的功能,对于每一个引入的主要jar包(包含starter),都有一个factory的配置文件,里面配置

    2024年02月09日
    浏览(72)
  • IPv4 正则表达式(公网&私网)

    1、私有IP 转自百度百科,词条: 私有ip 私网IP也即私有IP,是在本地局域网上的IP 与之对应的是公有IP(在互联网上的IP)。随着私有IP网络的发展,为节省可分配的注册IP地址,有一组IP地址被拿出来专门用于私有IP网络,称为私有IP地址。 地址按用途分为私有地址和公有地址

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包