Redis主从复制搭建

news2024/12/25 9:07:01

Redis主从复制搭建

Redis虽然拥有非常高的性能,但是在实际的生产环境中,使用单机模式还是会产生不少问题的,比如说容易出现

单机故障,容量瓶颈,以及QPS瓶颈等问题。通常环境下,主从复制哨兵模式Redis Cluster是3种比较常见

的解决方案,本文将通过实例演示如何搭建Redis主从复制环境,并对其原理进行分析。

1、搭建主从复制

1、创建3个目录redis8000redis8001redis8002目录下。

将默认配置文件redis.conf拷贝到redis8000下,将redis8000指定为主机,修改以下参数:

bind 0.0.0.0
port 8000
pidfile /var/run/redis_8000.pid
logfile "redis8000.log"
dbfilename dump8000.rdb
dir /home/hydra/files/redis/slave/redis8000/
requirepass 123456
daemonize yes
masterauth 123456

2、将修改后的redis.conf文件拷贝到redis8001redis8002目录下,然后进行修改:

bind 0.0.0.0
port 8001
pidfile /var/run/redis_8001.pid
logfile "redis8001.log"
dbfilename dump8001.rdb
dir /home/hydra/files/redis/slave/redis8001/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes
bind 0.0.0.0
port 8002
pidfile /var/run/redis_8002.pid
logfile "redis8002.log"
dbfilename dump8002.rdb
dir /home/hydra/files/redis/slave/redis8002/
# replicaof 127.0.0.1 8000
slaveof 127.0.0.1 8000
requirepass 123456
masterauth 123456
# 从机开启aof持久化
appendonly yes
daemonize yes

3、分别启动3个redis实例

./redis-5.0.4/src/redis-server  ./slave/redis8000/redis.conf
./redis-5.0.4/src/redis-server  ./slave/redis8001/redis.conf
./redis-5.0.4/src/redis-server  ./slave/redis8002/redis.conf

查看进程,启动成功:

在这里插入图片描述

4、通过redis客户端连接主机redis8000

./redis-5.0.4/src/redis-cli  -p 8000 -a 123456

登录成功后,使用指令查看主从架构:

info replication

在这里插入图片描述

可以看出,主机8000拥有两台从机,从机8001和8002连接成功。

5、通过redis客户端连接从机redis80001,同样通过指令查看主从状态:

在这里插入图片描述

可以看出8001的角色为slave从机,并且可以查看主机8001的相关信息。

6、此外,还可以通过指令的模式动态分配主从。复制一个redis8000的配置文件至redis8003下,修改端口为

8003,其他配置不做改动。

bind 0.0.0.0
port 8003
pidfile /var/run/redis_8003.pid
logfile "redis8003.log"
dbfilename dump8003.rdb
dir /home/hydra/files/redis/slave/redis8003/
requirepass 123456
daemonize yes

使用redis客户端登录8003后,输入指令指定主机:

slaveof 127.0.0.1 8000

动态指定主机后,如果主机设置了密码,还需要通过指令配置主机密码:

config set masterauth 123456

配置完成后,查看8003从机状态:

在这里插入图片描述

查看8000主机状态:

在这里插入图片描述

新添加的从机8003已经被添加到8000的从机当中。

需要注意的是,使用命令动态指定的主从状态,在从机重启后会失效。

首先使用kill命令杀死8003进程,然后查看主从状态:

在这里插入图片描述

可以发现,现在从机只剩下两台,为80018002

然后重启8003并再次查看状态:
在这里插入图片描述

仍然为80018002两台从机,证明了指令指定主从在重启后会失效。

7、进行读写测试,首先测试主机,读写均能正常:
在这里插入图片描述

测试从机,发现可以正常读数据,但是写数据失败:

在这里插入图片描述

这是因为在主从复制的架构下,只有主机能够写数据,从机为只读模式,这是在配置文件中指定的。在Redis2.6版

本以后,默认从机为只读模式:

replica-read-only yes

需要注意这里不能将这个配置改为no,因为主机不会监听到从机的写数据事件,因而造成主从数据的不一致。

二、全量复制

用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点。

当数据量过大的时候,会造成很大的网络开销,流程如下:
在这里插入图片描述

1、从机发送:

psync ? -1

这里的 “?” 是因为从机暂时不知道主机的runId, -1代表全量复制

2、主机发送指令,把自己的runid和offset传给从机:

fullresync{runid,offset}

可以通过命令查看这两个参数:

#可以查看runid
info server 
#可以查看offset
info replication

从机之后会上报自己的偏移量offset给主机,当主机的offset和从机的offset不一样时,说明数据不一致。

