docker compose 搭建 redis 主从复制集

环境准备

  • 安装 docker
  • 安装 docker compose

创建目录和配置

  • 目录结构
  • master 主节点: redis.conf
bash 复制代码
# 主节点配置
# 绑定的主机地址
bind 0.0.0.0
# 允许外网访问
protected-mode no
# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
daemonize no
# 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
# 指定Redis监听端口,默认端口为6379
# 如果指定0端口,表示Redis不监听TCP连接
port 6379
# 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 0
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
# debug (很多信息, 对开发/测试比较有用)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel verbose
# 日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null
logfile redis.log

################################ SNAPSHOTTING  #################################
# RDB存储配置
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   满足以下条件将会同步数据:
#   900秒(15分钟)内有1个更改
#   300秒(5分钟)内有10个更改
#   60秒内有10000个更改
#   Note: 可以把所有"save"行注释掉,这样就取消同步操作了
save 900 1
save 300 10
save 60 10000
# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
# 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定
dir /data



################################# REPLICATION #################################


################################## SECURITY ###################################
# 设置密码
requirepass masterpassword

############################## APPEND ONLY MODE ###############################
# 开启aof配置
appendonly yes
# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
# 指定更新日志文件名,默认为appendonly.aof
appendfilename "appendonly.aof"
  • slave1 从节点1 : redis.conf
bash 复制代码
# 从节点配置
# 绑定的主机地址
bind 0.0.0.0
# 允许外网访问
protected-mode no
# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
daemonize no
# 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
# 指定Redis监听端口,默认端口为6379
# 如果指定0端口,表示Redis不监听TCP连接
port 6379
# 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 0
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
# debug (很多信息, 对开发/测试比较有用)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel verbose
# 日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null
logfile redis.log

################################ SNAPSHOTTING  #################################
# RDB存储配置
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   满足以下条件将会同步数据:
#   900秒(15分钟)内有1个更改
#   300秒(5分钟)内有10个更改
#   60秒内有10000个更改
#   Note: 可以把所有"save"行注释掉,这样就取消同步操作了
save 900 1
save 300 10
save 60 10000
# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
# 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定
dir /data


################################# REPLICATION #################################
# 设置当本机为slav服务时,设置master服务的ip地址及端口,在Redis启动时,它会自动从master进行数据同步
replicaof redis-master 6379
# 开启只读模式
replica-read-only yes
# 当master服务设置了密码保护时,slav服务连接master的密码
masterauth masterpassword

repl-diskless-load on-empty-db

################################## SECURITY ###################################
# 设置密码
requirepass slavepassword

############################## APPEND ONLY MODE ###############################
# 开启aof配置
appendonly yes
# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
# 指定更新日志文件名,默认为appendonly.aof
appendfilename "appendonly.aof"
  • slave2 从节点2: redis.conf
    和 slave1 从节点1 配置一致,复制一份即可

启动redis服务

bash 复制代码
docker-compose up -d

验证主从复制

  • 检查主节点信息
bash 复制代码
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a masterpassword info replication

执行上述命令,得到以下输出:role表示角色,connected_slaves表示副本数

bash 复制代码
# Replication
role:master
connected_slaves:2
  • 检查从节点1信息
bash 复制代码
docker exec -it redis-slave1 redis-cli -h 127.0.0.1 -p 6379 -a slavepassword info replication

执行上述命令,得到以下输出:role表示角色,master_link_status表示是否连接成功,up表示成功,down表示失败

bash 复制代码
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
  • 检查从节点2信息
bash 复制代码
docker exec -it redis-slave2 redis-cli -h 127.0.0.1 -p 6379 -a slavepassword info replication

执行上述命令,得到以下输出:role表示角色,master_link_status表示是否连接成功,up表示成功,down表示失败

bash 复制代码
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up

数据持久化验证

  • 写入数据到主节点
bash 复制代码
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a masterpassword SET test_data "test_data"
  • 主节点读取数据查看是否设置成功
bash 复制代码
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a masterpassword GET test_data
  • 从节点1读取数据,查看是否同步
bash 复制代码
docker exec -it redis-slave1 redis-cli -h 127.0.0.1 -p 6379 -a slavepassword GET test_data
  • 从节点2读取数据,查看是否同步
bash 复制代码
docker exec -it redis-slave2 redis-cli -h 127.0.0.1 -p 6379 -a slavepassword GET test_data
相关推荐
reddingtons24 分钟前
在 Ubuntu 下通过 Docker 部署 Caddy 和 PHP-FPM 服务器
服务器·ubuntu·docker
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据分布式缓存一致性维护策略解析(109)
java·大数据·redis·分布式·分布式缓存·redlock·一致性维护
酥暮沐1 小时前
Docker 学习(一)
运维·docker·容器
你可以叫我仔哥呀2 小时前
k8s学习记录:环境搭建二(基于Kubeadmin)
学习·容器·kubernetes
andrew_12193 小时前
Redis常见面试题大白话简答,关于认识Redis及其数据结构、线程模型和持久化
数据结构·数据库·redis
wy02_4 小时前
【微服务】优惠券(有限)秒杀的实现思路--使用Redis预扣减优惠券库存,结合Redisson锁保证并发安全,通过异步消息队列更新数据库库存
数据库·redis·微服务
双普拉斯4 小时前
深入解析数据倾斜:原因、影响与优化方案
数据库·redis·分布式
谬了个大也5 小时前
redis --- 相关基础知识整理
数据库·redis·缓存
别惹CC5 小时前
【分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
redis·分布式·算法
a_j585 小时前
k8s面试题总结(七)
云原生·容器·kubernetes