问题描述:
使用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);
}
}