1、搭建环境
三台虚拟机 CentOS Linux release 7.9.2009 (Core)
Docker version 23.0.1
Docker-compose version 1.25.0-rc4
主机IP:
192.168.182.137
192.168.182.135
192.168.182.136
2、搭建步骤
2.1 创建目录及配置文件 redis-cluster.tmpl 并编写
mkdir -p /usr/local/docker-redis/redis-cluster
在此目录下创建 redis-cluster.tmpl 文件并编写如下内容:
(这个文件主要是当作一个创建redis.conf的模板!当一个机器要创建多个redis节点,基于一个模板进行创建是很方便的)
port ${PORT} # 节点端口;
requirepass 123456 # 添加访问认证;
masterauth 123456 # 如果主节点开启了访问认证,从节点访问主节点需要认证;
protected-mode no # 保护模式
daemonize no # 是否以守护线程的方式启动(后台启动),默认 no;
appendonly yes # 是否开启 AOF 持久化模式,默认 no;
cluster-enabled yes # 是否开启集群模式,默认 no;
cluster-config-file nodes.conf # 集群节点信息文件;
cluster-node-timeout 15000 # 集群节点连接超时时间;
cluster-announce-ip 192.168.182.137 # 集群节点 IP,填写宿主机的 IP;
cluster-announce-port ${PORT} # 集群节点映射端口;
cluster-announce-bus-port 1${PORT} # 集群节点总线端口。
每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。
三台主机都需要做上述配置。创建相同的目录,编辑 redis-cluster.tmpl 文件。
唯一不同的地方是 cluster-announce-ip 替换为每个主机的ip
2.2 根据 redis-cluster.tmpl 执行指令
在 192.168.182.137 主机执行如下命令:(基于上述 redis-cluster.tmpl 模板,填充PORT 创建 redis.conf )
mkdir -p 6377/conf && PORT=6377 envsubst < redis-cluster.tmpl > 6377/conf/redis.conf && mkdir -p 6377/data;
在 192.168.182.135 主机执行:
mkdir -p 6378/conf && PORT=6378 envsubst < redis-cluster.tmpl > 6378/conf/redis.conf && mkdir -p 6378/data;
在 192.168.182.136 主机执行:
mkdir -p 6379/conf && PORT=6379 envsubst < redis-cluster.tmpl > 6379/conf/redis.conf && mkdir -p 6379/data;
这里是一个主机只有一个redis节点,如果要有多个,比如三个的话。则使用shell for 语句来创建文件目录。如下是一个主机3个redis节点(6371~6373)时的创建:
for port in `seq 6371 6373`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
2.3 编写 docker-compose.yml 文件
在 192.168.182.137 主机 /usr/local/docker-redis 目录下创建docker-compose.yml 文件并编辑。
# 描述 Compose 文件的版本信息
version: "3.3"
# 定义服务,可以多个
services:
redis-6377: # 服务名称
image: redis # 创建容器时所需的镜像
container_name: redis-6377 # 容器名称
restart: always # 容器总是重新启动
network_mode: "host" # host 网络模式
volumes: # 数据卷,宿主机目录挂载
- /usr/local/docker-redis/redis-cluster/6377/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6377/data:/data
command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令,直接开启redis
同理,分别在另外两台主机同样目录位置创建 docker-compose.yml 文件并编辑。
在 192.168.182.135 主机:
version: "3.3"
services:
redis-6378:
image: redis
container_name: redis-6378
restart: always
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6378/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6378/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
在 192.168.182.136 主机:
version: "3.3"
services:
redis-6379:
image: redis
container_name: redis-6379
restart: always
network_mode: "host"
volumes:
- /usr/local/docker-redis/redis-cluster/6379/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /usr/local/docker-redis/redis-cluster/6379/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
2.4 创建并启动所有服务容器
分别在三台主机的 /usr/local/docker-redis 目录下执行:
docker-compose up -d
2.5 创建 Redis Cluster集群
随便进入一个容器,并切到 /usr/local/bin 目录
docker exec -it redis-6377 bash
cd /usr/local/bin
通过如下指令实现 Redis Cluster 集群的搭建
redis-cli -a 123456 --cluster create 192.168.137:6377 192.168.135:6378 192.168.136:6379 --cluster-replicas 2
–cluster-replicas 2 表示 一主二从
执行指令后出现提示信息,输入yes。
未出现任何错误情况下,至此搭建完成
搭建过之后可以在任一容器中访问到存储在其他节点的数据
如:在 6377 容器中进入 6377 端口号 redis 的控制台
docker exec -it redis-6377 /usr/local/bin/redis-cli -c -a 123456 -h 192.168.182.137 -p 6377
在 6377 容器中直接进入 6379 端口号 redis 的控制台
docker exec -it redis-6377 /usr/local/bin/redis-cli -c -a 123456 -h 192.168.182.136 -p 6379
2.6 springboot 连接 redis-cluster 集群
spring:
redis:
cluster:
nodes: 192.168.182.137:6377,192.168.182.135:6378,192.168.182.136:6379
password: 123456
database: 0
connect-timeout: 10000
lettuce:
pool:
min-idle: 0
max-idle: 8
max-active: 8
max-wait: -1ms