Dcoker搭建Reids集群保姆级教程
前提说明:本教程所使用的Docker版本为 27.5.1,docker-compose版本为 v2.33.0。所使用的Redis版本是 7.0。本教程搭建的Redis集群模式为3主3从(官方推荐最小集群)。话不多说直接上干货。
步骤一: 创建目录结构体
redis-cluster/
│── docker-compose.yml
│── redis.cnf # redis配置文件,适用于所有节点
│── Dockerfile
步骤二: 修改redis配置文件
从官方下载redis:7.0
版本的配置文件
对配置文件做出一下修改
port 6379
cluster-enabled yes # 启用 Redis 集群模式
cluster-config-file nodes.conf # 存储集群节点信息
cluster-node-timeout 5000 # 超时设置
appendonly yes # 持久化
protected-mode no # 允许外部访问
bind 0.0.0.0 # 监听所有网络接口
说一下为什么要做这些配置的修改
cluster-node-timeout
:节点超时时间,单位毫秒。 如果一个节点在指定时间内没有收到其他节点的 PING 消息,则认为该节点下线。这个选项会影响主从切换和数据迁移,如果主节点超时未响应,集群会选举新的主节点。同时会将节点的数据迁移到其他节点。appendonly yes
:启用 AOF (Append Only File) 持久化。 强烈建议启用,以防止数据丢失。cluster-config-file
:Redis 集群节点的信息(节点 ID、哈希槽分配、集群拓扑等)会保存在nodes.conf
文件中,每次 Redis 启动时会读取它,如果它不存在,Redis 就会创建它。protected-mode
:no是允许外部访问,默认yes,redis会处于保护模式,如果bind
允许外部访问,但没有设置requirepass
(密码),Redis 会拒绝所有非本地 IP 的连接。bind 0.0.0.0
:让redis监听所有网络接口,外部机器可以访问。如果redis集群是在docker中运行,必须允许外部访问,否则其他节点无法进入集群。
步骤三: 完成docker-compose.yaml
和Dockerfile
Dockerfile
FROM redis:7.0
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
基于官方的7.0版本的镜像,然后复制配置文件到容器,并启动redis服务。
docker-compose.yaml
version: '3.8'
services:
redis-node-1:
build: .
container_name: redis-node-1
hostname: redis-node-1
networks:
- redis-cluster
ports:
- "7001:6379"
redis-node-2:
build: .
container_name: redis-node-2
hostname: redis-node-2
networks:
- redis-cluster
ports:
- "7002:6379"
redis-node-3:
build: .
container_name: redis-node-3
hostname: redis-node-3
networks:
- redis-cluster
ports:
- "7003:6379"
redis-node-4:
build: .
container_name: redis-node-4
hostname: redis-node-4
networks:
- redis-cluster
ports:
- "7004:6379"
redis-node-5:
build: .
container_name: redis-node-5
hostname: redis-node-5
networks:
- redis-cluster
ports:
- "7005:6379"
redis-node-6:
build: .
container_name: redis-node-6
hostname: redis-node-6
networks:
- redis-cluster
ports:
- "7006:6379"
networks:
redis-cluster:
driver: bridge
解释一个问题
为何这里所有的节点都是6379端口?不会冲突吗?
答:因为在每一个节点的容器内部,都相当于是一个独立的系统,他们之间的环境、端口都是隔离的,所以不会冲突,这也是docker的特点之一。但是映射到宿主机上就不能用同一个端口了。
步骤四: 启动集群
在docker-compose.yaml
文件所在的目录下(这里是redis-cluster
)使用docker-compose up -d
命令启动,构建集群,成功后随便进入一个redis集群容器,执行下面命令
redis-cli --cluster create \
redis-node-1:6379 redis-node-2:6379 redis-node-3:6379 \
redis-node-4:6379 redis-node-5:6379 redis-node-6:6379 \
--cluster-replicas 1 --cluster-yes
如果终端输出下面内容,说明成功了
步骤五: 验证集群
随便进入一个节点,运行redis-cli -c
(-c 以集群模式启动),设置一个值
进入另一个节点,运行redis-cli -c
,看看能否获取值
OK,redis集群搭建成功~,如果大家在搭建过程中遇到了什么问题,欢迎咨询。