📚 高级篇 07. 分布式缓存 - 搭建 Redis 主从集群 (Docker 实战版)
一、 架构规划与核心思想
在本地只有一台电脑的情况下,为了模拟真实生产环境中的多台服务器,我们采用了 Docker 容器化部署。
🌟 我们的集群拓扑规划:
- 独立网络:
redis-ms-net(为了让三个节点能互相通信,且与外部项目隔离) - 带头大哥 (Master): 容器名
redis-master,宿主机端口7001。 - 从节点 1 (Slave 1): 容器名
redis-slave-1,宿主机端口7002。 - 从节点 2 (Slave 2): 容器名
redis-slave-2,宿主机端口7003。
核心优势: 完全不影响原来跑在 6379 端口的单机版 my-redis,实现了环境的完美隔离。
二、 核心实操命令解析
你执行的这一套脚本非常有技术含量,我们来拆解一下里面的核心参数,这都是以后进大厂必会的 Docker 基础:
1. 建立专属局域网
Bash
docker network create redis-ms-net
- 原理: 创建了一个 Docker 自定义网络。加入同一个自定义网络的容器,可以直接通过容器名相互访问,不需要知道对方的动态 IP。这就是为什么后面小弟可以直接写
--replicaof redis-master 6379的原因!
2. 启动 Master 节点
Bash
docker run -d --name redis-master --network redis-ms-net -p 7001:6379 redis:latest redis-server --bind 0.0.0.0 --protected-mode no
--network redis-ms-net:指定加入我们刚才创建的专属网络。-p 7001:6379:将容器内的标准6379端口映射到你电脑的7001端口。--protected-mode no:关闭保护模式,允许其他容器连入。
3. 启动 Slave 节点 (一键认大哥)
Bash
docker run -d --name redis-slave-1 --network redis-ms-net -p 7002:6379 redis:latest redis-server --bind 0.0.0.0 --protected-mode no --replicaof redis-master 6379
--replicaof redis-master 6379:这是精髓!直接在启动命令里强行注入配置,告诉它:“你的大哥叫redis-master,端口是6379(注意这里填的是容器内端口,不是宿主机端口)”。
三、 集群验证与读写分离测试
搭建完成后,你进行了极其标准的企业级验证流程:
1. 验证大哥身份 (info replication)
- 执行:
docker exec -it redis-master redis-cli info replication - 结果:看到
role:master和connected_slaves:2,证明大哥顺利上位,并且成功收编了两个小弟。
2. 验证数据同步 (极速同步)
- 在大哥处写:
docker exec -it redis-master redis-cli set name jack - 在小弟处读:
docker exec -it redis-slave-1 redis-cli get name(成功拿到 "jack")。 - 结论: 主从复制通道畅通无阻。
3. 验证读写分离强制力 (防止小弟造次)
- 试图在小弟处写:
docker exec -it redis-slave-1 redis-cli set age 18 - 结果报错:
READONLY You can't write against a read only replica. - 结论: 从节点默认开启了严格的只读模式,强行写入被无情拒绝,完美实现了读写分离。
四、 维护与清理指南
因为你做好了容器和网络的隔离,哪天如果不想玩主从集群了,只需要执行以下命令,就能干干净净地销毁它们,且绝对不会碰到你的 my-redis:
Bash
# 1. 强制删除三个集群容器
docker rm -f redis-master redis-slave-1 redis-slave-2
# 2. 删除专属网络
docker network rm redis-ms-net
学习总结
这节课你不仅掌握了 Redis 主从架构的搭建,还顺手把 Docker 容器编排、自定义网络通信实战演练了一遍,动手能力拉满!
⚠️ 但是,知其然还要知其所以然。底层原理拷问来了:
当你执行完 docker 启动命令,redis-slave-1 连上 redis-master 的那一瞬间,大哥是怎么把数据发给它的?是一条条发,还是打包发?如果小弟网络卡了断线重连,大哥还要重新发一遍全量数据吗?