redis学习-主从复制和哨兵模式

目录

1. 主从复制,读写分离

        1.1 介绍

        1.2 使用命令介绍

        1.3 实现

        1.4全量复制和增量复制

2.哨兵模式


1. 主从复制,读写分离

        1.1 介绍

        指的是将一台redis服务器中的数据复制到其他redis服务器,前者称为主机,后者称为从机,并且只能从主机复制数据到从机,从机不能复制给主机;主机主要负责写操作,从机则主要负责读操作,由于在日常应用中读操作频率较高,所以这样做可以减轻服务器的负担。

        其作用有:

  • 数据冗余:将主机中的数据复制给从机实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主机出现故障时,可以利用从机中复制的数据实现快速的恢复。
  • 负载均衡:主机主要提供写服务,从机主要提供读服务,读写分离可以让从机分担主机的负载,能够大大提高服务器的并发量。
  • 高可用的基础:主从复制是哨兵和集群实施的基础,所以说是高可用的基础。

        1.2 使用命令介绍

  • info replication

        查看当前服务器的信息,role为master代表当前服务器是主机,为slave表示从机;connected_slaves表示连接的从机数。

  • slaveof 主机ip 端口号

        用于给从机指定主机,使用该命令后其服务器信息的role自动变为slave,如果主从机在同一机器上则主机ip为127.0.0.1;只用配置从机即可,因为默认情况下所有服务器都是主机。不过使用命令slaveof配置从机这种主从关系是暂时的,需要修改从机的配置文件中的replication板块才是永久的。具体修改项见图片。

  • slaveof no one

        使用该命令可以手动使从机变为主机,一般在主机断开连接时使用,随后可以手动设置其他从机连接到这个主机上。要注意的是,如果原来的主机重新启动,这些从机不会自动连接到那个主机,这就相当于臣子的谋权篡位。可以这么理解:slaveof表示从属于,所以从属于no one就是不属于任何服务器,也就是变成主机了。

        1.3 实现

        由于只有一台服务器,所以通过在一台服务器上开启多个redis服务器来简单实现:

        可以通过复制多份配置文件来分别用于主机和从机,每份配置文件的port、pidfile、logfile、dbfilename要修改进行区分,当然不同机器上搭建集群可以不用改。使用slaveof命令来演示,当配置好主机和从机后,从机将自动禁用写操作,只能执行读操作,并且主机更新的数据会自动复制到从机中。

        首先准备一个主机和两个从机的配置文件,直接使用拷贝命令 cp redis.conf redis79.conf (80和81也是这样拷贝) 把默认配置文件复制3份,一个集群最基础也是一主二从:

        然后分别配置:

        主机的redis79.conf:

        端口配置为6379,端口号是关键,端口号不同启动的服务器才是不同的服务器。

        pidfile配置,用来存放主机进程的pid。         

        logfile配置,这是日志文件,通过区分日志文件防止三台服务器的日志都写到一个日志文件上(因为默认都是用的标准输出)。

        dbfilename配置,这是rdb持久化的文件,通过区分快照文件防止三台服务器的快照信息存放在同一个文件上(因为默认的rdb文件都是dump.rdb)。  

        两台从机的配置文件按照主机的配置文件修改即可,只需要将6379都改成6380或6381。

        然后开启三个窗口,分别使用配置文件6379.conf、6380.conf、6381.conf启动服务器,并通过redis-cli -p 6379、redis-cli -p 6380、redis-cli -p 6381分别连接到对应的服务器:

        此时使用info replication命令可以查看到该服务器的replication板块的信息,以6379服务器为例:

        然后让6379和6381两个服务器使用slaveof命令将这两个服务器变成6380的从机,由于是在同一个redis服务器上进行演示,所以地址就是本机的端口号为6380的服务器,所以使用的命令是slaveof 127.0.0.1 6380。

        现在再使用info replication查看这三个服务器就会发现,6379和6381两个的role都变成了slave,也就是从机,而6380中显示连接到该服务器的从机数为2:

        6379:

        补充:

  • master_link_status即为所属主机的在线状态,up表示主机正常运行,down表示主机已断开连接,断开连接可以是手动关闭主机,也可以是主机出现问题宕机了。
  • slave_read_only即该从机是否仅支持读操作,1代表是,0代表否。因为redis默认从机只能进行读操作,只有主机才能进行写操作,所以默认情况下该值为1。 那如果该服务器既是一个服务器的从机又是另一个服务器的主机呢?答案也是仅能执行读操作,因为它有从机的身份,从机默认都是仅读。

        6381:

        6380:

        这样一主二从的简易集群就搭建好了。 下面演示手动更换主机的过程:

        先使用shutdown命令关闭6380服务器,然后在6379和6381服务器使用info replication命令就会发现它们的所属主机还是本机的6380服务器,但master_link_status变成了down,说明主机已经断开连接。以6379为例:

        随后对6379服务器使用slaveof no one命令使其变为主机,并手动使用命令slaveof 127.0.0.1 6379让6381服务器变成其从机:

         6381:

        6379: 

         此时让6380重新连接,再对这三个服务器使用info replication命令就会发现,6380的从机连接数变成了0,6379仍是主机,6381仍是6379的从机。

        1.4全量复制和增量复制

        全量复制:主机将所有的数据收集之后传输给从机,全量复制发生在从机第一次连接主机或者重新连接主机的情况。
        增量复制:主机仅将修改的数据传输给从机,增量复制发生在从机正常连接且主机执行了更新操作的情况。

