Docker搭建Redis三主三从集群
什么是Redis集群?
简单说,Redis集群就是让多个Redis服务器一起工作,主要有两个好处:
- 数据分片:把数据分散存储在多个服务器上,解决单台服务器内存不足的问题
- 高可用:每个主服务器都有一个从服务器作为备份,主服务器故障时从服务器可以顶上
今天要搭建的是"三主三从"架构:3个主节点负责数据存储,每个主节点对应1个从节点负责备份。
准备工作
在开始之前,我已经在虚拟机上安装了Docker,因为用Docker搭建集群会更简单快捷。如果还没安装Docker,可以先安装好。
搭建步骤
第一步:拉取Redis镜像
首先需要获取Redis的Docker镜像,执行以下命令:
docker pull redis:latest
这个命令会从Docker仓库下载最新版本的Redis镜像。执行完成后,可以用docker images
命令查看是否下载成功:
docker images
如果看到redis的镜像信息,就说明拉取成功了。
第二步:创建集群目录和配置文件
我们需要为6个节点(3主3从)创建各自的配置文件和数据目录。我用循环命令来批量创建:
# 循环创建6个节点的配置和数据目录
for port in 8001 8002 8003 8004 8005 8006; do
# 创建目录
mkdir -p /mydata/redis/node-${port}/{conf,data}
# 生成配置文件
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.148
cluster-announce-port ${port}
cluster-announce-bus-port $((port + 10000))
appendonly yes
protected-mode no
EOF
done
# 赋予权限
chmod -R 777 /mydata/redis
这里解释一下关键配置:
port ${port}
:每个节点的端口号(8001-8006)cluster-enabled yes
:开启集群模式cluster-announce-ip
:服务器的IP地址(需要替换成你自己的IP)cluster-announce-port
:节点端口cluster-announce-bus-port
:节点间通信的总线端口(端口号+10000)
第三步:启动6个Redis容器
接下来,我们用Docker启动6个Redis容器,分别对应8001到8006这6个节点:
for port in 8001 8002 8003 8004 8005 8006; do
docker run -d --name redis-node-${port} --net host -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf -v /mydata/redis/node-${port}/data:/data redis:latest redis-server /etc/redis/redis.conf
done
命令说明:
--name redis-node-${port}
:给容器起名字--net host
:使用主机网络,方便节点间通信-v
:挂载配置文件和数据目录,实现数据持久化redis-server /etc/redis/redis.conf
:指定配置文件启动Redis
启动完成后,可以用docker ps
命令查看容器是否正常运行。
第四步:初始化Redis集群
现在我们有了6个独立的Redis节点,需要把它们组成一个集群。执行以下命令:
docker exec -it redis-node-8001 redis-cli --cluster create 192.168.1.148:8001 192.168.1.148:8002 192.168.1.148:8003 192.168.1.148:8004 192.168.1.148:8005 192.168.1.148:8006 --cluster-replicas 1
命令说明:
--cluster create
:创建集群- 后面跟的是6个节点的IP和端口
--cluster-replicas 1
:指定每个主节点有1个从节点
执行命令后,会看到如下输出:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.148:8005 to 192.168.1.148:8001
Adding replica 192.168.1.148:8006 to 192.168.1.148:8002
Adding replica 192.168.1.148:8004 to 192.168.1.148:8003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 423b23d250f83d9de63a34abe4d5d37da6f6c479 192.168.1.148:8001
slots:[0-5460] (5461 slots) master
M: f38fd7946eda90f448ddf0411d75603f4b587df4 192.168.1.148:8002
slots:[5461-10922] (5462 slots) master
M: b840d4d34390a6ca1b32d68ca8390969e67c441c 192.168.1.148:8003
slots:[10923-16383] (5461 slots) master
S: 3cad2ba9c42abd34c650de12c6a5b2ac4b3dbdf2 192.168.1.148:8004
replicates f38fd7946eda90f448ddf0411d75603f4b587df4
S: 3efbb28e63cc70c91f7275232e3fc67d58dfb270 192.168.1.148:8005
replicates b840d4d34390a6ca1b32d68ca8390969e67c441c
S: d857863fb19bd0ae001e9dc5c76d2e04a33e7164 192.168.1.148:8006
replicates 423b23d250f83d9de63a34abe4d5d37da6f6c479
Can I set the above configuration? (type 'yes' to accept):
这段输出告诉我们:
- Redis集群共有16384个哈希槽(slots)
- 这16384个槽被平均分配给了3个主节点:
- 8001节点负责0-5460号槽
- 8002节点负责5461-10922号槽
- 8003节点负责10923-16383号槽
- 从节点分配情况:
- 8005是8001的从节点
- 8006是8002的从节点
- 8004是8003的从节点
此时,我们需要输入yes
确认这个配置:
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.1.148:8001)
M: 423b23d250f83d9de63a34abe4d5d37da6f6c479 192.168.1.148:8001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 3cad2ba9c42abd34c650de12c6a5b2ac4b3dbdf2 192.168.1.148:8004
slots: (0 slots) slave
replicates f38fd7946eda90f448ddf0411d75603f4b587df4
S: 3efbb28e63cc70c91f7275232e3fc67d58dfb270 192.168.1.148:8005
slots: (0 slots) slave
replicates b840d4d34390a6ca1b32d68ca8390969e67c441c
M: f38fd7946eda90f448ddf0411d75603f4b587df4 192.168.1.148:8002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: b840d4d34390a6ca1b32d68ca8390969e67c441c 192.168.1.148:8003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: d857863fb19bd0ae001e9dc5c76d2e04a33e7164 192.168.1.148:8006
slots: (0 slots) slave
replicates 423b23d250f83d9de63a34abe4d5d37da6f6c479
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
看到[OK] All 16384 slots covered.
这个提示,就说明Redis三主三从集群已经成功搭建完成了!
总结
回顾整个过程,我们从拉取Redis镜像开始,创建了6个节点的配置文件和目录,启动了6个Redis容器,最后通过集群初始化命令将它们组成了一个三主三从的Redis集群。
这个集群实现了:
- 数据分片:3个主节点分别存储不同范围的哈希槽
- 数据备份:每个主节点都有一个从节点实时同步数据
- 高可用:当主节点出现故障时,从节点可以自动接管工作