3、从机保存主机数据:

save master info

4、主机执行bgsave,全量复制会触发rdb持久化。

bgsave

主机在生成rdb文件时,可能会有新的数据写入。这时redis把新写入的数据写入一个缓冲区repl_back_buffer,默

认大小1M。可以通过repl-backlog-size设置缓冲区大小

5、主机发送rdb给从机:

send rdb

6、主机发送缓冲区数据给从机:

send buffer

7、从机把从机本身上的数据清空:

flush old data

8、从机加载主机发送过来的rdb和buffer数据:

load rdb&buffer

在全量复制中,消耗的时间包括:

  • 执行bgsave进行持久化的时间

  • rdb文件网络传输时间

  • 从节点请求请求数据时间

  • 从机加载rdb的时间

  • 如果从节点开启了aof持久化,可能进行aof重写的时间

三、部分复制

部分复制主要是Redis针对全量复制过高的开销进行的一种优化措施。Redis 希望能够在主机出现抖动或连接断开

的时候,可以通过部分复制机制将损失降低到最低。

在这里插入图片描述

具体流程如下:

1、出现网络抖动,连接断开 connection lost

2、主机继续写复制缓冲区repl_back_buffer

3、从机继续尝试连接主机

4、从机slave 会把自己当前 runid 和偏移量传输给主机 master,并且执行 pysnc 命令同步

5、如果 master 发现偏移量是在缓冲区的范围内,就会返回 continue 命令

6、同步了 offset 的部分数据,所以部分复制的基础就是偏移量 offset。

那么在正常的情况下,Redis是如何决定全量复制还是部分复制的呢?从机将自己的offset发送给主机后,主机

根据offset和缓冲区大小决定能否执行部分复制:

  • 如果offset偏移量之后的数据,仍然都在复制积压缓冲区里,则执行部分复制

  • 如果offset偏移量之后的数据已不在复制积压缓冲区中,则执行全量复制

四、主从复制架构缺点

1、由于所有的写操作都是先在主机上操作,然后同步更新到从机上,所以同步过程有一定的延迟,当系统很繁忙

的时候,延迟问题会更加严重。从机数量增加时,会使这个问题更加严重。

2、当主机宕机之后,将不能进行写操作,需要手动将从机升级为主机,从机需要重新指定主机。

手动在一台从机上执行下面命令,将它升级为主机:

slave of no one

再在其他从机上执行slave of指令,将自身变成新主机的从机:

slave of 192.168.0.1 port

可以看出这种情况下,当主机宕机后,后续的修复流程由人工操作,非常麻烦,因此在这种情况下Redis引入了哨

兵模式,来完成主机宕机后的自动故障转移。

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

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

相关文章

从关键新闻和最新技术看AI行业发展(2023.6.23-7.9第二期) |【WeThinkIn老实人报】

Rocky Ding 公众号:WeThinkIn 写在前面 【WeThinkIn老实人报】是WeThinkIn的全新栏目,旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的…

中国大学生服务外包创新创业大赛丨借 AI 之力,助“记账”难题

一、中国大学生服务外包创新创业大赛 赛事介绍 中国大学生服务外包创新创业大赛,是响应国家关于鼓励服务外包产业发展、加强服务外包人才培养的相关战略举措与号召,举办的每年一届的全国性竞赛。 大赛均由中华人民共和国教育部、中华人民共和国商务部…

08.SpringBoot请求相应

文章目录 1 请求1.1 Postman1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2 响应2.1 ResponseBody注解2.2 统一响应结果…

RHCE——二、时间服务器

时间服务器 一、时间服务器1、重要性2、Linux的系统时钟以及硬件时钟3、NTP网络时间协议4、Chrony介绍 二、chrony安装与配置1、安装2、Chrony配置文件分析3、实验3.1 实验13.2 实验2 三、chronyc命令1、查看时间服务器:2、chronyc sources输出分析3、其它命令4、常…

Docker网络的概念

一、说明 本文叙述Docker网络,介绍关于Docker网络、网桥网络、网桥网络、自定义网桥网络、主机网络、无网络 MACVLAN 和 IPVLAN 网络、叠加网络等网络模式。Docker 是一个用于开发、发布和运行应用程序的开放平台。 二、 什么是 Docker Networking? Doc…

如何在HTML里面使用session

原因在springboot项目里面不想使用jsp界面,怎么在HTML里面使用session呢? 借助sessionStorage方法,话不多说直接上代码 自定义一个js文件把这个代码放里面就可,根据具体业务来修改 // globalData 可以随便定义,调用的…

