redis的主从复制(docker方式快速入门和实战)

目录

一、主从复制简介

二、配置主从服务器

2.1使用配置文件的形式来主从复制

2.2使用纯代码的方式来进行主从复制;

2.3脱离主服务器

三、一些注意事项


一、主从复制简介


        主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

        从 Redis 2.6 开始, 从服务器支持只读模式, 并且该模式为从服务器的默认模式。只读模式由 redis.conf 文件中的 slave-read-only 选项控制, 也可以通过 CONFIG SET parameter value (opens new window)命令来开启或关闭这个模式。只读从服务器会拒绝执行任何写命令, 所以不会出现因为操作失误而将数据不小心写入到了从服务器的情况。

        一个主服务器可以有多个从服务器,一个从服务器只能有一个主服务器,并且不支持主主复制。

        不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个主从链。

      确认了主从关系之后,主服务器可以读也可以写,但是从服务器就只能读了。从服务器一旦确认主服务器,那么在第一次启动时会复制主服务上的所有数据,并且这个从服务器上之前的数据会全部丢失。

参考资料:
Redis 复制 | DB-TUTORIAL

二、配置主从服务器

我本次创建三个redis服务,一个主服务,两个从服务。主服务在Linux上运行,两个从服务使用docker容器来创建;(三个redis的版本都是7.0.10)

2.1使用配置文件的形式来主从复制

注意要修改redis.conf配置文件的几个主要参数

# 修改配置
daemonize no  #后台启动(注意这里要改为no,即非后台启动,因为会和docker run -d 冲突)# 关闭保护模式,开启的话,只有本机才可以访问redis
protected-mode no  # 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)# 设置登录密码
requirepass 123456# 开启aof持久化
appendonly yes

使用docker创建两个从服务:

(由于dockerhub中redis官方给的镜像里面没有redis.conf文件,Redis官方发布的官方镜像是按照最小化配置进行的,以保持镜像的轻量级和通用性。为了方便以后更改配置,需要自己手动创建配置文件)

我现在本地的Linux文件中创建了一个redis.conf文件,这个文件是redis官方提供的初始redis配置文件,并在这个初始文件的基础上进行一些小小的改动。

redis官方的配置文件地址:redis/redis.conf at 7.0.10 · redis/redis · GitHub

# 修改配置
daemonize no  #后台启动(注意这里要改为no,即非后台启动,因为会和docker run -d 冲突)# 关闭保护模式,开启的话,只有本机才可以访问redis
protected-mode no  # 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)# 设置登录密码
requirepass 123456# 开启aof持久化
appendonly yes#用来指定主机:slaveof 主机ip 端口
slaveof 192.168.231.110 6379
#主机的密码
masterauth 123456

修改其中相应的配置;(配置主从关系时,只需要在从服务的配置文件中修改就行了,主服务器不变)

使用docker容器创建俩个redis服务,并在创建的容器的时候进行一些挂载:

docker run --name myredis01 \-v /usr/dockerMount/myredis01/redis_config/redis.conf:/etc/redis.conf \-v /usr/dockerMount/myredis01/redis_data:/data \-p 6380:6379 \-d redis:7.0.10 redis-server /etc/redis.conf

解释:

 -v /usr/dockerMount/myredis01/redis_config/redis.conf:/etc/redis.conf 容器启动的时候,将本机目录下面的redis.conf映射到容器中去

 -v /usr/dockerMount/myredis01/redis_data:/data 映射数据存储的路径

 -d redis:7.0.10 redis-server /etc/redis.conf  后台启动redis-server,并且指定配置文件启动

创建这个容器之后,我们可以进入到这个redis内部,由于我们已经在myredis01的配置文件中写上了主服务器的地址,那么启动这个服务之后,就会自动拉取redis主服务器中的内容了;

docker exec -it myredis01 redis-cli -a 123456

运行这个命令,可以进入redis的客户端

使用 docker exec -it 命令来执行 Docker 容器内的操作

直接查看我们所拥有的键:

keys *

可以看到我们的从服务能正确拉取到我们主服务中的数据;

查看主机信息:info Replication

查看从机信息:info Replication

能清晰的看到主机和从机的关系;

再新建一个从服务myredis02,同样的创建容器操作:

docker run --name myredis02 \-v /usr/dockerMount/myredis01/redis_config/redis.conf:/etc/redis.conf \-v /usr/dockerMount/myredis01/redis_data:/data \-p 6381:6379 \-d redis:7.0.10 redis-server /etc/redis.conf

再进入到这个容器的内部,能看到也同样拉取了我们主服务器中的数据;

至此,我们使用redis.conf配置文件的方式来配置主从复制就完成了,也就是配置一个redis.conf配置文件,并挂载到容器内部。

注意使用配置文件的方式,即使从服务掉线,那么再次连接时,也会重新读取主服务的数据;

2.2使用纯代码的方式来进行主从复制;

在新建一个redis容器,不进行任何的挂载:

docker run --name myredis03 -p 6382:6379 -d redis:7.0.10 

这个容器是新建的,它现在应该能读也能写。

slaveof 192.168.231.110 6379 config set masterauth 123456

运行这两个命令就可以使这个redis服务器变为从服务器了。(这种方式可能会有一些延迟)但是,这种通过命令行的方式进行的主从关系是很脆弱的,一旦从服务器就行重启,那么这段主从关系就会消失。适合短暂的进行数据库数据的同步。

2.3脱离主服务器

 slaveof no one

