使用docker搭建redis主从架构,一主2从
使用Docker搭建Redis主从架构(一主两从)
Redis主从架构是提高系统可用性和读取性能的重要方案,通过Docker可以快速搭建该架构。下面将详细介绍搭建步骤。
架构设计
我们将搭建包含以下组件的架构:
- 1个主节点(Master):负责写入操作,端口6379
- 2个从节点(Slave):负责读取操作,端口分别为6380和6381
- 所有节点通过Docker Compose管理,共享一个自定义网络
搭建步骤
1. 创建项目目录
首先在主机上创建项目目录并进入:
mkdir redis-master-slave && cd redis-master-slave
2. 准备配置文件
创建Redis配置文件目录并编写基础配置:
mkdir config
主节点配置(config/master.conf)
# 绑定所有网络接口
bind 0.0.0.0
# 端口
port 6379
# 启用持久化
save 900 1
save 300 10
save 60 10000
# 关闭保护模式
protected-mode no
# 日志文件
logfile "redis-master.log"
从节点配置模板(config/slave-template.conf)
# 绑定所有网络接口
bind 0.0.0.0
# 从节点端口(将在启动时动态替换)
port {{PORT}}
# 启用持久化
save 900 1
save 300 10
save 60 10000
# 关闭保护模式
protected-mode no
# 日志文件
logfile "redis-slave{{SLAVE_ID}}.log"
# 只读模式(从节点不允许写入)
read-only yes
3. 编写Docker Compose文件
创建docker-compose.yml
文件:
version: '3.8'services:# Redis主节点服务redis-master:image: redis:7.0container_name: redis-masterports:- "6379:6379"volumes:- ./config/master.conf:/usr/local/etc/redis/redis.conf- redis-data-master:/datacommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]healthcheck:test: ["CMD", "redis-cli", "ping"]interval: 5stimeout: 5sretries: 5networks:- redis-network# Redis从节点1redis-slave1:image: redis:7.0container_name: redis-slave1ports:- "6380:6380"volumes:- ./config/slave-template.conf:/usr/local/etc/redis/redis.conf.template- redis-data-slave1:/dataenvironment:- PORT=6380- SLAVE_ID=1- MASTER_HOST=redis-master- MASTER_PORT=6379command: >sh -c 'sed "s|{{PORT}}|${PORT}|g; s|{{SLAVE_ID}}|${SLAVE_ID}|g" /usr/local/etc/redis/redis.conf.template > /usr/local/etc/redis/redis.conf && redis-server /usr/local/etc/redis/redis.conf --slaveof ${MASTER_HOST} ${MASTER_PORT}'healthcheck:test: ["CMD", "redis-cli", "-p", "6380", "ping"]interval: 5stimeout: 5sretries: 5networks:- redis-network# Redis从节点2redis-slave2:image: redis:7.0container_name: redis-slave2ports:- "6381:6381"volumes:- ./config/slave-template.conf:/usr/local/etc/redis/redis.conf.template- redis-data-slave2:/dataenvironment:- PORT=6381- SLAVE_ID=2- MASTER_HOST=redis-master- MASTER_PORT=6379command: >sh -c 'sed "s|{{PORT}}|${PORT}|g; s|{{SLAVE_ID}}|${SLAVE_ID}|g" /usr/local/etc/redis/redis.conf.template > /usr/local/etc/redis/redis.conf && redis-server /usr/local/etc/redis/redis.conf --slaveof ${MASTER_HOST} ${MASTER_PORT}'healthcheck:test: ["CMD", "redis-cli", "-p", "6381", "ping"]interval: 5stimeout: 5sretries: 5networks:- redis-networkvolumes:redis-data-master:redis-data-slave1:redis-data-slave2:networks:redis-network:driver: bridge
4. 启动服务
在项目目录下执行:
docker-compose up -d
5. 验证主从架构
方法1:使用redis-cli命令检查
- 连接主节点:
redis-cli -p 6379
- 查看主节点信息:
info replication
输出中应看到:
# Replication
role:master
connected_slaves:2
slave0:ip=172.XX.XX.XX,port=6380,state=online,offset=XXX,lag=1
slave1:ip=172.XX.XX.XX,port=6381,state=online,offset=XXX,lag=1
- 连接从节点1:
redis-cli -p 6380
- 查看从节点信息:
info replication
输出中应看到:
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
方法2:测试数据同步
- 在主节点设置数据:
redis-cli -p 6379 set test-key "Hello Master"
- 在从节点读取数据:
redis-cli -p 6380 get test-key
# 应输出 "Hello Master"
redis-cli -p 6381 get test-key
# 应输出 "Hello Master"
架构说明
关键配置解析
-
网络配置:
- 使用自定义桥接网络
redis-network
,使容器间可通过服务名直接通信 - 主节点服务名
redis-master
被从节点配置为复制目标
- 使用自定义桥接网络
-
动态配置实现:
- 从节点使用模板配置文件,通过环境变量和sed命令动态生成最终配置
--slaveof
参数在启动时指定主节点地址
-
数据持久化:
- 每个节点都有独立的数据卷,确保容器重启后数据不丢失
- 配置文件挂载到容器内,便于修改和维护
扩展与优化
-
添加密码认证:
在主节点配置中添加requirepass your-password
,从节点配置中添加masterauth your-password
-
哨兵模式(Sentinel):
可进一步添加哨兵节点,实现主节点故障自动切换,提高高可用性 -
资源限制:
在Docker Compose中添加resources
字段,限制各节点使用的CPU和内存