Redis 之五:Redis 的主从复制

news2024/11/16 1:57:21

概念

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

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用

主从复制的作用主要包括:

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

如何使用主从复制

为了更直观的理解主从复制,在介绍其内部原理之前,先说明我们需要如何操作才能开启主从复制。

1. 建立复制

需要注意,主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情。

从节点开启主从复制,有 3 种方式:

(1)配置文件

在从服务器的配置文件中加入:slaveof

(2)启动命令

redis-server启动命令后加入 --slaveof

(3)客户端命令

Redis服务器启动后,直接通过客户端执行命令:slaveof ,则该Redis实例成为从节点。

上述 3 种方式是等效的,下面以客户端命令的方式为例,看一下当执行了slaveof 后,Redis 主节点和从节点的变化。

2. 实例

准备工作:启动两个节点

1) 复制配置文件

[root@localhost bin]# ls        ### 进入redis 安装目录下可执行目录
dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server
[root@localhost bin]# cp redis.conf redis1.conf        ### 复制配置文件作为其中一个从机
[root@localhost bin]# cp redis.conf redis2.conf        ### 复制配置文件作为其中一个从机
[root@localhost bin]# vi redis1.conf                 ### 修改redis1.conf端口为 6381
##***** :/6379 搜索即可找到

此时之前的 redis 实例端口为6379 ,现在又多一个6381。

接下来分别启动各自服务。

启动6379:

[root@localhost bin]# redis-server redis.conf      ###******* 注意使用各自的配置文件
16624:C 05 Aug 2021 09:11:14.767 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16624:C 05 Aug 2021 09:11:14.767 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=16624, just started
16624:C 05 Aug 2021 09:11:14.767 # Configuration loaded
[root@localhost bin]# redis-cli -p 6379 
127.0.0.1:6379> info replication              ###******* 查看主从情况 
# Replication
role:master                                     ###******* 默认自己都为master 主节点
connected_slaves:0
master_replid:e2995fc02165a6f45644b6076aa4ae7c75ccf3d6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
127.0.0.1:6379> 

再启动6381:

[root@localhost bin]# redis-server redis1.conf                     #***** 使用第二个实例配置文件启动
16641:C 05 Aug 2021 09:12:07.514 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16641:C 05 Aug 2021 09:12:07.515 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=16641, just started
16641:C 05 Aug 2021 09:12:07.515 # Configuration loaded


[root@localhost bin]# redis-cli -p 6381                            ##**** 使用6381
127.0.0.1:6381> info replication
# Replication
role:master                                                        ##**** 一样显示主节点
connected_slaves:0
master_replid:fdc1b15ab0d76bca91227af2c0ebf8198a7c8541
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> 

从上面看出,两个Redis节点启动后(分别称为6379节点和6381节点),默认都是主节点。

3. 主从配置

此时在6381节点执行 slaveof 命令,使之变为从节点:

127.0.0.1:6381> slaveof 127.0.0.1 6379            ## 建立主从关系,附属6379
OK

127.0.0.1:6381> info replication            
# Replication
role:slave                                        ## 显示变为了从节点了
master_host:127.0.0.1
master_port:6379
master_link_status:up                            ## 和主节点保持了连接状态
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:70
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e2995fc02165a6f45644b6076aa4ae7c75ccf3d6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:42
127.0.0.1:6381> 

再看 6379 节点:

127.0.0.1:6379> info replication
# Replication
role:master                                            
connected_slaves:1                                    # 所属从节点有一个
slave0:ip=127.0.0.1,port=6381,state=online,offset=196,lag=1
master_replid:e2995fc02165a6f45644b6076aa4ae7c75ccf3d6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196

测试读写操作:

先在从节点查询一个不存在的 key,然后去主节点添加此 key ,会发现会自动同步到各个从节点

127.0.0.1:6381>  get age
(nil)

127.0.0.1:6381> get age        ### 当主节点存入age 后 ,再取值,发现已经自动同步到从机了
"23"
127.0.0.1:6381> set age 24
(error) READONLY You can't write against a read only replica.  
127.0.0.1:6381> 

