Redis 集群搭建以及结合 SpringBoot 使用

1,191 阅读3分钟

1 Redis 集群搭建

1 简介

本文采用 docker-compose 搭建 Redis 集群环境(三主三从),以及如何在SpringBoot 中整合使用 Redis 集群,Redis 版本 5.0。

2 搭建集群

2.1 修改 Redis 的配置文件

  1. redis.conf配置文件官方下载地址

  2. 需要修改的属性如下

    # 开启集群功能
    cluster-enabled yes
    # 设置运行端口(6391~6396)
    port 6391
    # 设置节点超时时间,单位毫秒
    cluster-node-timeout 15000
    # 集群内部配置文件(6391~6396)
    cluster-config-file "nodes-6391.conf"
    

2.2 编写 docker-compose-redis_cluster.yml 文件

  1. 文件配置如下,具体作用参考注释

    version: "3"
    services:
      redis-master1:
        image: redis:5.0 # 基础镜像
        container_name: redis-master1 # 容器名称
        working_dir: /config # 切换工作目录
        environment: # 环境变量
          - PORT=6391 # 会使用config/nodes-${PORT}.conf这个配置文件
        ports: # 映射端口,对外提供服务
          - 6391:6391 # redis的服务端口
          - 16391:16391 # redis集群监控端口
        stdin_open: true # 标准输入打开
        tty: true # 后台运行不退出
        network_mode: host # 使用host模式
        privileged: true # 拥有容器内命令执行的权限
        volumes:
          - /mydata/redis-cluster/config:/config #配置文件目录映射到宿主机
        entrypoint: # 设置服务默认的启动程序
          - /bin/bash
          - redis.sh
      redis-master2:
        image: redis:5.0
        working_dir: /config
        container_name: redis-master2
        environment:
          - PORT=6392
        ports:
          - 6392:6392
          - 16392:16392
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-master3:
        image: redis:5.0
        container_name: redis-master3
        working_dir: /config
        environment:
          - PORT=6393
        ports:
          - 6393:6393
          - 16393:16393
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-slave1:
        image: redis:5.0
        container_name: redis-slave1
        working_dir: /config
        environment:
          - PORT=6394
        ports:
          - 6394:6394
          - 16394:16394
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-slave2:
        image: redis:5.0
        working_dir: /config
        container_name: redis-slave2
        environment:
          - PORT=6395
        ports:
          - 6395:6395
          - 16395:16395
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
      redis-slave3:
        image: redis:5.0
        container_name: redis-slave3
        working_dir: /config
        environment:
          - PORT=6396
        ports:
          - 6396:6396
          - 16396:16396
        stdin_open: true
        network_mode: host
        tty: true
        privileged: true
        volumes:
          - /mydata/redis-cluster/config:/config
        entrypoint:
          - /bin/bash
          - redis.sh
    

2.3 编写 redis.sh 脚本

  1. 脚本的作用是根据 environment 环境变量中的port属性,以指定配置文件来启动 Redis 容器, requirepass 表示 Redis 密码,masterauth表示 master 节点密码(如不想设密码可去除)

    redis-server  /config/nodes-${PORT}.conf --requirepass 123456 --masterauth 123456
    

2.4 将所有配置文件上传到服务器并运行

  1. 文件目录如下

    redis-cluster
    ├── config
    	├── nodes-6391.conf
    	├── nodes-6392.conf
    	├── nodes-6393.conf
    	├── nodes-6394.conf
    	├── nodes-6395.conf
    	├── nodes-6396.conf
    	├── redis.sh
    └── docker
    	└── docker-compose-redis_cluster.yml
    
  2. 进入 docker 文件目录下运行

    docker-compose -f docker-compose-redis_cluster.yml -d up
    

2.5 初始化集群

  1. 进入其中一个 docker 容器

    docker exec -it redis-master1 /bin/bash
    
  2. 用以下命令初始化集群

    # 如未设密码将 -a 属性去除,ip 地址换成服务器对应 ip 地址
    redis-cli --cluster create \
    192.168.6.139:6391 192.168.6.139:6392 192.168.6.139:6393 \
    192.168.6.139:6394 192.168.6.139:6395 192.168.6.139:6396 \
    --cluster-replicas 1 \
    -a 123456
    
  3. 集群配置过程中输入yes确认即可

  4. 集群配置成功输出以下界面

redis_cluster_04.png

2.6 检验集群是否搭建成功

  1. 使用 redis-cli 连接到其中一个 redis 服务

    # 单机模式启动
    redis-cli -h 127.0.0.1 -p 6391 -a 123456
    # 集群模式启动
    redis-cli -c -h 127.0.0.1 -p 6391 -a 123456
    
  2. 输入cluster nodes查看节点信息,发现符合3主3从预期

QQ20210418100415.png

3 SpringBoot 中使用 Redis 集群

3.1 在 Maven 中加入 Redis 依赖

<!-- Redis 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.2 配置 application.yml 文件

spring:
  redis:
    password: 123456 # Redis 服务器连接密码(默认为空)
    timeout: 3000ms # 连接超时时间(毫秒)
    jedis:
      pool:
        max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
        max-idle: 8 # 连接池中的最大空闲连接
        min-idle: 0 # 连接池中的最小空闲连接
        max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
    cluster:
      nodes: # Redis 集群节点地址和端口
        - 192.168.6.139:6391
        - 192.168.6.139:6392
        - 192.168.6.139:6393
        - 192.168.6.139:6394
        - 192.168.6.139:6395
        - 192.168.6.139:6396

3.3 使用 Redis 就会自动调用集群了

4 遇到的问题

4.1 Linux 服务器默认路由为内网 ip 的情况

该问题会导致 SpringBoot 访问 Redis 集群时某一个节点信息无法获取。

  1. 进入 redis-master1 容器,输入cat /data/nodes-6391.conf看到以下信息

QQ20210425173825.png

- 6391 端口节点的 ip 地址和其余节点的 ip 地址不同

2. 用同样方法查看 redis-master2 容器

1.png

- 6392 端口节点的 ip 地址和其余节点的 ip 地址不同

3. 可以看出,SpringBoot 连接 Redis 时,通过cluster slots获取节点信息时,总有一个节点信息无法获取。


  1. 进入 docker 文件目录下运行

    docker-compose -f docker-compose-redis_cluster.yml down
    
  2. 修改redis.conf

    # 配置节点 ip 为外网 ip
    cluster-announce-ip 47.112.154.170
    
  3. 再一次搭建集群

  4. 进入容器查看

1 1.png

- 可以看出问题已解决