windows下配置redis哨兵模式的坑

windows下的哨兵模式:

本地临时搭建个哨兵模式,1主1从2哨兵,就为了追求简单

redis下的master.conf:


port 6379
bind 172.20.61.25
requirepass 123456

redis下的slave.conf:


port 6380
bind 172.20.61.25
slaveof 172.20.61.25 6379
masterauth 123456

redis下下新建2个sentinel.conf,重命名为sentinel1.conf,sentinel2.conf
sentinel1.conf的配置如下:


port 26379
sentinel myid aec78af18a33e0ae9cb0df056bfbb3a36dc90c3d
sentinel monitor mymaster 172.20.61.25 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
protected-mode no
bind 172.20.61.25

sentinel2.conf的配置如下:


port 26479
sentinel myid 3303268336b86fc62d1d4875810b77c3466bd36d
sentinel monitor mymaster 172.20.61.25 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 37
protected-mode no
bind 172.20.61.25

如果觉得2个哨兵不够,可以自行添加哨兵,增加几个sentinel.conf,配置其他都一样,
sentinel monitor mymaster 172.20.61.25 6380 1 --这个ip改成你要监听的主reds或者从redis的ip和端口就行

说个遇到的坑

我之前的master.conf,slave.conf,sentinel1.conf,sentinel2.conf的ip都是用127.0.0.1,结果

All sentinels down, cannot determine where is mymaster master is running...

或者这个错

Could not get a resource from the pool

所以windows下把master.conf,slave.conf,sentinel1.conf,sentinel2.conf这些配置的ip全换成分配的ip,
windows下的cmd命令,ipconfig可疑查看一下自己电脑分配的ip。

我们的spring boot项目中定义了JedisPoolConfig 连接池, 配置redis的哨兵和jedis的配置工厂

 @Bean
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 最大空闲数
        jedisPoolConfig.setMaxIdle(maxIdle);
        // 连接池的最大数据库连接数
        jedisPoolConfig.setMaxTotal(maxTotal);
        // 最大建立连接等待时间
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
        jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
        jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
        // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
        jedisPoolConfig.setTestOnBorrow(testOnBorrow);
        // 在空闲时检查有效性, 默认false
        jedisPoolConfig.setTestWhileIdle(testWhileIdle);
        return jedisPoolConfig;
    }
@Bean
    public RedisSentinelConfiguration sentinelConfiguration() {
        if(redisType==1){
            RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
//        配置redis的哨兵sentinel
            RedisNode senRedisNode = new RedisNode(sentinelHostName, sentinelport);
            Set<RedisNode> redisNodeSet = new HashSet<>();
            redisNodeSet.add(senRedisNode);
            redisSentinelConfiguration.setSentinels(redisNodeSet);
            redisSentinelConfiguration.setMaster(masterName);
            redisSentinelConfiguration.setPassword(password);
            return redisSentinelConfiguration;
        }else {
            return new RedisSentinelConfiguration();
        }
@Bean
    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisSentinelConfiguration sentinelConfig) {
        if(redisType==1){
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfig, jedisPoolConfig);
            return jedisConnectionFactory;
        }else {
            JedisPoolConfig config = jedisPoolConfig();
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(config);
            jedisConnectionFactory.setHostName(host);
            jedisConnectionFactory.setPassword(this.password);
            jedisConnectionFactory.setPort(port);
            jedisConnectionFactory.setTimeout(timeout);
            return jedisConnectionFactory;
        }
    }

还有yml文件中的redis的一些配置

redis:
  # 1:哨兵模式  其它数字:普通模式
  type: 1
  # 哨兵模式普通模式共用 最大空闲数
  maxIdle: 200
  # 哨兵模式普通模式共用 连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
  maxTotal:  1000
  # 哨兵模式普通模式共用 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  maxWaitMillis : 1000
  # 哨兵模式普通模式共用 连接的最小空闲时间 默认1800000毫秒(30分钟)
  minEvictableIdleTimeMillis: 300000
  # 哨兵模式普通模式共用 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
  numTestsPerEvictionRun: 1024
  # 哨兵模式普通模式共用 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  timeBetweenEvictionRunsMillis: 30000
  # 哨兵模式普通模式共用 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  testOnBorrow: true
  # 哨兵模式普通模式共用 在空闲时检查有效性, 默认false
  testWhileIdle: true
  # 密码 哨兵模式普通模式共用
  password: 123456
  # 普通模式 地址
  host: 127.0.0.1
  # 普通模式 连接超时时间(毫秒)
  timeout: 5000
  # 普通模式 端口
  port: 6379
  # 哨兵模式 哨兵masterName
  mymaster:
    masterName: mymaster
  # 哨兵模式 哨兵地址  端口
  sentinel:
    hostName: 172.20.61.25
    port: 26379
为啥不能用127.0.0.1这个ip

我跟踪源码,发现中间调用了这个方法

 public static String convertHost(String host) {
        return !host.equals("127.0.0.1") && !host.startsWith("localhost") && !host.equals("0.0.0.0") && !host.startsWith("169.254") && !host.startsWith("::1") && !host.startsWith("0:0:0:0:0:0:0:1") ? host : LOCALHOST_STR;
    }

这个方法内,如果你的配置文件ip是127.0.0.1,localhost,0.0.0.0等等上面中的某一个,那么他会LOCALHOST_STR代替你的ip
其实LOCALHOST_STR就是调用了getLocalHostQuietly方法,也就是InetAddress.getLocalHost().getHostAddress()得到ip来替换你配置文件的ip

 public static String getLocalHostQuietly() {
        String localAddress;
        try {
            localAddress = InetAddress.getLocalHost().getHostAddress();
        } catch (Exception var2) {
            log.logp(Level.SEVERE, HostAndPort.class.getName(), "getLocalHostQuietly", "cant resolve localhost address", var2);
            localAddress = "localhost";
        }

        return localAddress;
}

所有会产生Could not get a resource from the pool这个错误

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容