Redis主从复制和哨兵模式

Redis主从复制

概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Reds服务器。前者称为主节点(master / leader),后者称为从节点(slave / follower)。

数据的复制是单向的,只能由主节点到从节点。 Master以写为主,Slave以读为主。

主从复制,读写分离。百分之八十的情况下都是在进行读操作,为了减轻服务器的压力。
最低配一主二从

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

主从复制的作用

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

一般来说,要将Redis运用于工程项目中,只使用一台Redis:是万万不能的(出现宕机,至少一主二从),原因如下:

  1. 从结构上,单个Reds服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大:
  2. 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Reds存储内存,一般来说,单台Reds最大使用内存不应该超过20G,

电商网站上的商品,一般的都是一次上传,无数次浏览的,“多读少写”。
对于这种场景,我们可以使用如下架构:
在这里插入图片描述

测试

环境配置
只配置从库,不用配置主库

redis默认就是一个master

127.0.0.1:6379> info replication  //查看当前库的信息
# Replication
role:master    //角色 master
connected_slaves:0   //没有从机
master_failover_state:no-failover
master_replid:7ed71356935f54777c3befc344d561e80e39cb7a
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

首先将配置文件redis.conf复制三份

[root-4-2-centos wconfig]# cp redis.conf redis79.conf
[root-4-2-centos wconfig]# cp redis.conf redis81.conf
[root-4-2-centos wconfig]# cp redis.conf redis80.conf
[root-4-2-centos wconfig]# ls
redis79.conf  redis80.conf  redis81.conf  redis.conf

修改对应信息
port:进程占用的端口号
pid(port ID):记录了进程的 ID,文件带有锁。可以防止程序的多次启动。
logfile:明确日志文件的位置
dbfilename:持久化文件位置

  1. 端口
    在这里插入图片描述在这里插入图片描述
  2. pid名字
    在这里插入图片描述
    4.
  3. 日志文件名字
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. 修改持久化文件
    在这里插入图片描述vim
    在这里插入图片描述
    在这里插入图片描述

启动

[root-4-2-centos bin]# redis-server wconfig/redis79.conf 
[root-4-2-centos bin]# redis-server wconfig/redis80.conf
[root-4-2-centos bin]# redis-server wconfig/redis81.conf

可以看到启动成功
在这里插入图片描述

一主二从

默认情况下,每台Redis服务器都是主节点

一般情况下只配从机。这里我们约定6379端口的redis为主机,6380和6381端口的redis为从机。

slaveof 主机地址 主机端口

接下来我们将6380和6381端口的redis设置为6379端口redis的从机
在这里插入图片描述
在这里插入图片描述
使用命令的主从配置是暂时的,真实的主从配置应该在配置文件中进行配置的,这样才是永久的。

在这里插入图片描述

细节

主机可以写,从机只能读
主机中的所有信息和数据,都会自动被从机保存

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.

主机断开连接,从机依旧连接主机,但是没有写操作。这个时候如果主机回来了,从机依旧可以直接获取到主机的写操作的信息。

如果是使用命令行进行配置的主从,从机如果重启了就会变回master。只要变回从机,就会立马从主机中获取到值。

复制原理
Slave启动成功连接到master后会发送一个sync同步命令

Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。

全量复制:而salve服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

层层链路

上一个master链接下一个slave
在这里插入图片描述
此时中间的slave(master)依旧是从节点,无法写入。

这个时候,如果没有master了,主机断开连接,slave(master)执行slaveof on one让自己变成主机,其他的节点就可以手动连接到最新的主节点。原来的master老大回来了也没用。

哨兵模式

自动选举老大的模式

概述

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵)架构来解决这个问题。

谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

基本模型

在这里插入图片描述

在这里插入图片描述
这里的哨兵有两个作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slaver切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式
在这里插入图片描述
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行 failover 过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行 failover [故障转移] 操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线

测试

  1. 配置哨兵配置文件sentinel.conf
//sentinel monitor 被监控的名称 host port 1
sentinel monitor myredis 127.0.0.1 6379 1

后面的数字1,代表master挂了后,slave投票谁接替主机

  1. 启动哨兵
    在这里插入图片描述
  2. master断开
    从slave中随机选取一个作为master
    failover 故障转移
    在这里插入图片描述
    可以看到6381作为master了
    在这里插入图片描述
  3. 如果之前的master(6379)连接回来,也只能作为当前master(6381)的slaver
    在这里插入图片描述

优点:

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点,都有
  2. 主从可以切换,故障可以转移,系统的可用性更好
  3. 哨兵模式就是主从模式的升级,手动到自动,更加健壮

