【Redis学习3】Redis四种模式之主从复制

news2024/9/21 15:43:47

主从复制模式

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。
前者称为主节点(master),后者成为从节点(slave);数据的复制是单向,主要是由主节点到从节点。一个master挂载多个slave节点,当master服务宕机,会在多个slave节点中选举产生一个新的master节点,从而保证服务的高可用性。
在这里插入图片描述

主从模式配置很简单,只需要在从节点配置主节点的ip和端口即可

slaveof <masterip> <masterport>
# 例如
# slaveof 192.168.1.214 6379

启动主从节点的所有服务,查看日志即刻看到主从节点之间的服务连接。
从上面很容易就想到一个问题,既然主从复制,意味着master和slave的数据一样,存在数据冗余的问题。
在程序设计上,为了高可用性和高性能,是允许有冗余存在的,但是可以避免宕机影响用户体验。
优点:

  • 一旦主节点宕机,从节点作为主节点的备份可以随时代替主节点的工作
  • 扩展主节点的读能力,分担主节点的读压力
  • 高可用基石:除了上述作用以外,主从复制还是哨兵模式和集群模式能够实施的基础,因此说主从复制是Redis高可用的基石。
    缺点:
  • 一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。
  • 主节点的读写能力和存储能力受到单机的限制

主从模式的工作机制

在这里插入图片描述

当开启主从模式的时候,他的具体工作机制如下:

  1. 当slave启动后会向master发送SYNC命令,master节后到从数据库的命令后通过bgsave保存快照(「RDB持久化」),并且期间的执行的些命令会被缓存起来。
  2. 然后master会将保存的快照发送给slave,并且继续缓存期间的写命令。
  3. slave收到主数据库发送过来的快照就会加载到自己的数据库中。
  4. 最后master讲缓存的命令同步给slave,slave收到命令后执行一遍,这样master与slave数据就保持一致了。

docker构建Redis主从复制模式

创建主从模式

打开一个命令窗口,在其中运行如下命令创建一个名为redis-master的Redis容器。端口为6379

docker run -itd --name redis-master -p 6379:6379 redis:latest

在这里插入图片描述

创建第一个从服务器

新建一个命令窗口,在其中运行如下命令创建一个名为redis-slave1的容器,它的端口是6380.这里是在一台电脑上运行,所以用端口号来区别一台主Redis容器和另外两台从Redis容器。在真实项目里,多台Redis会部署在不同的服务器上,所以可以都用6379端口。

docker run -itd --name redis-slave1 -p 6380:6380 redis:latest

在这里插入图片描述

创建第二个从服务器

新建一个命令窗口,在其中运行如下命令创建一个名为redis-slave2的容器

 docker run -itd --name redis-slave2 -p 6381:6381 redis:latest

在这里插入图片描述

查看redis-master容器信息

回到包含redis-master容器的命令窗口,在其中运行docker inspect redis-master命令查看redis-master容器的信息,在其中能通过IPAddress项看到该容器的IP地址,这里是172.17.0.2。在真实项目里,Redis服务器所在的IP地址是固定的,而通过Docker容器启动的Redis服务器的IP地址是动态的,所以这里要用上述命来获取IP地址。
在这里插入图片描述

主从复制配置

运行docker exec -it redis-slave1 /bin/bash进入redis-slave1容器,并使用redis-cli进入redis客户端,在redis客户端里运行如下的slaveof命令,指定当前Redis服务器为从服务器。该命令的格式是slaveof ip port,这里指向172.17.0.2:6379所在的主服务器。
在这里插入图片描述在这里插入图片描述

同样,在redis-slave2容器的命令窗口里运行如下的slaveof命令,指定当前Redis服务器为从服务器
在这里插入图片描述

通过info replication命令查看主从配置信息

redis-master容器中:
在这里插入图片描述

从上面可以看到role为master,连接配置的从服务器有2台,分别是redis-slave1和redis-slave2
在redis-slave1和redis-slave中,可以看到主服务器的ip和它的连接状态
在这里插入图片描述
在这里插入图片描述

主从复制测试

在redis-master中设置个值set name ‘Peter’,再到从服务器上查看是否复制成功。
redis-master
在这里插入图片描述
在这里插入图片描述

主从复制常见问题

数据复制的延迟

