Docker部署Redis主从复制
Redis主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
相关知识链接
Redis 主从复制-CSDN博客文章浏览阅读1.8k次,点赞17次,收藏9次。从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接,如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行 slaveof no one 取消复制,关于连接失败,可以在从节点执行 info replication 查看 master_link_down_since_seconds 指标,它会记录与主节点连接失败的系统时间。在命令传播阶段,主节点除了将写命令发送给从节点,还会发送一份给复制积压缓冲区,作为写命令的备份;_redis 主从复制https://blog.csdn.net/ddf128/article/details/142312394
1. 安装redis
1.1 准备工作
角色 | IP | 端口 | 名称 |
主服务器 | 192.168.1.42 | 6371 | redis-master |
从服务器 | 192.168.1.42 | 6372 | redis-slave |
1.2 部署redis
相关知识链接
Docker部署Redis_redis docker 映射-CSDN博客文章浏览阅读797次,点赞17次,收藏11次。docker部署redis,Docker 镜像是用于创建容器的蓝图,包含了运行应用的所有依赖,如代码、运行时、库和配置文件。它们是轻量级、可移植的,确保应用在任何环境中都能一致运行。每个镜像由多个层组成,每层对应Dockerfile中的一个指令,这种分层帮助实现资源共享,优化存储和传输效率。Docker 镜像可以通过docker build创建,也可以从公共或私有仓库如Docker Hub拉取。使用docker pull命令获取镜像,通过docker push将自定义镜像上传至仓库,以便在多台机器或环境中共_redis docker 映射https://blog.csdn.net/ddf128/article/details/143450894
2.部署主服务器
2.1 修改配置
创建数据卷文件
[root@192 /]# mkdir -p /redis/master/data
[root@192 /]# mkdir -p /redis/master/conf/
[root@192 /]# cd /redis/master
[root@192 master]# ls
conf data
修改配置内容
vi /redis/master/conf/redis.conf
# 开启密码验证(可选)
# requirepass xxx# 允许redis外地连接,需要注释掉绑定的IP
bind 0.0.0.0# 关闭保护模式(可选)
protected-mode no# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no# 开启redis数据持久化, (可选)
appendonly yes# 设置主从复制密码
# redis auth与主从复制密码需要一致
# masterauth xxx
2.2 创建容器
docker run --name redis-master --privileged=true \
-p 6371:6379 \
-v /redis/master/data:/data \
-v /redis/master/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
2.3 测试成功
进入容器
[root@192 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e8e2a258de6 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 /]# docker exec -it 0e8e2a258de6 /bin/bash
root@0e8e2a258de6:/data# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
查看配置文件
3.部署从服务器
3.1 修改配置
创建数据卷文件
[root@192 /]# mkdir -p /redis/slave/data
[root@192 /]# mkdir -p /redis/slave/conf
[root@192 /]# cd redis
[root@192 redis]# ls
master slave
[root@192 redis]# cd slave/
[root@192 slave]# ls
conf data
[root@192 slave]#
配置内容
vi /redis/slave/conf/redis.conf
# 开启密码验证(可选)
# requirepass xxx# 允许redis外地连接,需要注释掉绑定的IP
bind 0.0.0.0# 关闭保护模式(可选)
protected-mode no# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no# 开启redis数据持久化, (可选)
appendonly yes# 设置主从复制密码
# redis auth与主从复制密码需要一致
# masterauth xxx# 主从配置 最为重要
replicaof 192.168.1.42 6371
3.2 创建容器
docker run --name redis-slave --privileged=true \
-p 6372:6379 \
-v /redis/slave/data:/data \
-v /redis/slave/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
3.3 测试成功
[root@192 conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fc1a30508b redis "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp redis-slave
0e8e2a258de6 redis "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 conf]# docker exec -it 09fc1a30508b /bin/bash
root@09fc1a30508b:/data# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
查看配置文件
4.主从数据复制测试
主服务器查看复制信息
从服务器查看复制信息
数据测试
主服务器中设置数据
[root@192 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fc1a30508b redis "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp redis-slave
0e8e2a258de6 redis "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 /]# docker exec -it 0e8e2a258de6 /bin/bash
root@0e8e2a258de6:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.1,port=6379,state=online,offset=434,lag=1
master_failover_state:no-failover
master_replid:778489c1f276992db977ae9d4c7e1b9ad6054c16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
127.0.0.1:6379> set name wktime
OK
127.0.0.1:6379> get name
"wktime"
127.0.0.1:6379>
从服务器中查看是否存在主服务器中数据
[root@192 conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fc1a30508b redis "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp redis-slave
0e8e2a258de6 redis "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp redis-master
[root@192 conf]# docker exec -it 09fc1a30508b /bin/bash
root@09fc1a30508b:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.1.42
master_port:6371
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:658
slave_repl_offset:658
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:778489c1f276992db977ae9d4c7e1b9ad6054c16
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:658
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:658
127.0.0.1:6379> get name
"wktime"
127.0.0.1:6379>
到此,redis主从复制搭建完毕。 一主多从原理一样,多部署几个从服务器就可以了。
5.最后
感谢大家,请大家多多支持!