乐趣区

Docker环境下秒建Redis集群连SpringBoot也整上了

SpringBoot 实战电商项目 mall(30k+star)地址:https://github.com/macrozheng/mall

摘要

为了提高 Redis 的存储容量和响应速度,有时候我们需要搭建 Redis 集群。本文主要讲述 Redis 集群环境的搭建步骤以及如何在 SpringBoot 中整合使用 Redis 集群。

Redis 集群搭建

这里我们使用最方便的搭建方式,使用 Docker Compose 来搭建,对 Docker Compose 不了解的朋友可以参考下《使用 Docker Compose 部署 SpringBoot 应用》。我们将搭建一个 6 节点的 Redis 集群,包括 3 个主节点和 3 个从节点。

  • 在搭建 Redis 集群之前,我们需要修改下 Redis 的配置文件redis.conf,该文件的下载地址:https://github.com/antirez/re…
  • 需要修改的属性如下,主要是修改了一些集群配置和运行端口,端口号需要按需修改为 6391~6396:
# 开启集群功能
cluster-enabled yes
# 设置运行端口
port 6391
# 设置节点超时时间,单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6391.conf"
  • 然后我们需要编写 docker-compose.yml 文件用于编排 6 个 Redis 容器,具体属性的作用可以参考下面的注释;
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
  • 从 docker-compose.yml 文件中我们可以看到,我们的 Redis 容器分别运行在 6391~6396 这 6 个端口之上,

将容器中的 /config 配置目录映射到了宿主机的 /mydata/redis-cluster/config 目录,同时还以 redis.sh 脚本作为该容器的启动脚本;

  • redis.sh脚本的作用是根据 environment 环境变量中的 PORT 属性,以指定配置文件来启动 Redis 容器;
redis-server  /config/nodes-${PORT}.conf
  • 接下来我们需要把 Redis 的配置文件和 redis.sh 上传到 Linux 服务器的 /mydata/redis-cluster/config 目录下;

  • 接下来上传我们的 docker-compose.yml 文件到 Linux 服务器,并使用 docker-compose 命令来启动所有容器;
docker-compose up -d
  • 启动过程中会输出如下信息;

  • 此时进入其中一个 Redis 容器之中,初始化 Redis 集群;
# 进入 Redis 容器
docker exec -it redis-master1 /bin/bash
# 初始化 Redis 集群命令
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
  • 集群创建过程中会让你确认配置,输入 yes 确认即可;

  • Redis 集群创建成功后会输出如下信息;

  • 创建成功后我们可以使用 redis-cli 命令连接到其中一个 Redis 服务;
# 单机模式启动
redis-cli -h 127.0.0.1 -p 6391
# 集群模式启动
redis-cli -c -h 127.0.0.1 -p 6391
  • 之后通过 cluster nodes 命令可以查看节点信息,发现符合原来 3 主 3 从的预期。

SpringBoot 中使用 Redis 集群

我们在《Spring Data Redis 最佳实践!》中讲到了在 SpringBoot 中如何使用 Redis,用的是单节点的 Redis 服务,这次我们讲下如何使用 Redis 集群服务。

  • 我们在原来代码的基础上进行改造,修改 application.yml 配置文件,添加 Redis 集群配置;
spring:
  redis:
#    host: 192.168.6.139 # Redis 服务器地址
#    database: 0 # Redis 数据库索引(默认为 0)#    port: 6379 # Redis 服务器连接端口
    password: # Redis 服务器连接密码(默认为空)timeout: 3000ms # 连接超时时间
    lettuce:
      pool:
        max-active: 8 # 连接池最大连接数
        max-idle: 8 # 连接池最大空闲连接数
        min-idle: 0 # 连接池最小空闲连接数
        max-wait: -1ms # 连接池最大阻塞等待时间,负值表示没有限制
    cluster:
      nodes:
        - 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
  • 此时我们再次调用获取品牌详情的接口,就会把品牌信息缓存到 Redis 集群中去了;
  • 由于 Redis 容器 redis-master1redis-slave2互为主从,所以里面都缓存了相同的品牌详情信息。

配置文件地址

https://github.com/macrozheng/mall-learning/tree/master/document/redis-cluster

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-redis

公众号

mall 项目全套学习教程连载中,关注公众号 第一时间获取。

退出移动版