2024年2月--Mac电脑安装RedisCluster集群(非Docker模式)

梦幻朵颜 Joyce Zhu / 2024-02-10 / 原文

前提:按照本文的指令照做之前,先在Mac电脑安装一个默认端口为6379的单节点redis server,保证后面的redis-server和redis-cli指令能够正常执行。

为什么没有在Mac的Docker里安装Redis集群?我确实在Docker里安装成功了Redis集群:《2024年2月笔记:Redis7.2.4版本在Mac电脑的Docker里安装Redis集群,但是SprintBoot连接不到Docker内部网络IP地址的Redis集群》,但是!当SpringBoot连接到Redis集群时,集群内部为了跳转到正确的槽位对应的节点用的是Docker内部网络IP比如172.18.0.2,Mac宿主机访问不了172.18.0.2因为是Docker内网IP,所以Springboot访问redis失败。目前暂时未解决该问题,有懂的小伙伴麻烦留言告诉我,不胜感激。

 

第1步,新建redis.conf

redis.conf内容如下:

port 7021
cluster-enabled yes                          // 启用集群模式
cluster-config-file nodes.conf           // 集群的配置文件
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 0.0.0.0                    // 任何IP都可访问
masterauth myredis         // 指定集群密码
requirepass myredis        // 指定集群密码

 

第2步,新建6个以不同端口号为命名的文件夹,用于存储6个redis节点的新文件生成内容

新建6个文件夹,以redis集群的6个端口命名,分别是: 7021, 7022, 7023, 7024, 7025, 7026

复制redis.conf到以上新建的六个文件夹下,把port端口号改成相应的redis 端口号,我这里就是:7021, 7022, 7023, 7024, 7025, 7026

分别启动6个节点:

zhu@DW61 7021 % cd /7021         
zhu@DW61 7022 % redis-server redis.conf
24907:C 10 Feb 2024 11:57:39.240 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode
zhu@DW61 7021 % cd ../7022         
zhu@DW61 7022 % redis-server redis.conf
24907:C 10 Feb 2024 11:57:39.240 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode
zhu@DW61 7022 % cd ../7023             
zhu@DW61 7023 % redis-server redis.conf
24990:C 10 Feb 2024 11:57:43.729 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode
zhu@DW61 7023 % cd ../7024             
zhu@DW61 7024 % redis-server redis.conf
25022:C 10 Feb 2024 11:57:46.544 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode
zhu@DW61 7024 % cd ../7025             
zhu@DW61 7025 % redis-server redis.conf
25044:C 10 Feb 2024 11:57:50.082 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode
zhu@DW61 7025 % cd ../7026             
zhu@DW61 7026 % redis-server redis.conf
25084:C 10 Feb 2024 11:57:54.540 # WARNING: Changing databases number from 16 to 1 since we are in cluster mode

查看redis所有的启动节点,此时每个节点都是独立节点,还不是集群:

zhu@DW61 7026 % ps -ef | grep redis         
  504 24802     1   0 11:57AM ??         0:00.45 redis-server 0.0.0.0:7021 [cluster] 
  504 24908     1   0 11:57AM ??         0:00.18 redis-server 0.0.0.0:7022 [cluster] 
  504 24991     1   0 11:57AM ??         0:00.15 redis-server 0.0.0.0:7023 [cluster] 
  504 25023     1   0 11:57AM ??         0:00.13 redis-server 0.0.0.0:7024 [cluster] 
  504 25045     1   0 11:57AM ??         0:00.10 redis-server 0.0.0.0:7025 [cluster] 
  504 25085     1   0 11:57AM ??         0:00.07 redis-server 0.0.0.0:7026 [cluster] 
  504 25130  1404   0 11:58AM ttys001    0:00.00 grep redis

启动6个节点成功后,文件夹目录是这样的:

 

第3步,执行创建Redis Cluster 集群指令

执行创建Redis集群指令:

redis-cli --cluster create 127.0.0.1:7021 127.0.0.1:7022 127.0.0.1:7023 127.0.0.1:7024 127.0.0.1:7025 127.0.0.1:7026 --cluster-replicas 1 -a myredis

创建集群的整个过程:

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7025 to 127.0.0.1:7021
Adding replica 127.0.0.1:7026 to 127.0.0.1:7022
Adding replica 127.0.0.1:7024 to 127.0.0.1:7023
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 256e2f22ebff898c19c0e943caf3dfefc2e75eb8 127.0.0.1:7021
   slots:[0-5460] (5461 slots) master
M: 6af6f789151e825aab57998b9d5efc2da0abf6db 127.0.0.1:7022
   slots:[5461-10922] (5462 slots) master
M: 719bc79c5d4144e82596b1083592223771735da8 127.0.0.1:7023
   slots:[10923-16383] (5461 slots) master
S: fb576ff3f4fd2918c7207a50583df62c00f6e747 127.0.0.1:7024
   replicates 719bc79c5d4144e82596b1083592223771735da8
S: 01200cf6560b1913c43affa73ac0aaaaffff75d2 127.0.0.1:7025
   replicates 256e2f22ebff898c19c0e943caf3dfefc2e75eb8
