Redis 高可用(三) 搭建

2020-11-17  本文已影响0人  _大叔_

环境

考虑到既然是高可用,那么Sentinel 也得是一个以上。

IP port 部署
192.168.81.101 6379 Redis6 master
192.168.81.101 26379 Redis6 Sentinel
192.168.81.102 6379 Redis6 slave
192.168.81.102 26379 Redis6 Sentinel

主从搭建

为了主从 Redis 安全,密码是必须设置的,否则等着被挖矿吧。在配置文件修改如下:
主从密码可以一样,方便记忆。

requirepass ilovejj

设置连接 master 时的认证密码,一搬给 slave 的配置文件设置

masterauth ilovejj

都启动成功之后在 slave 使用以下命令

127.0.0.1:6379> slaveof 192.168.81.111 6379
OK

可以从日志里面看到是否启动成功,如果没有启动成功则会一直打印如下,我这里故意弄一个错误的IP加以说明。

2187:S 16 Nov 2020 17:19:17.913 # Error condition on socket for SYNC: Operation now in progress
2187:S 16 Nov 2020 17:19:18.526 * Connecting to MASTER 192.168.81.111:6379
2187:S 16 Nov 2020 17:19:18.526 * MASTER <-> REPLICA sync started

一定要记得加日志,否则以后怎么死的都不知道。

哨兵

在 Redis 目录下,自带着一个 sentinel.cnf 文件,有着相关 sentinel 配置,我们修改如下:

# 端口默认
port 26379
daemonize yes
logfile "/opt/module/redis-6.0.8/log/sentinel.log"
sentinel monitor mymaster 192.168.81.101 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster ilovejj

切记哨兵,一定要用的是 master 的IP,哪怕在同一台服务器上,也要使用 IP,不要使用127.0.0.1,否则挂掉一台哨兵,salve 可能无法复制。

哨兵启动

我这里哨兵和redis实例是同一台,意思就是可以一起使用,不需要在部署一个哨兵。

./redis-server ../sentinel.conf --sentinel

启动后记得查看日志,一些不为人知的配置错误都会在日志里面显示。其中会有一台一直输出和其他哨兵连接的信息。

spring boot redis 哨兵

maven,只放关于Redis的

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
    </dependencies>

配置文件

spring
  redis:
    timeout: 10000
    sentinel:
      nodes:
        - 192.168.81.101:26379
        - 192.168.81.102:26379
      password: ilovejj
      master: mymaster
      # 这是我框架自己得一个属性大家忽略
      enable: true
    lettuce:
      pool:
        max-wait: 10000
        max-active: 30
        max-idle: 15
        min-idle: 15

配置类

package com.giant.cloud.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;

import java.util.HashSet;

/**
 * @author big uncle
 * @date 2020/11/17 11:57
 * @module
 **/
@Configuration
@Slf4j
@ConditionalOnExpression("${spring.redis.sentinel.enable:false}")
public class RedisSentinelConfig {


    @Autowired
    RedisProperties redisProperties;

    /**
     * GenericObjectPoolConfig 连接池配置
     */
    @Bean
    public GenericObjectPoolConfig genericObjectPoolConfig() {
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());
        genericObjectPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());
        genericObjectPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());
        genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis());
        return genericObjectPoolConfig;
    }

    /**
     * 哨兵
    **/
    @Bean
    public LettuceConnectionFactory redisConnectionFactory(GenericObjectPoolConfig genericObjectPoolConfig) {
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(redisProperties.getSentinel().getMaster(),
                new HashSet<>(redisProperties.getSentinel().getNodes()));
        redisSentinelConfiguration.setPassword(redisProperties.getSentinel().getPassword());
        // 配置池
        LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
                .commandTimeout(redisProperties.getTimeout())
                .poolConfig(genericObjectPoolConfig)
                .build();
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisSentinelConfiguration,clientConfig);
        log.debug("redis 哨兵启动");
        return lettuceConnectionFactory;
    }


}

上一篇 下一篇

猜你喜欢

热点阅读