2.哨兵模式

        这是一种自动切换主机的故障恢复模式,由多个哨兵分别监视各个服务器,当一个哨兵监测到主机断开连接时,此时称为主观下线,还需要让其他哨兵检测这个主机的状态;当其他哨兵中认为这个主机断开连接的哨兵达到一定数量时,就会判定主机已经断开连接,这时就称之为客观下线。随后由某个哨兵发起投票,从正常工作的从机中选取一个作为主机,选取主机之后会通过发布订阅模式告诉其他从机连接到新的主机上。要注意的是,如果之前的主机重新连接成功,会被归并到新主机的从机中

        具体实现:
        新建一个sentinel.conf配置文件,在其中加入:

        sentinel monitor 哨兵名(自己命名) 主机ip 主机端口号 num

        即可监控主机,最后的num代表需要有指定数量个哨兵同意切换才能切换主机 ;随后执行命令redis-sentinel sentinel.conf 就能开启哨兵模式了。

        演示:

        先对三个服务器使用slaveof no one变成主机以便演示哨兵模式,然后再开启一个新的窗口用于配置哨兵并开启哨兵模式:

        在新窗口使用命令vim sentinel.conf即可创建哨兵的配置文件并进行配置:

        随后执行命令redis-sentinel sentinel.conf开启哨兵模式,出现以下界面表示开启成功:

         再让6379和6381两个服务器连接到6380使其变为6380的从机,此时哨兵界面就会弹出信息6380服务器增加了6379和6380两个从机(可能要等一小会儿,因为哨兵是每隔一定的时间去查看有无变动):

        随后对6380使用shutdown命令使其断开连接,哨兵在监测到主机6380断开连接后便会自动选择剩下从机中的其中一个作为新主机,并自动让其他从机连接到这个新主机上(同样是需要等一会儿):

        从上图中的两个"+slave"可以看出哨兵自动将6379和6380两个服务器归到了6381的从机中,也就是说哨兵在转换主机时,不仅将连接到原主机的所有从机归到了新主机的从机中,也将原主机归到了新主机的从机中

        这时对6379和6381使用info replication命令就会发现6381变成了主机,6379变成了它的从机(这里需要使用exit先退出再重新使用redis-cli命令连接一下):

         6379:

        6381:

        这里或许有点疑问,上面我们说哨兵在转换主机时也会将原主机也就是6380归到新主机的从机中,但这里为什么6381的connected_slaves是1,并且只有6379这一个从机的信息呢?

        这是因为这里仅显示的是在线的从机信息,6380服务器已经被我们shutdown了,所以没有显示出来。现在重新启动6380服务器,再使用info replication命令就会发现6380变成了6381的从机,6381的从机信息也发生了改变(重新开启服务器6380后需要等待哨兵检测到之后再使用info replication命令才能查看到相应的变化,因为哨兵是在检测到6380重新开启后才会自动执行将6380归到6381的从机的操作,毕竟处于关闭状态的服务器不能执行任何操作):

        最后再来讲一下哨兵模式的优缺点:

        优点:

  • 哨兵模式是基于主从复制的,所以主从复制的优点哨兵模式都有。
  • 主从可以切换,能够自动执行故障转移(也就是自动执行选举新主机并自动让从机连接到新主机等操作),系统的可用性更好。
  • 哨兵模式就是主从复制的升级,由手动变为自动,更加健壮。

        缺点:

  • redis不容易在线扩容,集群容量一旦达到上限,再进行在线扩容就会十分麻烦。
  • 哨兵模式的配置有很多选择,配置起来较为麻烦。上面只是演示了简易的哨兵模式,所以配置的很简单,实际上配置哨兵模式有很多参数可以配置:

        

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

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