读写分离时,master会异步将数据复制到slave,如果这时slave发生阻塞,则会延迟master数据的写命令,造成数据不一致的情况
解决方法:可以对slave的偏移量进行监控,如果发现某台slave的偏移量有问题,则将数据读取操作切换到master,但本身这个监控开销比较高,所以关于这个问题,大部分的情况是可以直接使用而不去考虑的。

规避全量复制

redis复制有全量复制和部分复制两种,而全量复制的开销是很大的,下面有几种出现全量复制的情况,可以尽量去规避全量复制。

  1. 第一次全量复制
    当我们一台slave第一次挂到master上时,是不可避免要进行一次全量复制的,那么,我们如何去降低开销呢?
    方案1:小主节点,例如我们将redis分成2G一个节点,这样一来,会加速RDB的生成和同步,同时可以降低我们fork子进程的开销(master会fork一个子进程来生成同步需要的RDB文件,而fork是要拷贝内存块的,如果主节点内存太大,fork的开销就大)
    方案2:既然第一次不可以避免,那我们可以选在集群低峰的时间(凌晨)进行slave的挂载。
  2. 节点RunID不匹配
    例如我们主节点重启(RunID发生变化),对于slave来说,它会保存之前master节点的RunID,如果它发现了此时master的RunID发生变化,那它会认为这是master过来的数据可能是不安全的,就会采取一次全量复制
    解决办法:对于这类问题,我们只有是做一些故障转移的手段,例如master发生故障宕机了,我们选举一台slave晋升为master(哨兵或集群)
  3. 复制积压缓冲区不足
    master生成RDB同步到slave,slave加载RDB这段时间里,master的所有写命令都会保存到一个复制缓冲队列里(如果主从直接网络抖动,进行部分复制也是走这个逻辑),待slave加载完RDB后,拿offset的值到这个队列里判断,如果在这个队列中,则把这个队列从offset到末尾全部同步过来,这个队列的默认值为1M。而如果发现offset不在这个队列,就会产生全量复制。
    解决办法:增大复制缓冲的设置rel_backlog_size默认1M,我们可以设置大一些,从而来加大我们offset的命中率。这个值,我们可以假设,一般我们网络故障时间一般是分钟级别,那我们可以根据我们当前的QPS来算一下每分钟可以写入多少字节,再乘以我们可能发生故障的分钟就可以得到我们这个理想的值。
    5.规避复制风暴
    什么是复制风暴?举例:我们master重启,其master下的所有slave检测到RunID发生变化,导致所有从节点向主节点做全量复制。尽量redis对这个问题做了优化,即只生成一份RDB文件,但需要多次传输,仍然开销很大
    (1)单主节点复制风暴:主节点重启,多从节点全量复制
    解决:更换复制拓扑如下图
    在这里插入图片描述

a.我们将原来master与slave中间加一个或多个slave,再在slave上加若干个slave,这样可以分担所有slave对master复制的压力。(这种架构还是有问题:读写分离的时候,slave1也发生了故障,怎么去处理?)
b.如果只是实现高可用,而不做读写分离,那当master宕机,直接晋升一台slave即可。
(2)单机器复制风暴:机器宕机后的大量全量复制,如下图:
在这里插入图片描述

当machine-A这个机器宕机重启,会导致该机器所有master下的所有slave同时产生复制
解决:
1.主节点分散多机器(将master分散到不同机器上部署)
2.还有我们可以采用高可用手段(slave晋升master)就不会有类似问题了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一把火烧掉了苹果摆脱中国制造的幻想,印度制造难担重任

这几年苹果不断推动印度制造&#xff0c;希望摆脱对中国制造的依赖&#xff0c;然而近期苹果在印度的一家代工厂发生大火却证明了苹果的这一计划遭受重大打击&#xff0c;印度制造根本就无法中国制造。一、印度制造屡屡发生幺蛾子苹果推动印度制造已有多年了&#xff0c;然而印…

Allegro如何刷新封装和库里的封装同步操作指导

Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols

算法刷题-python版-最大回文子串

文章目录回文字符串如何判断是回文字符串求解字符串的最大回文子串暴力求解中心扩展&#xff08;比较优的方式&#xff09;两种方式性能对比回文字符串 正读、反读都是同一个字符串本身&#xff0c;这样的字符串就是回文字符串。 如 abccba 是回文字符串&#xff1b; 而 abcd …

产品EMC传导发射超标问题分析与整改