S: 23bd2778ec4ebebd45cd0f5d0c393566a33bc47f 127.0.0.1:7026
   replicates 6af6f789151e825aab57998b9d5efc2da0abf6db
Can I set the above configuration? (type 'yes' to accept): yes    // 这里的yes需要手动输入
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 127.0.0.1:7021)
M: 256e2f22ebff898c19c0e943caf3dfefc2e75eb8 127.0.0.1:7021
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 23bd2778ec4ebebd45cd0f5d0c393566a33bc47f 127.0.0.1:7026
   slots: (0 slots) slave
   replicates 6af6f789151e825aab57998b9d5efc2da0abf6db
S: 01200cf6560b1913c43affa73ac0aaaaffff75d2 127.0.0.1:7025
   slots: (0 slots) slave
   replicates 256e2f22ebff898c19c0e943caf3dfefc2e75eb8
S: fb576ff3f4fd2918c7207a50583df62c00f6e747 127.0.0.1:7024
   slots: (0 slots) slave
   replicates 719bc79c5d4144e82596b1083592223771735da8
M: 6af6f789151e825aab57998b9d5efc2da0abf6db 127.0.0.1:7022
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 719bc79c5d4144e82596b1083592223771735da8 127.0.0.1:7023
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.      // 所有16384个槽位全部分配成功,集群创建成功

验证redis集群指令:

redis-cli -c -p 7021 -a myredis       // 进入redis集群时,要加入-c表示连接到集群
127.0.0.1:7023> cluster nodes         // 查看集群节点,三主三从
fb576ff3f4fd2918c7207a50583df62c00f6e747 127.0.0.1:7024@17024 slave 719bc79c5d4144e82596b1083592223771735da8 0 1707540515000 3 connected
256e2f22ebff898c19c0e943caf3dfefc2e75eb8 127.0.0.1:7021@17021 master - 0 1707540515503 1 connected 0-5460
23bd2778ec4ebebd45cd0f5d0c393566a33bc47f 127.0.0.1:7026@17026 slave 6af6f789151e825aab57998b9d5efc2da0abf6db 0 1707540515503 2 connected
719bc79c5d4144e82596b1083592223771735da8 127.0.0.1:7023@17023 myself,master - 0 1707540515000 3 connected 10923-16383
01200cf6560b1913c43affa73ac0aaaaffff75d2 127.0.0.1:7025@17025 slave 256e2f22ebff898c19c0e943caf3dfefc2e75eb8 0 1707540515503 1 connected
6af6f789151e825aab57998b9d5efc2da0abf6db 127.0.0.1:7022@17022 master - 0 1707540514489 2 connected 5461-10922
127.0.0.1:7023> cluster info          // 查看集群信息
cluster_state:ok                      // 集群状态:ok  表示集群很健康
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1757
cluster_stats_messages_pong_sent:1739
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:3497
cluster_stats_messages_ping_received:1739
cluster_stats_messages_pong_received:1758
cluster_stats_messages_received:3497
total_cluster_links_buffer_limit_exceeded:0
127.0.0.1:7023>

 

第4步,SpringBoot集成Redis集群

将redis配置写到application.properties文件里:

spring.redis.cluster.max-redirects=3
spring.redis.client-type=lettuce
spring.redis.cluster.nodes=127.0.0.1:7021,127.0.0.1:7022,127.0.0.1:7023,127.0.0.1:7024,127.0.0.1:7025,127.0.0.1:7026
spring.redis.password=myredis
spring.redis.connect-timeout=3000
#spring.redis.timeout=3000
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

配置RedisTemplate:

@Slf4j
@Configuration
@Component
@RequiredArgsConstructor
public class ConfigRedisCluster {

    final ObjectMapper objectMapper;

    @Primary
    @Bean("redisTemplate") 
    public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {  // factory对象就是application.properties里配置的redis集群
        StringRedisSerializer stringSerializer = new StringRedisSerializer();

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

Springboot启动类:

@Slf4j
@SpringBootApplication
public class EcouponApplication
        extends SpringBootServletInitializer
{

    public static void main(String[] args) {
        SpringApplication.run(EcouponApplication.class, args);
        log.info("service is started successfully.");
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(EcouponApplication.class);
    }

}

 

第5步,Redis集群重启指令

当电脑重启后,redis节点全部需要重新启动。

关闭指令:

redis-cli -p 7021 -a myredis shutdown            // 每一个节点执行一遍,7022是redis端口,替换成你自己的redis端口就行,shutdown是关闭指令。

redis-cli -p 7022 -a myredis shutdown

redis-cli -p 7023 -a myredis shutdown

redis-cli -p 7024 -a myredis shutdown

redis-cli -p 7025 -a myredis shutdown

redis-cli -p 7026 -a myredis shutdown

再次启动:

redis-server  /7021/redis.conf    

redis-server  /7022/redis.conf  

redis-server  /7023/redis.conf  

redis-server  /7024/redis.conf  

redis-server  /7025/redis.conf  

redis-server  /7026/redis.conf  

end.