缺点:

  1. Redis不好在线扩容,集群数量一旦到达上限,在线扩容就十分麻烦
  2. 实现哨兵模式的配置是十分麻烦的,里面有很多选择

哨兵模式的全部配置

Example sentinel.conf

//哨兵sentine1实例运行的断开  默认26379
//如果有哨兵集群,我们还需配置每个哨兵的哨兵端口
port 26379

//哨兵sentine1的工作目录
dir /tmp

//哨兵sentinel监控的redis主节点的ip port
//master-name可以自己命名的主节点名字只能出字A-Z、数字0-9、这三个字符".-_"组成。
//quorum配置多少个sentine1哨兵统一认为master主节点失联,那么这时客观认为主节点失联了
//sentinel monitor <master-name> <ip> <redis-port><quorum>
sentinel monitor mymaster 127.0.0.1 6379 2

//当在Redis实例中开启了requirepass foobared授权码 这样所有连接Redis实例的客户端都要提供密码
//设置哨兵sentinel连接主从的密码注意必须为主从设置一样的验证密码
//sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123password

//指定多少毫秒之后,主节点没有应答哨兵sentinel此时哨兵主观上认为主节点下线,默认30秒
//sentinel down-after-milliseconds <master-name><milliseconds>
sentinel down-after-milliseconds mymaster 30000

//这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步
//这个数字越小,完成failover所需的时间就越长
//这个数字越大,就意味着越多的slave因为replication而不可用
//可以通过将这个值设为1来保证每次只有一个slave处于不能处理命令请求的状态
//sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1

//故障转移的超时时间failover-timeout可以用在以下这些方面:
//1.同一个sentinel对同一个master两次fai1over之间的间隔时间
//2.当一个s1ave从一个错误的master那里同步数据开始计算时间,直到s1ave被纠正为向正确的master那里同步数据时
//3.当想要取消一个正在进行的failover所需要的时间
//4.当进行fai1over时,配置所有s1aves指向新的master所需的最大时间。不过,即使过了这个超时,s1aves依然会被正确配置为指向master,但是就不按para11e1-syncs所配置的规则来了
//默认三分钟
//sentinel failover-timeout <master-name><milliseconds>
sentinel failover-timeout mymaster 180000

//SCRIPTS EXECUTION

//配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例加当系统运行不正常时发邮件通知相关人员
//对于脚本的运行结果有以下规则:
//若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
//若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行
//如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同
//一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行

//通知型脚本:当sentine1有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
//这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。
//调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。
//如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
//通知脚本
//sentinel notification-script <master-name><script-path>
sentinel notification-script mymaster /var/redis/notify.sh

//客户端重新配置主节点参数脚本
//当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master已经发生改变的信息。
//以下参数将会在调用脚本时传给脚本:
//<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
//目前<state>总是“failover",
//<role>是“leader"或者“observer"中的一个
//参数from-ip,from-port,to-ip,to-port是用来和旧的master和新的master(即旧的s1ave)通信的
//这个脚本应该是通用的,能被多次调用,不是针对性的
//sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

一般由运维来配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring2:创建和使用

目录 1.创建Spring项目 1.1创建Maven类 1.2添加Spring支持框架 1.3添加启动类 2.存储Bean对象 2.0 spring项目中添加配置文件(第一次) 2.1创建Bean 2.2把Bean注册到容器中 3.获取并使用Bean对象 3.1创建上下文 3.2获取指定Bean对象 getBean()方法 --> 获取什么…

Flutter 组件抽取:日期(DatePicker)、时间(TimePicker)弹窗选择器【仿照】

简介 仿照《Flutter 仿ios自定义一个DatePicker》实行的日期弹窗选择器&#xff08;DatePicker&#xff09;、时间弹窗选择器&#xff08;TimePicker&#xff09; 效果 范例 class _TestPageState extends State<TestPage> {overridevoid initState() {super.initStat…

ros基础笔记

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现&#xff0c;前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的&#xff0c;不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。再次声明&#xff0c;…

题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和--不能完全通过,最好情况通过67.

原题链接&#xff1a; 题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和 https://www.dotcpp.com/oj/problem3166.html 致歉 害&#xff0c;首先深感抱歉&#xff0c;这道题还是没有找到很好的解决办法。目前最好情况就是67分。 这道题先这样跳过吧&#xff0c;当然以后还…

day9 实现UDP通信

目录 socket函数拓展 UDP通信实现过程 代码实现 socket函数拓展 send与recv函数&#xff1a; /*用于发送数据*/ ssize_t send(int sockfd, const void *buf, size_t len,int flags);/*用于接收数据*/ ssize_t recv(int sockfd, void *buf, size_t len,int flags);/*前三个…

