当前位置: 首页 > news >正文

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.最后

感谢大家,请大家多多支持!


http://www.mrgr.cn/news/68169.html

相关文章:

  • 基于Spring Boot的高校汉服租赁网站的设计与实现,LW+源码+讲解
  • Flutter中文字体设置指南:打造个性化的应用体验
  • 【Android】SharedPreferences存储中没有 Double 类型数据存储的解决方式
  • OpenAl高价收购域名丨已指向Chat GPT官网
  • webrtc前端播放器完整案例
  • .NET 8 中 Entity Framework Core 的使用
  • 看了《逆行人生》,我想到的是程序员的出路不只有外卖员,转型自媒体博主:或许是技术与内容的双向奔赴
  • Golang | Leetcode Golang题解之第546题移除盒子
  • 【划分型 DP】力扣139. 单词拆分
  • C++类的多重继承演示
  • 一文透彻了解电容
  • 机器学习(五)——支持向量机SVM(支持向量、间隔、正则化参数C、误差容忍度ε、核函数、软间隔、SVR、回归分类源码)
  • 解决中文乱码问题:常见原因与解决方案
  • 【我的世界】宠物不认我了?怎么更换主人?(Java版)
  • STM32外设应用研究
  • 【系统集成项目管理工程师教程】第14章 收尾过程组
  • 【系统集成项目管理工程师教程】第13章 监控过程组
  • 电路原理:电阻桥。
  • 深入掌握高级SQL技巧
  • leetcode hot100【LeetCode 78. 子集】java实现
  • 二分查找习题篇(上)
  • Nextjs14记录
  • 认识软件测试
  • ◇【论文_20160610】Generative Adversarial Imitation Learning 【附录 A】
  • 大模型学习笔记------CLIP模型解读与思考
  • NAT网络工作原理和NAT类型