相关文章

基于SpringBoot + Vue实现的高校汉服租赁网站系统设计与实现+毕业论文

介绍 高校汉服租赁网站管理系统可以提高高校汉服租赁网站信息管理问题的解决效率,优化高校汉服租赁网站信息处理流程,保证高校汉服租赁网站信息数据的安全,它是一个非常可靠,非常安全的应用程序。系统包含普通用户和管理员两个角…

【AI系列】Python NLTK 库和停用词处理的应用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

matlab及其在数字信号处理中的应用001:软件下载及安装

目录 一,matlab的概述 matlab是什么 matlab适用于的问题 matlab的易扩展性 二,matlab的安装 1,解压所有压缩文件 2,解压镜像压缩文件 3,运行setup.exe 4,开始安装 5,不要运行软件…

GEE23:基于植被物候实现农作物分类

地物分类 1. 写在前面2. 北京作物分类 1. 写在前面 今天分享一个有意思的文章,用于进行农作物分类。文章提出了一个灵活的物候辅助监督水稻(PSPR)制图框架。主要是通过提取植被物候,并自动对物候数据进行采样,获得足够多的样本点,…

探索一致性哈希算法以及在 Dubbo 负载均衡中的应用

文章目录 负载均衡简介基于哈希算法的负载均衡策略传统哈希算法一致性哈希算法虚拟一致性哈希算法 一致性哈希在 Dubbo 中的应用ConsistentHashSelector 构造方法ConsistentHashSelector select方法 负载均衡简介 负载均衡(Load Balance,简称 LB&#x…

WPF中获取TreeView以及ListView获取其本身滚动条进行滚动

实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…

【HCIP学习】网络类型级数据链路层协议

思维导图在上面哦~ 一、网络类型的分类(4种) 出现原因:数据链路层使用的协议及规则不同,造成了不同的网络类型 1、多点接入网络(MA)------一条网段内上出现多个设备 BMA:广播型多点接入&…

linux内核:ftrace——追踪内核行为

文章目录 1. 简介2. 使用2.1 加入ftrace2.2 ftrace 基础2.2.1 tracer2.2.2 filter(可选)2.2.3 读取trace2.2.4 ftrace_enabled 2.3 使用function_graph查看do_sys_open的执行过程2.3 使用function查看do_sys_open的执行2.3 使用wakeup2.3 使用wakeup_rt2…

C语言例1-11:语句 while(!a); 中的表达式 !a 可以替换为

A. a!1 B. a!0 C. a0 D. a1 答案&#xff1a;C while()成真才执行&#xff0c;所以!a1 &#xff0c;也就是 a0 原代码如下&#xff1a; #include<stdio.h> int main(void) {int a0;while(!a){a;printf("a\n");} return 0; } 结果如…

JUC:Monitor 与 Java对象头的内容与锁关系

文章目录 Monitorjava对象头Monitor&#xff08;锁、管程&#xff09; Monitor java对象头 普通对象 Mark Word 主要用来存储对象自身的运行时数据、klass word就是指向该对象的类型。 数组对象 mark word 不同对象状态下结构和含义不同。 Monitor&#xff08;锁、管…

SRS OBS利用RTMP协议实现音视频推拉流

参考&#xff1a;https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1&#xff09;docker直接运行SRS服务&#xff1a; docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5运行起来后可以http://localho…

数据恢复宝典:揭秘分区合并后的数据拯救之路

在计算机存储管理中&#xff0c;分区合并是一项常见的硬盘操作。它通过将两个或多个相邻的磁盘分区合并成一个更大的分区&#xff0c;来扩展存储空间或简化磁盘管理。然而&#xff0c;这个看似简单的操作背后&#xff0c;却隐藏着数据丢失的巨大风险。许多用户在尝试分区合并时…

ElementUI表格table组件实现单选及禁用默认选中效果

在使用ElementUI&#xff0c;需要ElementUI表格table组件实现单选及禁用默认选中效果, 先看下效果图&#xff1a; 代码如下&#xff1a; <template><el-tableref"multipleTable":data"tableData"tooltip-effect"dark"style"widt…

云原生应用(5)之Dockerfile精讲及新型容器镜像构建技术

一、容器与容器镜像之间的关系 说到Docker管理的容器不得不说容器镜像&#xff0c;主要因为容器镜像是容器模板&#xff0c;通过容器镜像我们才能快速创建容器。 如下图所示&#xff1a; Docker Daemon通过容器镜像创建容器。 二、容器镜像分类 操作系统类 CentOS Ubuntu 在…

深入理解element-plus table二次封装:从理论到实践的全面指南

前言 在许多中后台管理系统中&#xff0c;表格占据着半壁江山&#xff0c;如果使用element plus组件库&#xff0c;那么少不了要用到table组件&#xff0c;可是table组件的功能过于基础&#xff0c;因此&#xff0c;我在table组件的实现基础之上进一步封装&#xff0c;从而实现…

安卓工控一体机主板定制_联发科MTK平台解决方案

新移科技安卓工控一体机方案基于MT8766主芯片&#xff0c;采用四核 Cortex-A53 CPU&#xff0c;搭载Android 12.0系统&#xff0c;主频高达2.0GHz&#xff0c;具有低功耗和高性价比的优势。搭载ARM IMG GE8300 高性能GPU和4G全网通版本的RF&#xff0c;网络连接稳定快速。 可直…

【Node.js】图片验证码识别

现在越来越多的网站采取图片验证码&#xff0c;防止机器恶意向服务端发送请求。但是常规的图片验证码也不是非常安全了。有非常多第三方库可以对图片上的数字文字等进行识别。 代码实现 首先安装依赖&#xff1a; npm install node-native-ocrnpm&#xff1a;(node-native-oc…

经验分享:开源知识库才是企业低成本搭建的最佳选择!

身为企业所有者的你&#xff0c;是否为建设企业的知识库而头疼&#xff1f;想要一个功能全面而又简单易用的知识库&#xff0c;但又担心成本过高&#xff1f;那我今天要分享的内容&#xff0c;可能会给你带来一些启示。那便是&#xff1a;开源知识库便是你企业低成本搭建的最佳…

Tron波场区块链 | 使用Java将Tron钱包助记词转私钥 全网独门一份

如何使用Java将Tron钱包助记词转换为私钥? 本来想着这个问题挺简单&#xff0c;可是查了半天&#xff0c;不是&#xff0c;不止半天查了好长时间&#xff0c;看了半天官网文档&#xff0c;全网Java就没有实现的。 咋办。。。咋办呢&#xff1f; 好巧&#xff0c;官网我看到…

ARM-按键中断实验

代码 #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGICC->IAR&0x3ff;switch (irqno){case 99:pr…