主要是参考这篇文章进行搭建的。
首先通过docker拉取最新版的redis镜像。
docker search redis
使用以下命令拉取
docker pull redis
每个目录下的redis.conf都要修改
cluster-announce-ip 192.168.6.97 这里要设置成你宿主机的IP,因为当你在宿主机通过某一个端口(6380)连接集群查询数据时数据可能并不在当前Redis实例上所以集群会返回一个地址加端口并去重新查询,但是集群部署在docker中返回的是docker内网的地址,在本机是无法访问docker内网地址的,所以需要Redis返回本机的IP地址再通过Docker暴露的端口进行重定向查询。
protected-mode no
#每个redis的端口号都要修改
port 6382
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
loglevel verbose
logfile redis.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
bind 0.0.0.0
lua-time-limit 5000
cluster-enabled yes
#改成本机IP地址
cluster-announce-ip XXX.XXX.XXX.XXX
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-replica-validity-factor 0
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
#这个是每个redis的密码配置
masterauth 123456
requirepass 123456
以下是docker-compose.yaml文件的配置
version: "3"
services:
redis-master1:
image: redis # 这里换成你使用的镜像名称
container_name: redis-master1
ports: # 映射端口,对外提供服务
- 6380:6380 # redis的服务端口
- 16380:16380 # redis集群监控端口
- 2222:22 # SSH端口
stdin_open: true # 标准输入打开
tty: true # 后台运行不退出
privileged: true # 拥有容器内命令执行的权限
networks: # 指定网关
redis:
ipv4_address: 172.19.0.11
volumes:
- ./redis-master1/conf/redis.conf:/etc/redis/redis.conf
#- ./data/redis-master1/data:/data
#- ./logs/redis-master1/logs:/logs
#docker执行的启动命令
command: redis-server /etc/redis/redis.conf
redis-master2:
image: redis
container_name: redis-master2
ports:
- 6381:6381
- 16381:16381
stdin_open: true
tty: true
privileged: true
networks:
redis:
ipv4_address: 172.19.0.12
volumes:
- ./redis-master2/conf/redis.conf:/etc/redis/redis.conf
#- ./data/redis-master2/data:/data
#- ./logs/redis-master2/logs:/logs
#docker执行的启动命令
command: redis-server /etc/redis/redis.conf
redis-master3:
image: redis
container_name: redis-master3
ports:
- 6382:6382
- 16382:16382
stdin_open: true
tty: true
privileged: true
networks:
redis:
ipv4_address: 172.19.0.13
volumes:
- ./redis-master3/conf/redis.conf:/etc/redis/redis.conf
#- ./data/redis-master3/data:/data
#- ./logs/redis-master3/logs:/logs
#docker执行的启动命令
command: redis-server /etc/redis/redis.conf
redis-slave1:
image: redis
container_name: redis-slave1
ports:
- 6383:6383
- 16383:16383
stdin_open: true
tty: true
privileged: true
networks:
redis:
ipv4_address: 172.19.0.14
volumes:
- ./redis-slave1/conf/redis.conf:/etc/redis/redis.conf
#- ./data/redis-slave1/data:/data
#- ./logs/redis-slave1/logs:/logs
#docker执行的启动命令
command: redis-server /etc/redis/redis.conf
redis-slave2:
image: redis
container_name: redis-slave2
ports:
- 6384:6384
- 16384:16384
stdin_open: true
tty: true
privileged: true
networks:
redis:
ipv4_address: 172.19.0.15
volumes:
- ./redis-slave2/conf/redis.conf:/etc/redis/redis.conf
#- ./data/redis-slave2/data:/data
#- ./logs/redis-slave2/logs:/logs
#docker执行的启动命令
command: redis-server /etc/redis/redis.conf
redis-slave3:
image: redis
container_name: redis-slave3
ports:
- 6385:6385
- 16385:16385
stdin_open: true
tty: true
privileged: true
networks:
redis:
ipv4_address: 172.19.0.16
volumes:
- ./redis-slave3/conf/redis.conf:/etc/redis/redis.conf
#- ./data/redis-slave3/data:/data
#- ./logs/redis-slave3/logs:/logs
#docker执行的启动命令
command: redis-server /etc/redis/redis.conf
# 自动创建网络,并手动指定IP网段
networks:
redis:
ipam:
config:
- subnet: 172.19.0.0/16
虚拟网段的设置不用管,这只是docker内部容器之间通信的IP地址,从宿主机访问各个redis还是通过 127.0.0.1:端口号 访问。
在存放docker-compose.yaml文件的目录下执行以下命令启动容器
docker-compose up
然后再进入redis-master1容器内执行
redis-cli -a 123456 --cluster create 172.19.0.11:6380 172.19.0.12:6381 172.19.0.13:6382 172.19.0.14:6383 172.19.0.15:6384 172.19.0.16:6385 --cluster-replicas 1 --cluster-yes
redis集群就搭建好了。
接下来使用Another Redis Desktop Manager客户端测试redis集群的连接。
连接成功