问题描述:

使用Redis集群,有节点故障恢复后,redission启动时报如下错误:

Caused by: org.redisson.client.RedisConnectionException: Not all slots covered! Only 10922 slots are available. Set checkSlotsCoverage = false to avoid this check.

问题原因:

 

 

集群中只有10922个slot可用,

划重点 cluster_state:fail cluster_slots_assigned:10922, 集群状态 fail , 分配的slots 10922< 16384 , 集群不可用。

为了保证集群完整性, 默认情况下当集群16384个槽任何一个没有指派到节点时整个集群不可用。这是对集群完整性的一种保护措施, 保证所有的槽都指派给在线的节点。

解决方法:

日志中提示: Set checkSlotsCoverage = false to avoid this check. 在redission的配置中增加:

clusterServersConfig.setCheckSlotsCoverage(false);
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.redisson.spring.data.connection.RedissonConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.util.Arrays;

@Configuration
public class RedissonSpringDataConfig {

    @Value("${spring.redis.cluster-nodes}")
    private String nodeAddreess;

    @Bean
    public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
        return new RedissonConnectionFactory(redisson);
    }

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson(@Value("classpath:/redisson.yml") Resource configFile) throws IOException {
        String[] split = nodeAddreess.split(",");
        Config config = Config.fromYAML(configFile.getInputStream());
        ClusterServersConfig clusterServersConfig = config.useClusterServers();
        clusterServersConfig.setNodeAddresses(Arrays.asList(split));
        clusterServersConfig.setCheckSlotsCoverage(false);
        return Redisson.create(config);
    }

}

Logo

一站式 AI 云服务平台

更多推荐