redis-cluster集群搭建集成SpringBoot项目

161 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

配置文件

redis.conf 按三主三从的规格配置6个实例:

port 6379        
requirepass 123456            //设置密码
masterauth 123456            //如果requirepass设置了,masterauth也必须要保持一样,否则无法同步。
cluster-enabled yes    //开启集群模式 
cluster-config-file nodes-6379.conf    //每台机器的集群配置文件,不需要人工修改,程序自动记录,这块名字可以根据端口号进行设置。
cluster-node-timeout 15000  //单位是毫秒,如果在15秒还没有响应,结点会被认为出了故障。

启动redis实例

这里写了一个脚本来执行,节点多了太麻烦了:

#!/bin/bash
echo '>>>>>>>>>>>>>>>>>>> docker stop:'
docker stop redis-node1
docker stop redis-node2
docker stop redis-node3
docker stop redis-node4
docker stop redis-node5
docker stop redis-node6
echo '>>>>>>>>>>>>>>>>>>> docker rm:'
docker rm redis-node1
docker rm redis-node2
docker rm redis-node3
docker rm redis-node4
docker rm redis-node5
docker rm redis-node6
echo '>>>>>>>>>>>>>>>>>> clear data':
rm -rf ./node1/data
rm -rf ./node2/data
rm -rf ./node3/data
rm -rf ./node4/data
rm -rf ./node5/data
rm -rf ./node6/data
echo '>>>>>>>>>>>>>>>>>> docker create:'
docker run -idt  --net=host --name redis-node1 -p 6379:6379 -p 16379:16379 -v /usr/local/redis/node1/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node1/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt  --net=host --name redis-node2 -p 6380:6380 -p 16380:16380 -v /usr/local/redis/node2/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node2/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt  --net=host --name redis-node3 -p 6381:6381 -p 16381:16381 -v /usr/local/redis/node3/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node3/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host  --name redis-node4 -p 6382:6382 -p 16382:16382 -v /usr/local/redis/node4/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node4/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host  --name redis-node5 -p 6383:6383 -p 16383:16383 -v /usr/local/redis/node5/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node5/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
docker run -idt --net=host  --name redis-node6 -p 6384:6384 -p 16384:16384 -v /usr/local/redis/node6/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/node6/data:/data  --privileged=true docker.io/redis redis-server /etc/redis/redis.conf
echo '>>>>>>>>>>>>>>>>> docker nodes status:'
ps aux |grep cluster |grep redis

注意:如果是自己搭来玩,用一台主机,则记得把--net=host加上,该参数的作用是让docker和宿主机使用同一个网卡驱动,若不配置,那么到时候redis集群就会用docker创建的虚拟网卡驱动,导致redis节点和宿主机不在同一个网段。

创建集群

[root@localhost redis]# docker exec -it redis-node1 /bin/bash
root@localhost:/data#  redis-cli --cluster create 192.168.3.101:6379 192.168.3.101:6380 192.168.3.101:6381 192.168.3.101:6382 192.168.3.101:6383 192.168.3.101:6384 --cluster-replicas 1 -a 123456
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 192.168.3.101:6383 to 192.168.3.101:6379
Adding replica 192.168.3.101:6384 to 192.168.3.101:6380
Adding replica 192.168.3.101:6382 to 192.168.3.101:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a459cc9e605645cd5a3efa402a6472b36e7ebc65 192.168.3.101:6379
   slots:[0-5460] (5461 slots) master
M: 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2 192.168.3.101:6380
   slots:[5461-10922] (5462 slots) master
M: ec5fac133f0a4fcaff91e32fe1160e89d047ea44 192.168.3.101:6381
   slots:[10923-16383] (5461 slots) master
S: ee6230d0a064296f46201ac72f3eb52f574af456 192.168.3.101:6382
   replicates 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2
S: fc331235e462cc05462494d3b32ae95677f90e2c 192.168.3.101:6383
   replicates ec5fac133f0a4fcaff91e32fe1160e89d047ea44
S: 635d0a39c21614b4af529ba45fbc7a381d5f0061 192.168.3.101:6384
   replicates a459cc9e605645cd5a3efa402a6472b36e7ebc65
Can I set the above configuration? (type 'yes' to accept): 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 192.168.3.101:6379)
M: a459cc9e605645cd5a3efa402a6472b36e7ebc65 192.168.3.101:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ee6230d0a064296f46201ac72f3eb52f574af456 192.168.3.101:6382
   slots: (0 slots) slave
   replicates 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2
M: 0e4526a7ebd3643a3d53f6aea5fc4f8935464fa2 192.168.3.101:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: ec5fac133f0a4fcaff91e32fe1160e89d047ea44 192.168.3.101:6381
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: fc331235e462cc05462494d3b32ae95677f90e2c 192.168.3.101:6383
   slots: (0 slots) slave
   replicates ec5fac133f0a4fcaff91e32fe1160e89d047ea44
S: 635d0a39c21614b4af529ba45fbc7a381d5f0061 192.168.3.101:6384
   slots: (0 slots) slave
   replicates a459cc9e605645cd5a3efa402a6472b36e7ebc65
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

至此,一个redis集群搭建完毕了。

接入SpringBoot项目

创建一个maven项目,pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>WebProject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
</project>

单节点配置

application.yml

server:
  # 端口号
  port: 8080
spring:
  redis:
    host: 192.168.3.101
    port: 6379
    password: 123456

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    public void t1(){
        redisTemplate.opsForValue().set("k1","123");
        Object k1 = redisTemplate.opsForValue().get("k1");
        System.out.println(k1.toString());
    }
}

>>>>>>123

看似很完美,but: 在这里插入图片描述

所以redis集群是没办法单节点运行的。还是需要进行集群配置。

集群配置

spring:
  redis:
#    host: 192.168.3.101
#    port: 6379
    password: 123456
    cluster:
      nodes: 192.168.3.101:6379,192.168.3.101:6380,192.168.3.101:6381,192.168.3.101:6382,192.168.3.101:6383,192.168.3.101:6384

在这里插入图片描述 完结撒花! 在这里插入图片描述