这个命令可以使从服务器脱离主从关系的绑定。使从服务器重新变为能读能写的redis服务。但是这个命令有一点鸡肋。它不是永久的。

 服务器停止复制后不会清空数据库,而是会保留之前复制产生的数据。

如果你的主从关系绑定在从服务器的redis.conf配置文件中,那么即使你在从服务器中运行了这个脱离命令,暂时的拥有了读写功能,但是从服务器一重启那么就会重新绑定主从关系。

如果主从关系是靠命令来进行绑定的,那么重启从服务器后自动就会脱离主从关系了。所以这个命令还是有一点鸡肋的。

三、一些注意事项

master主服务器会每个10秒去发一次心跳包,以此来检测从服务器是否还存活。

即使主服务器断线,那么从服务器也会等待主服务器重启,而不能选择新的主服务器。(但是可以使用redis的哨兵监控来指定新的主服务器。)

从节点会努力追赶主节点,最终从节点的状态会和主节点的状态将保持一致。如果网络断开了,主从节点的数据将会出现大量不一致,一旦网络恢复,从节点会采用多种策略努力追赶上落后的数据,继续尽力保持和主节点一致。

redis如何实现的数据同步?

1、slave启动成功连接到master后,会给master发送数据同步消息(发送sync命令)
2、master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
3、全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
4、增量复制:master继续将收集到的修改命令依次传给slave完成同步,
但是只要重新连接master,一次完全同步(全量复制)将会被自动执行
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616715.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第16天:信息打点-CDN绕过业务部署漏洞回链接口探针全网扫描反向邮件

第十六天 本课意义 1.CDN服务对安全影响 2.CDN服务绕过识别手法 一、CDN服务-解释差异识别 1.前置知识: 传统访问:用户访问域名–>解析服务器IP–>访问目标主机普通CDN:用户访问域名–>CDN节点–>真实服务器IP–>访问目标…

苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区

当你一早打开苹果电脑,结果系统突然提示: “启动磁盘已满,需要删除部分文件”。你会怎么办?如果你认为单纯靠清理废纸篓或者删除大型文件就能释放你的启动磁盘上的空间,那就大错特错了。其实苹果启动磁盘的清理技巧有很…

修改Catsxp暗蓝色背景

Catsxp浏览器自从123内核后,背景就是暗蓝色了,太辣眼睛了,开发者说是原生的。 今天我点击主题背景-恢复默认修复了! 所以是安装了一个主题引起的。

513.找树左下角的值

513.找树左下角的值 力扣题目链接(opens new window) 给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: 示例 2: 1,层序 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode…

Octree索引(体素近邻搜索,K近邻搜索,半径内近邻搜索)------PCL

体素近邻搜索 /// <summary> /// octree 体素近邻搜索 /// </summary> /// <param name"cloud">索引点云</param> /// <param name"searchPoint">索引点</param> /// <param name"resolution">分辨率…

学习MQ异步

1.MQ异步调用的优势 事件驱动模式&#xff1a; 优势&#xff1a; 总结&#xff1a; 2.初识MQ 核心概念以及结构&#xff1a; 常见的消息模型&#xff1a; 基本消息队列模型&#xff1a; 生产者代码&#xff1a; Testpublic void testSendMessage() throws IOException, Timeo…

Ubuntu去除烦人的顶部【活动】按钮

文章目录 一、需求说明二、打开 extensions 网站三、安装 GNOME Shell 插件四、安装本地连接器五、安装 Hide Activities Button 插件六、最终效果七、卸载本地连接器命令参考 本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 一、需求说明 使用 Ubuntu 的过程中&#xff0c;屏…

申请OV SSL证书

OV证书&#xff0c;即Organization Validation证书&#xff0c;是一种SSL/TLS证书类型&#xff0c;主要用于企业级应用&#xff0c;例如教育、政府、互联网等行业的大型企业和政府机关部门。与基础的域名验证&#xff08;DV&#xff09;证书相比&#xff0c;OV证书的验证过程更…

《哈迪斯》自带的Lua解释器是哪个版本?

玩过《哈迪斯》&#xff08;英文名&#xff1a;Hades&#xff09;吗&#xff1f;最近在研究怎么给这款游戏做MOD&#xff0c;想把它的振动体验升级到更高品质的RichTap。N站下载了一些别人做的MOD&#xff0c;发现很多都基于相同的格式&#xff0c;均是对游戏.sjon文件或.lua文…

MATLAB 点到平面距离的简易计算 (61)

MATLAB 点到平面的垂直距离 (61) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 一行代码计算点到平面的距离,下面是MATLAB版本的实现方法, 使用一组自定义的点和平面验证,结果表明计算正确: 二、算法实现 1.代码 代码如下(示例): % 定义点的坐标 point = …

Java 语言程序设计(基础篇)原书第10版 梁勇著 PDF 文字版电子书

简介 Java 语言程序设计&#xff08;基础篇&#xff09;原书第 10 版 是 Java 语言的经典教材&#xff0c;中文版分为基础篇和进阶篇&#xff0c;主要介绍程序设计基础、面向对象程序设计、GUI 程序设计、数据结构和算法、高级 Java 程序设计等内容。本书通过示例讲解问题求解…

IJCNN注册的时候付款失败

琢磨了一下&#xff0c;不是前面的填写信息有问题&#xff0c;而是付款信息的问题。 上面这三个没有什么好说的&#xff0c;都是数字&#xff0c;银行卡上面全部写了。 主要是这个name on card&#xff0c;不是填你的论文英文名字&#xff0c;也不是填银行卡上那个MR.中文名字…