1 Redis 集群搭建
1 简介
本文采用 docker-compose 搭建 Redis 集群环境(三主三从),以及如何在SpringBoot 中整合使用 Redis 集群,Redis 版本 5.0。
2 搭建集群
2.1 修改 Redis 的配置文件
-
redis.conf配置文件官方下载地址 -
需要修改的属性如下
# 开启集群功能 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 文件
-
文件配置如下,具体作用参考注释
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 脚本
-
脚本的作用是根据 environment 环境变量中的
port属性,以指定配置文件来启动 Redis 容器,requirepass表示 Redis 密码,masterauth表示 master 节点密码(如不想设密码可去除)redis-server /config/nodes-${PORT}.conf --requirepass 123456 --masterauth 123456
2.4 将所有配置文件上传到服务器并运行
-
文件目录如下
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 -
进入 docker 文件目录下运行
docker-compose -f docker-compose-redis_cluster.yml -d up
2.5 初始化集群
-
进入其中一个 docker 容器
docker exec -it redis-master1 /bin/bash -
用以下命令初始化集群
# 如未设密码将 -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 -
集群配置过程中输入
yes确认即可 -
集群配置成功输出以下界面
2.6 检验集群是否搭建成功
-
使用 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 -
输入
cluster nodes查看节点信息,发现符合3主3从预期
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 集群时某一个节点信息无法获取。
- 进入 redis-master1 容器,输入
cat /data/nodes-6391.conf看到以下信息
- 6391 端口节点的 ip 地址和其余节点的 ip 地址不同
2. 用同样方法查看 redis-master2 容器
- 6392 端口节点的 ip 地址和其余节点的 ip 地址不同
3. 可以看出,SpringBoot 连接 Redis 时,通过cluster slots获取节点信息时,总有一个节点信息无法获取。
-
进入 docker 文件目录下运行
docker-compose -f docker-compose-redis_cluster.yml down -
修改
redis.conf# 配置节点 ip 为外网 ip cluster-announce-ip 47.112.154.170 -
再一次搭建集群
-
进入容器查看
- 可以看出问题已解决