Facebook AI mBART:巴别塔的硅解

2018年,谷歌发布了BERT(来自transformers的双向编码器表示),这是一种预训练的语言模型,在一系列自然语言处理(NLP)任务中对SOTA结果进行评分,并彻底改变了研究领域。类似的基于变压器…

Shell脚本基础教程

Shell脚本基础教程 Shell参数定义 定义变量 想要定义变量,只需要使用如下命令即可。 variable_namevariable_valuevariable_name表示变量名,variable_value表示变量值。注意,等号与变量名和变量值之间不能有空格。 变量名的命名需要遵循…

速通蓝桥杯嵌入式省一教程:(六)PWM输出

定时器除了用于最基本的定时器计时中断以外,还可以用于输出PWM(Pulse Width Modulation)波,即脉冲宽度调制波形,也就是频率与占空比均可改变的矩形波。下面我们就使用PA1端口生成PWM波。 在Cube中,首先需要将PA1设置成定时器的通…

Android LiveData原理之-setValue和数据倒灌原理分析

一图胜万言,直接上图吧!有需要的同学们可以对着这张泳道图阅读源码,相信能够快速加深理解。

3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)

1.Ubuntu Qt 配置交叉编译环境 1.1 ubuntu 20.04安装Qt sudo apt-get install qtcreator 1.2 配置QT GCC配置同上 最后配置Kits 上面设置完成之后 ,设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上) 点击NEXT之后会出现连接被拒绝,不用担…

IEC61499/ OPCUA pub/sub 测试

OpenDACS 是基于OPCUA 信息模型的IEC61499 分布式自动控制系统。本文介绍它如何采用Opcua Pub/Sub 实现分布式设备中功能块之间的通信。 4diac 构建IEC61499 系统和应用 系统结构 试验系统共有三台设备,为了实验方便,我们让它们在一台Linux PC 上运行…

智能文件改名,一键与上上级目录名称同步,让文件整理更加便捷

在整理文件时,经常会遇到需要将文件名称与上上级目录名称保持一致的情况。手动逐个修改文件名不仅费时费力,还容易出错。现在,我们为你带来了一款智能文件改名工具,让你能够一键将文件名称改成跟上上级目录名称一样,让…

Qt+C++跑马灯-指示灯-风扇-虚线灯带-动画仿真

程序示例精选 QtC跑马灯-指示灯-风扇-虚线灯带-动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC跑马灯-指示灯-风扇-虚线灯带-动画仿真>>编写代码&#xff0c;代码整…

Vulnhub靶机系列 Infosec_Warrior1

InfoSecWarrior CTF 2020: 01官网地址 难易程度&#xff1a;So Easy 信息收集 主机发现 arp-scan -l端口扫描 nmap -A -p- 192.168.80.145目录爆破 dirsearch -u 192.168.80.145 -i 200访问80端口&#xff0c;只能看出是Apache站点&#xff0c;没有别的 访问一下sitemap.xm…

火山引擎ByteHouse:一套方案,让OLAP引擎在精准投放场景更高效

由于流量红利逐渐消退&#xff0c;越来越多的广告企业和从业者开始探索精细化营销的新路径&#xff0c;取代以往的全流量、粗放式的广告轰炸。精细化营销意味着要在数以亿计的人群中优选出那些最具潜力的目标受众&#xff0c;这无疑对提供基础引擎支持的数据仓库能力&#xff0…

开源ChatGPT系统源码 采用NUXT3+Laravel9后端开发 前后端分离版本

开源ChatGPT系统源码 采用NUXT3Laravel9后端开发 前后端分离版本 ChatGPT是一种基于AI的聊天机器人技术&#xff0c;它可以帮助用户与聊天机器人进行自然语言交流&#xff0c;以解决用户的问题或满足用户的需求。ChatGPT的核心技术是使用自然语言处理&#xff08;NLP&#xff…

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中&#xff0c;使用者Client过多依赖所操作对象内部的实现结构&#xff0c;如果对象内部的实现结构频繁发生变化&#xff0c;则使用者的代码结构将要频繁地修改&#xff0c;不利于代码地维护和扩展性&#xff1b;组合模式可以解决此类问题。组…

JQuery快速入门教程

1、JQuery快速入门 1.1、JQuery介绍 jQuery 是一个 JavaScript 库。所谓的库&#xff0c;就是一个 JS 文件&#xff0c;里面封装了很多预定义的函数&#xff0c;比如获取元素&#xff0c;执行隐藏、移动等&#xff0c;目的就 是在使用时直接调用&#xff0c;不需要再重复定义…