注意:上面的error提示中,说明从节点是只能读,不能写的。所谓主从复制。读写分离

4. 启动命令方式

redis-server启动命令后加入 --slaveof

上面的方式,使用客户端命令方式来实现的主从的配置。

下面使用启动时指定主从关系。

redis-server myredis/redis1.conf --slaveof 127.0.0.1 6379 启动 Redis 服务时,指定所属的主节点为 6379 端口上的服务

[root@wang ~]# redis-server myredis/redis1.conf --slaveof 127.0.0.1 6379
29087:C 25 Aug 2021 16:04:29.836 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29087:C 25 Aug 2021 16:04:29.836 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=29087, just started
29087:C 25 Aug 2021 16:04:29.836 # Configuration loaded
[root@wang ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1007
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f05b6c77978f163ae77ebed3dcd0bb85790ed197
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1007
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
5. 配置文件方式

可以在启动的配置文件中 redis1.config 中追加下面的一行配置 :

slaveof 127.0.0.1 6379

[root@wang myredis]# echo "slaveof 127.0.0.1 6379" >> redis1.conf 
[root@wang myredis]# tail -5 redis1.conf 

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

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

相关文章

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况,并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS,那么 Executor 计算完后&a…

C#用户界面,UI设置密码隐藏显示

两种方法,第一种,在文本框属性设置UseSystemPasswordChar为True。 这里默认是以黑点隐藏显示。 第二种,在文本框属性设置隐藏显示的符号,这里设置为星号*。

探索Android多屏互动技术:构建无缝交互体验

探索Android多屏互动技术:构建无缝交互体验 1. 简介 在当前移动设备和智能家居应用中,多屏互动技术已经成为一个备受关注的话题。随着移动设备(如智能手机、平板电脑)和智能家居设备的普及,用户对于多屏协同工作、娱…

基于springboot实现流浪动物救助网站系统项目【项目源码+论文说明】

基于springboot实现流浪动物救助网站系统演示 摘要 然而随着生活的加快,也使很多潜在的危险日益突显出来,比如在各种地方会发现很多无家可归的、伤痕累累的、可怜兮兮的动物,当碰到这种情况,是否会立马伸出双手去帮助、救助它们&…

重磅功能!EasyBoss ERP正式接入Lazada本土店全托管,赋能商家轻松出海东南亚

近两年,在跨境电商圈出现了一个新的名词——“全托管模式”,随着部分跨境电商巨头借助全托管模式大获成功,全托管在跨境电商领域掀起一股热潮,吸引着越来越多的平台与卖家布局探索。 作为东南亚头部电商平台的Lazada也在2023年4月…

uniapp 安卓保活功能原生插件

插件介绍 安卓保活原生插件,多种技术保活方案大幅提高保活效率,支持多任务app隐藏,息屏保活,清理后继续保活等 插件地址 安卓保活功能原生插件 - DCloud 插件市场 详细使用文档 uniapp 安卓保活功能原生插件 超级福利 uniapp…

基于JAVA的毕业设计分配选题系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 专业档案模块2.2 学生选题模块2.3 教师放题模块2.4 选题审核模块 三、系统展示四、核心代码4.1 查询专业4.2 新增专业4.3 选择课题4.4 取消选择课题4.5 审核课题 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

四川易点慧电子商务有限公司抖音小店:信赖之选,品质保障

随着电子商务的飞速发展,越来越多的消费者选择在网上购物。四川易点慧电子商务有限公司作为业内佼佼者,其抖音小店自开业以来,就以其卓越的产品品质、完善的售后服务和高效的物流体系,赢得了广大消费者的信赖和好评。 一、品质至上…

远程扫描如何在 Dynamic Web TWAIN 中工作

您是否厌倦了被办公室扫描仪束缚?Dynamic Web TWAIN 版本 18 带来了令人兴奋的远程扫描功能,让您摆脱束缚。借助远程扫描,您现在可以在整个办公网络中共享扫描仪,并通过浏览器从任何设备启动扫描作业。 点击下载Dynamsoft最新版h…

k8s-项目测试环境部署

部署规划 概述 项目开发好后,我们需要部署,我们接下来就基于 阿里云云效 阿里云容器镜像服务 k8s 搭建部署环境 阿里云云效 : 放代码,可以做cicd(https://www.aliyun.com/product/yunxiao) 阿里云容器镜像服务 :…

初学selenuim[1]($x(‘xpath语法’)、WebDriverWait())

文章目录 初学selenuim记录1、执行driver webdriver.Chrome()后很久才打开浏览器2、浏览器多元素定位 $x(‘xpath语法’)3、打开浏览器driver.get("网址")执行了很久才开始定位元素:等待(1)driver.set_page_load_timeout(t)&#…

C语言可以干些什么?C语言主要涉及哪些IT领域?

C语言可以干些什么?C语言主要涉及哪些IT领域? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家…

代码随想录算法训练营第五天

● 自己看到题目的第一想法 242. 有效的字母异位词 方法&#xff1a; 方法一&#xff1a; 暴力法 1. 分别对s, t排序 2. 遍历s与t 判断s[i]!t[i] 返回 false 否则 返回true思路&#xff1a; 注意&#xff1a; 代码&#xff1a; bool cmp(char a, char b){return a<b;…

RK3568 Android12 适配抖音 各大APP

RK3568 Android12 适配抖音 各大APP SOC RK3568 system:Android 12 平台要适配抖音和各大APP 平台首先打开抖音发现摄像头预览尺寸不对只存在右上角,我将抖音APP装在手机上预览,发现是全屏 一开始浏览各大博客 给出的解决方法是修改framework 设置为全屏显示: framewo…

Jenkins自动化部署之流水线模式部署

文章目录 任务类型Pipeline流水线项目声明式的Pipeline脚本式Pipeline 示例脚本生成Tools配置示例 高级Pipeline Script from SCM 任务类型 在Jenkins中&#xff0c;有不同类型的任务&#xff08;项目&#xff09;适用于不同的构建需求。以下是一些常见的Jenkins任务类型&…

(vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)

(vue)el-checkbox 实现展示区分 label 和 value&#xff08;展示值与选中获取值需不同&#xff09; 后端数据 解决方法 在 el-checkbox 标签中间传入要展示的文本即可&#xff0c;代码如下&#xff1a; <el-checkbox-groupv-model"formInline.processFieldList"…

章鱼网络 Community Call #18|Omnity 将首先支持 Runes 协议资产跨链

香港时间2024年2月8日12点&#xff0c;章鱼网络举行第18期 Community Call。 2024年&#xff0c;我们打开一个良好的局面&#xff1a;$NEAR Restaking 已经完成第三方审计&#xff0c;并且经过几次迭代&#xff0c;进入了正式稳定运行的阶段。更重要的是&#xff0c;我们宣布了…

基于移动端的食堂助餐在线点餐配送系统 uniapp微信小程序

本文从管理员、老人、配送员、食堂商家的功能要求出发&#xff0c;养老助餐管理系统小程序中的功能模块主要是实现老人、配送员、食堂商家、食堂大厅、预约选座、餐号信息、美食信息、美食订单、订单信息、订单配送、订单评价、老人食堂、下单信息、饮食分析。经过认真细致的研…

免费下载《金融行业数据安全交换解决方案白皮书》

金融行业包括商业银行业务、证券业务、保险业务、基金业务、信托业务等&#xff0c;因此数据类型多种多样&#xff0c;并且数据涉及主体众多&#xff0c;应用场景上较为多样复杂&#xff0c;在数据交换上存在安全、合规、可控、可靠、高效等需求。 金融行业会面临哪些数据安全…

【FPGA/IC】RAM-Based Shift Register Xilinx IP核的使用

前言 一般来讲&#xff0c;如果要实现移位寄存器的话&#xff0c;通常都是写RTL用reg来构造&#xff0c;比如1bit变量移位一个时钟周期就用1个reg&#xff0c;也就是一个寄存器FF资源&#xff0c;而移位16个时钟周期就需要16个FF&#xff0c;这种方法无疑非常浪费资源。 Xili…