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.rhkb.cn/news/307759.html

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

相关文章

【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer: 弱监督语义分割的多类令牌转换器一、介绍二、联系工作三、方法四、实验结果 Multi-class Token Transformer for Weakly Supervised Semantic Segmentation 本文提出了一种新的基于变换…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型,使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重:2B和7B。每种尺寸都带有经过预训练&a…

【动手学深度学习】15_汉诺塔问题

注: 本系列仅为个人学习笔记,学习内容为《算法小讲堂》(视频传送门),通俗易懂适合编程入门小白,需要具备python语言基础,本人小白,如内容有误感谢您的批评指正 汉诺塔(To…

人员抽烟AI检测算法原理介绍及实际场景应用

抽烟检测AI算法是一种基于计算机视觉和深度学习技术的先进工具,旨在准确识别并监测个体是否抽烟。该算法通过训练大量图像数据,使模型能够识别出抽烟行为的关键特征,如烟雾、手部动作和口部形态等。 在原理上,抽烟检测AI算法主要…

[lesson22]对象的销毁

对象的销毁 对象的销毁 生活中的对象都是被初始化后才上市的 生活中的对象被销毁前会做一些清理工作 一般而言,需要销毁的对象都应该做清理 解决方案 为每个类都提供一个public的free函数对象不在需要时立即调用free函数进行清理 存在的问题 free只是一个普通…

稀碎从零算法笔记Day44-LeetCode:整数转罗马数字

题型:贪心、模拟 链接: 12. 整数转罗马数字 - 力扣(LeetCode) 来源:LeetCode 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 …

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据(包括属性、详情图、SKU、价格等)可以通过以下几种方式实现: 使用淘宝数据抓取工具:这类工具,如某鱼等,能够自动化采集淘宝商品数据,并将其转换成CSV、Excel等格式&am…

【PyQt5】环境配置

PyQt5 环境配置 一、前言1.1 PyQt5介绍1.2 PyCharm集成Pyqt5 二、pyqt5安装三、PyQt5-tools工具包安装四、常用工具环境配置4.1、环境变量配置4。2、验证是否安装成功 五、pycharm中设置Qt工具(Qt Designer、PyUIC、PyRcc)5.1、配置Qt Designer5.2、配置…

C++11 设计模式4. 抽象工厂(Abstract Factory)模式

问题的提出 从前面我们已经使用了工厂方法模式 解决了一些问题。 现在 策划又提出了新的需求:对于各个怪物,在不同的场景下,怪物的面板数值会发生变化, //怪物分类:亡灵类,元素类,机械类 …

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接:https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码:q497

【零基础学数据结构】双向链表

1.双向链表的概念 1.1头节点 1.2带头双向循环链表 注意: 哨兵位创建后,首尾连接自己 1.3双链表的初始化 // 双向链表的初始化 void ListInit(ListNode** pphead) {// 给双链表创建一个哨兵位*pphead ListBuyNode(-1); } 2.双向链表的打印 // 双向…

扭蛋机小程序:线上扭蛋机模式发展空间有多大?

潮玩行业近几年的发展非常快,推动了扭蛋机市场的发展,越来越多的人加入到了扭蛋机赛道中,市场迎来了新的发展期。如今,我国的二次元文化的发展不断成熟,扭蛋机主打的二次元商品迎来了更多的商业机会。 一、互联网扭蛋机…

uniapp 上传视频到阿里云之后回显视频获取视频封面

uniapp 上传视频到阿里云之后回显视频获取视频封面 官网的解决方案 1.initial-time Number 指定视频初始播放位置&#xff0c;单位为秒&#xff08;s&#xff09;。 没什么卵用 2.使用 uni.createVideoContext(“myVideo”, this).seek(number)。 没什么卵用 <video :id&quo…

Proteus 8 的使用记录

创建仿真文件 新建文件&#xff1a;默认下一步&#xff0c;至完成创建。 功能选择如图&#xff1a; 放置器件 常用元器件名称 keywords 常用51单片机 AT89C52 晶振 CRYSTAL 电阻 RES 排阻 RESPACK-8 瓷片电容 CAP 电解电容 CAP-ELEC 单刀单掷开关 S…

【Tars-go】腾讯微服务框架学习使用03-- TarsUp协议

3 TarsUP协议 统一通信协议 TarsTup | TarsDocs (tarscloud.github.io) TarsDocs/base at master TarsCloud/TarsDocs (github.com) &#xff1a; 有关于tars的所有介绍 每一个rpc调用双方都约定一套数据序列化协议&#xff0c;gprc用的是protobuff&#xff0c;tarsgo是统一…

C语言 函数——函数封装与程序的健壮性

目录 函数封装&#xff08;Encapsulation&#xff09; 如何增强程序的健壮性&#xff1f; 如何保证不会传入负数实参&#xff1f; 函数设计的基本原则 函数封装&#xff08;Encapsulation&#xff09; 外界对函数的影响——仅限于入口参数 函数对外界的影响——仅限于一个…

[CSS]使用方式+样式属性

层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;与HTML一样&#xff0c;也是一种标记语言&#xff0c;其作用就是给HTML页面标签添加各种样式&#xff0c;定义网页的显示效果&#xff0c;将网页内容和显示样式进行分离&#xff0c;提高了显示功能。简单…

【漏洞复现】WordPress Welcart 任意文件读取漏洞(CVE-2022-4140)

0x01 产品简介 Welcart 是一款免费的 WordPress 电子商务插件。Welcart 具有许多用于制作在线商店的功能和自定义设置。您可以轻松创建自己的原始在线商店。 0x02 漏洞概述 Welcart存在任意文件读取漏洞&#xff0c;未授权的攻击者可以通过该漏洞读取任意文件&#xff0c;获…

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免 PCI 冲突、PCI 混淆以及 PCI 模3 千扰等现象。PCI 规划…