某产品在入网测试电磁骚扰项目中&#xff0c;直流电源端口&#xff08;DC端口&#xff09;传导发射测试超标严重&#xff0c;在低频150kHz~2MHz之间&#xff0c;某些频点超标10dBuV以上。经过对电源单板现场整改&#xff0c;再次测试DC端口传导发射顺利通过&#xff0c;余量在5…

准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…

C#基础篇

枚举enum 枚举的使用 using System.Net.Http.Headers; using System.Runtime.InteropServices; using System.Security.Cryptography;namespace game_code {enum E_MonsterType{Normal,// 普通怪Boos// Boos怪}internal class Program{static void Main(string[] args){// 枚…

Linux信号量详解

一、什么是信号量信号量的本质是一种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。信号量就和互斥锁类似&#xff0c;本质上就是一个计数器&#xff08;全局变量&#xff09;。不同之处在于&#xff0c;互斥锁的值只有 2 个&#xff08;加锁 "lock" 和解锁…

Mysql Server原理简介

Mysql客户端包括JDBC、 Navicat、sqlyog&#xff0c;只是为了和mysql server建立连接&#xff0c;向mysql server提交sql语句。mysql server组件第一部分叫连接器主要承担的功能叫管理连接和验证权限&#xff0c;每次在进行数据库访问的时候&#xff0c;必然要输入用户名和密码…

421 Maximum login limit has been reached. on hdfs-over-ftp

使用 hdfs-over-ftp 时登录报错421 Maximum login limit has been reached. 本地测试连接第10个用户的时候会报这个异常 就是默认限制了用户登录数量。 DefaultConnectionConfig.java里private int maxLogins 10; 在HdfsOverFtpServer.java里修改了startServer()这个metho…

MSTP基础

MSTP基础引入背景技术概览PVSTP&#xff08;过渡&#xff09;MSTP单生成树的缺陷1&#xff1a;部分VLAN不通单生成树的缺陷2&#xff1a;无法实现流量的负载分担多生成树解决单生成树实例引入背景 RSTP在STP基础上进行了改进&#xff0c;实现了网络拓扑快速收敛。但由于局域网…

【redis学习篇】Redis三种持久化方式详解

官方文档 一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据…

程序员的上帝视角(4)——视角

对于开发人员来说&#xff0c;工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同&#xff0c;得到的设计方案可能是完全不同的。作为一个程序员&#xff0c;不能单单从个人视角来看待问题。而是要尝试从不同角色出发&#xff0c;不停思考。上…

C++——内存管理

一&#xff0c;为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样&#xff0c;而如何让各个类型在内存中合理分布就非常有必要&#xff0c;由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性&#xff0c;我们习惯于我们的日常世界&#xff0c;它以线性方式运作&#xff0c;没有不连续或突跳。 为此&#xff0c;我们学会了期望各种过程以连续方式运行&#xff0c;我们的内心为了让我们更有安全感&#xff0c;把很多事物的结果归于秩序&#xff0c…

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中&#xff0c;介绍了反转链表 我们利用了链表是逻辑连续的特点&#xff0c;逆置了链表的逻辑连接顺序&#xff0c;从而实现反转链表&#xff1a; 戳我查看反转链表详…

【编程基础之Python】11、Python中的表达式

【编程基础之Python】11、Python中的表达式Python中的表达式表达式与运算符算术表达式赋值表达式比较表达式逻辑表达式位运算表达式总结Python中的表达式 在Python中&#xff0c;表达式是由操作数、运算符和函数调用等组成的语法结构&#xff0c;可以进行各种数学运算、逻辑判…

Maven环境下构建多模块项目

使用maven提供的多模块构建的特征完成maven环境下多模块的项目的管理和构建 这里以四个模块为例来搭建项目&#xff0c;以达到通俗易懂的初衷 模块 maven_parent -- 基模块&#xff0c;也就是常说的parent (pom) 模块 maven_dao -- 数据库访问层&#xff0c;例如jdbc操作(jar) …

华为OD机试题,用 Java 解【查找重复代码】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

深度学习技巧应用3-神经网络中的超参数搜索

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中&#xff0c;一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数&#xff0c;例如&#xff1a;学习率、正则…

计算机科学导论笔记(三)

五、计算机组成 计算机组成部件可以分为三大类&#xff08;子系统&#xff09;&#xff1a;中央处理单元&#xff08;CPU&#xff09;、主存储器和输入/输出子系统。 5.1 中央处理单元&#xff08;CPU&#xff09; 中央处理单元用于数据的运算&#xff0c;分为算术逻辑单元&a…