【Python习题集5】函数的设计

函数的设计 一、实验内容二、实验总结 一、实验内容 1.编写两个函数分别按单利和复利计算利息&#xff0c;根据本金、年利率、存款年限得到本息和和利息。调用这两个函数计算1000元在银行存3年&#xff0c;在年利率是6%的情况下&#xff0c;单利和复利分别获得的本息和和利息。…

程序员不得不知道的 API 接口常识

1、初识 API 接口 记得在我初学 web 开发的时候&#xff0c;后端框架相关的教程基本都会教学生写渲染模版&#xff08;不分语言&#xff09;&#xff0c;也就是说后端返回的是整个网页的数据&#xff0c;浏览器只负责渲染。 一般这类模版在后端都会对应一个路由&#xff0c;比…

Vue——组合式函数

目录 什么是“组合式函数”&#xff1f;​ 鼠标跟踪器示例​ 异步状态示例​ 约定和最佳实践​ 命名​ 输入参数​ 返回值​ 副作用​ 使用限制​ 通过抽取组合式函数改善代码结构 选项式 API 中使用组合式函数​ 与其他模式的比较​ 和 Mixin 的对比​ 和无渲染…

计算机视觉的应用3-批量图片风格迁移之素描图片生成的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用3-批量图片生成素描图片的应用&#xff0c;将一张图像转换为素描风格的图像的其实是模拟了人类视觉在观察物体时受到的光照条件。素描风格的图像在灰度值上表现出明暗交替的效果&#xff0c;这种效…

渗透测试 | 目录扫描

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…

electron源码保护

electron 程序发布后&#xff0c;如果未对程序做保护&#xff0c;则极容易受到破坏&#xff0c;比如被轻松破解密码&#xff0c;或者被修改程序&#xff0c;所以必须对程序做一些安全防护。虽然没有100%的安全防护&#xff0c;但是提升破解难度&#xff0c;直至破解代价超出了范…

MyBatis:使用代码整合

文章目录 MyBatis&#xff1a;Day 04框架1. 依赖&#xff1a;pom.xml2. 外部配置文件&#xff1a;db.properties3. 核心配置文件&#xff1a;mybatis-config.xml4. 实体类5. 接口&#xff1a;xxxMapper.java6. 实现类&#xff1a;xxxMapper.xml7. 测试 MyBatis&#xff1a;Day …

利用C#实现动态替换桌面快捷方式对应的应用程序

公司有一个特殊的业务可能会用到这个&#xff0c;至于什么业务就不展开了。本文的内容作为备用方案。 实现思路&#xff1a; 1 获取当前exe程序运行的全路径 2 获取桌面的所有快捷方式 3 遍历快捷方式&#xff0c;获取快捷键方式对应程序的运行路径&#xff0c;并与当前…

Java编程中的20种常见异常及其原因,你知道多少

本文介绍了在Java编程中可能遇到的20种常见异常&#xff0c;包括空指针异常、类未找到异常、数组下标越界异常等&#xff0c;并简要解释了每种异常发生的原因。这些异常可能由于编程错误、运行时资源不足或权限受限等多种原因触发&#xff0c;了解它们有助于更高效地进行程序调…

黑马程序员Dubbo快速入门,Java分布式框架dubbo教程

分布式系统中的相关概念 &#xff08;一&#xff09;互联网项目架构目标-特点 &#xff08;二&#xff09;互联网项目架构目标-目标 &#xff08;三&#xff09;集群和分布式 &#xff08;四&#xff09;架构演进 Dubbo概述 &#xff08;一&#xff09;dubbo概述 1、dub…

针对Vue前后端分离项目的渗透思路

引言 在目前的开发环境下&#xff0c;越来越多的厂商选择 Vue.js 来实现前端功能的编写&#xff0c;且成熟的前端框架已经可以实现后端代码实现的功能&#xff0c;导致后端目前只负责提供 Api 接口和文档&#xff0c;方便前端的同时去调用。本文主要介绍如何针对这类前后端分离…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

java紫砂壶交易购物系统 mysql

网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传&#xff0c;大大达到了陶瓷业的“色型”要求。实现产品管理方便&#xff0c;起到立竿见影的效果&#xff0c;不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点&#xff0c;全线马上更新。采用B/S模式&#x…

mybatisPlus初识

文章目录 什么是mybatisplus依赖入门案例自动填充乐观锁悲观锁乐观锁 mybatisPlus实现乐观锁批量查询根据指定条件查询 什么是mybatisplus mybatisplus是mybatis的增强工具&#xff0c;支持多种类型的数据库。 依赖 <dependency><groupId>com.baomidou</group…