前言
注意:该文章不会讲解Redis集群搭建的原理,只讲述如何通过Docker容器快速部署搭建Redis主从 + 哨兵模式
的集群
准备工作:
- 一台云服务器 or 本地虚拟机(CentOS和Ubuntu都可以)
- 安装好Docker环境(Docker、DockerCompose),参考6.3章节:https://blog.csdn.net/weixin_46594796/article/details/122750009
- 关闭防火墙、开放将要使用的安全组(6379,6380,6381)
主从复制(1主2从)
这个操作很简单,在opt
目录下创建docker-compose.yml
文件,注释很详细,就不啰嗦了,内容如下:
version: '3.3'
# Docker网络:bridge驱动(默认)
networks:
redis-net:
driver: bridge
services:
# 主Redis
redis-master:
# Docker镜像版本
image: redis:6.2.5
# Docker容器名称
container_name: redis-master
# 主库Redis启动命令,密码为:123456
command: redis-server --requirepass 123456
# 宿主机与Docker容器的端口映射
ports:
- "6379:6379"
# 容器所在的网络
networks:
- redis-net
# 从Redis1
redis-slave1:
# Docker镜像版本
image: redis:6.2.5
# Docker容器名称
container_name: redis-slave1
# 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
command: redis-server --slaveof redis-master 6379 --masterauth 123456
# 宿主机与Docker容器的端口映射
ports:
- "6380:6379"
# 启动该服务前先启动 redis-master
depends_on:
- redis-master
# 容器所在的网络
networks:
- redis-net
# 从Redis2
redis-slave2:
# Docker镜像版本
image: redis:6.2.5
# Docker容器名称
container_name: redis-slave2
# 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
command: redis-server --slaveof redis-master 6379 --masterauth 123456
# 启动该服务前先启动 redis-master
depends_on:
- redis-master
# 宿主机与Docker容器的端口映射
ports:
- "6381:6379"
# 容器所在的网络
networks:
- redis-net
直接启动Redis主从集群:
docker-compose up -d
查看三个Redis节点启动状态:
docker ps
通过Redis客户端为主Redis库插入一条数据后发现,从库也会同步主库中的数据了!
2、哨兵模式(3哨兵)
首先,在opt目录下创建config文件夹:
# 创建config目录
cd opt
mkdir config
重新调整docker-compose.yml
,加入3个哨兵节点配置,然后docker-compose up -d
启动:
version: '3.3'
# Docker网络:bridge驱动(默认)
networks:
redis-net:
driver: bridge
services:
# 主Redis
redis-master:
# Docker镜像版本
image: redis:latest
# Docker容器名称
container_name: redis-master
# 主库Redis启动命令,密码为:123456
command: redis-server --requirepass 123456
# 宿主机与Docker容器的端口映射
ports:
- "6379:6379"
volumes:
- /opt/config/master.conf:/etc/redis/master.conf
# 容器所在的网络
networks:
- redis-net
# 从Redis1
redis-slave1:
# Docker镜像版本
image: redis:latest
# Docker容器名称
container_name: redis-slave1
# 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
command: redis-server --slaveof redis-master 6379 --masterauth 123456
# 宿主机与Docker容器的端口映射
ports:
- "6380:6379"
volumes:
- /opt/config/slave1.conf:/etc/redis/slave1.conf
# 启动该服务前先启动 redis-master
depends_on:
- redis-master
# 容器所在的网络
networks:
- redis-net
# 从Redis2
redis-slave2:
# Docker镜像版本
image: redis:latest
# Docker容器名称
container_name: redis-slave2
# 启动命令:当前节点启动作为redis-master 6379的从库,主库密码为123456
command: redis-server --slaveof redis-master 6379 --masterauth 123456
# 启动该服务前先启动 redis-master
depends_on:
- redis-master
# 宿主机与Docker容器的端口映射
ports:
- "6381:6379"
volumes:
- /opt/config/slave2.conf:/etc/redis/slave2.conf
# 容器所在的网络
networks:
- redis-net
# Redis哨兵1
redis-sentinel1:
# Docker镜像版本
image: redis:latest
# Docker容器名称
container_name: redis-sentinel-1
# 启动命令:配置哨兵节点,监控主节点redis-master
command: redis-sentinel /etc/redis/sentinel.conf
# 宿主机与Docker容器的端口映射
ports:
- "26379:26379"
volumes:
- /opt/config/sentinel1.conf:/etc/redis/sentinel.conf
# 启动该服务前先启动 redis-master 和 redis-slave1 和 redis-slave2
depends_on:
- redis-master
- redis-slave1
- redis-slave2
# 容器所在的网络
networks:
- redis-net
# Redis哨兵2
redis-sentinel2:
# Docker镜像版本
image: redis:latest
# Docker容器名称
container_name: redis-sentinel-2
# 启动命令:配置哨兵节点,监控主节点redis-master
command: redis-sentinel /etc/redis/sentinel.conf
# 宿主机与Docker容器的端口映射
ports:
- "26380:26379"
volumes:
- /opt/config/sentinel2.conf:/etc/redis/sentinel.conf
# 启动该服务前先启动 redis-master 和 redis-slave1 和 redis-slave2
depends_on:
- redis-master
- redis-slave1
- redis-slave2
# 容器所在的网络
networks:
- redis-net
# Redis哨兵3
redis-sentinel3:
# Docker镜像版本
image: redis:latest
# Docker容器名称
container_name: redis-sentinel-3
# 启动命令:配置哨兵节点,监控主节点redis-master
command: redis-sentinel /etc/redis/sentinel.conf
# 宿主机与Docker容器的端口映射
ports:
- "26381:26379"
volumes:
- /opt/config/sentinel3.conf:/etc/redis/sentinel.conf
# 启动该服务前先启动 redis-master 和 redis-slave1 和 redis-slave2
depends_on:
- redis-master
- redis-slave1
- redis-slave2
# 容器所在的网络
networks:
- redis-net
在opt目录下创建sentinel.conf
哨兵配置文件,将下方内容拷贝到文件中(根据情况自行调整):
port 26379
dir /tmp
# Sentinel 监视一个名为 mymaster 的主服务器(主Redis判断为失效至少需要 2 个 Sentinel 投票)
sentinel monitor mymaster <主Redis的IP> 6379 2
# 授权主Redis密码
sentinel auth-pass mymaster 123456
# 指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 30000
# 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步,
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
将该配置文件拷贝三份(如果有同名文件先删除),文件名分别是:
sentinel1.conf
sentinel2.conf
sentinel3.conf
重启DockerCompose文件,依次执行下方命令:
docker-compose down
docker-compose up -d
接下来准备测试,通过docker ps
查看一下6个节点运行情况:
停掉Redis主机点,看看是否会选举从节点为主节点:
# 停止主Redis节点
docker stop redis-master
# 查看哨兵节点日志
docker logs -f c277bfa6f0a8
下图可以看到,哨兵节点进行了投票选举,端口为6381的Redis从节点
晋升为主节点
:
进入到6381的Redis容器内部,通过info
命令查看当前节点身份:
# 进入Docker容器内部
docker exec -it 9b13c3a74734 redis-cli
# 查看身份
info
可以看到,6381的Redis节点变成了Master
身份,哨兵进行了故障转移,重新选举
: