Redis主从架构、哨兵集群原理实战

1.主从架构简介

  • 背景

    • 单机部署简单,但是可靠性低,且不能很好利用CPU多核处理能力
    • 生产环境必须要保证高可用,一般不可能单机部署
    • 读写分离是可用性要求不高、性能要求较高、数据规模小的情况
  • 目标

    • 读写分离,扩展主节点的读能力,分担主节点读压力
    • 容灾恢复,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来
  • Redis主从架构介绍

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.Redis6.x主从复制一主二从实战搭建

  • 配置:6379端口为主节点,6380、6381为从节点

    # 新建配置文件目录
    mkdir -p /data/redis/master/data
    mkdir -p /data/redis/slave1/data
    mkdir -p /data/redis/slave2/data
    
    # 从节点开启只读模式(默认)
    replica-read-only yes
    # 从节点访问主节点的密码,和requirepass一样
    masterauth 123456
    # 哪个主节点进行复制
    replicaof 192.168.1.12 6379
    
  • 创建主节点配置文件vim /data/redis/master/data/master.conf

    bind 0.0.0.0
    port 6379
    daemonize yes
    requirepass 123456
    logfile "/usr/local/redis6/log/redis_master.log"
    dbfilename dump_master.rdb
    dir /usr/local/redis6/data
    appendonly yes
    appendfilename "appendonly_master.aof"
    masterauth 123456
    
  • 创建从节点1配置文件vim /data/redis/slave1/data/slave1.conf

    bind 0.0.0.0
    port 6380
    daemonize yes
    requirepass 123456
    logfile "/usr/local/redis6/log/redis_slave1.log"
    dbfilename dump_slave1.rdb
    dir /usr/local/redis6/data
    appendonly yes
    appendfilename "appendonly_slave1.aof"
    masterauth 123456
    replicaof 192.168.1.12 6379
    
  • 创建从节点2配置文件vim /data/redis/slave2/data/slave2.conf

    bind 0.0.0.0
    port 6381
    daemonize yes
    requirepass 123456
    logfile "/usr/local/redis6/log/redis_slave2.log"
    dbfilename dump_slave2.rdb
    dir /usr/local/redis6/data
    appendonly yes
    appendfilename "appendonly_slave2.aof"
    masterauth 123456
    replicaof 192.168.1.12 6379
    
  • 防火墙记得关闭,或者开放对应的端口;云服务器记得开放网络安全组

  • 启动服务

    # 启动主节点
    /usr/local/redis6/bin/redis-server /data/redis/master/data/master.conf
    # 启动从节点1
    /usr/local/redis6/bin/redis-server /data/redis/slave1/data/slave1.conf
    # 启动从节点2
    /usr/local/redis6/bin/redis-server /data/redis/slave2/data/slave2.conf
    
  • 客户端连接后info replication查看状态

3.主从架构-复制读写分离原理解析

  • 主从复制分两种(主从刚连接的时候,进行全量同步;全同步结束后,进行增量同步)

    • 全量复制
      • master服务器会开启一个后天进程用于将Redis中的数据生成一个RDB文件
      • 主服务器会缓存所有接收到的来自客户端的写命令,当后台保存进程处理完毕后,会将该RDB文件传递给slave服务器
      • slave服务器会将RDB文件保存在磁盘并通过读取该文件将数据加载到内存
      • 在此之后master服务器会将在此期间缓存的命令通过Redis传输协议发送给slave服务器
      • 然后slave服务器将这些命令依次作用于自己本地的数据集上,最终达成数据的一致性
    • 增量复制
      • slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程
      • 服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
  • 特点

    • 主从复制对于 主/从 Redis服务器来说是非阻塞的,所以同步期间都可以正常处理外界请求
    • 一个主Redis可以含有多个从Redis,每个从Redis可以接收来自其他从Redis服务器的连接
    • 从节点不会让key过期,而是主节点的key过期删除后,成为del命令传输到从节点进行删除
      • 从节点开启sync看日志
  • 加速复制

    • 完全重新同步需要在磁盘上创建一个RDB文件,然后加载这个文件以便为从服务器发送数据
    • 在比较低速的磁盘,这种操作会给主服务器带来较大的压力
    • 新版支持无磁盘的复制,子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储
    • repl-diskless-sync yes(默认是no)
  • 主从断开重连

    • 如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步
    • 2.8版本后,部分重新同步这个新特性内部使用psync命令,旧的实现中使用sync命令

4.Sentinel哨兵模式

  • 哨兵模式介绍

    • Redis提供了哨兵的命令,是一个独立的进程
    • 原理:哨兵通过发送命令给多个节点,等待Redis服务器响应,从而监控运行的多个Redis实例的运行情况
    • 当哨兵监测到master宕机,会自动将slave切换成master通过通知其他的从服务器,修改配置文件切换主机
  • Sentinel三大工作任务

    • 监控(Monitoring)
      • Sentinel会不断地检查你的主服务器和从服务器是否运行正常
    • 提醒(Notification)
      • 当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知
    • 自动故障迁移(Automatic failover)
      • 当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务区改为复制新的主服务器
      • 当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
  • 问题:一个哨兵进程对Redis服务器进行监控,可能会出现问题;一般是使用多个哨兵进行监控,各个哨兵之间还会进行监控,形成多哨兵模式

  • 多哨兵模式下线名词介绍

    • 主观下线(Subjectively Down,简称SDOWN)
      • 是单个Sentinel实例对服务器做出的下线判断,比如网络问题接收不到通知等
      • 一个服务器没有在down-after-milliseconds选项所指定的时间内,对向它发送PING命令的Sentinel返回一个有效回复(valid reply),那么Sentinel就会将这个服务器标记为主观下线
    • 客观下线(Objectively Down,简称ODOWN)
      • 指的是多个Sentinel实例在对同一个服务器做出SDOWN判断,并且通过Sentinel is-master-down-by-addr命令互相交流之后,得出的服务器下线判断
      • 一个Sentinel可以通过向另一个Sentinel发送Sentinel is-master-down-by-addr命令来询问对方是否认为给定的服务器已下线
      • 客观下线条件只适用于主服务器
    • 仲裁(qurum)
      • Sentinel在给定的时间范围内,从其他Sentinel那里接收到了【足够数量】的主服务器下线报告,那么Sentinel就会将主服务器的状态从主观下线改变为客观下线
      • 这个【足够数量】就是配置文件里面的值,一般是Sentinel个数的一半+1,比如3个Sentinel则就设置为2
      • down-after-milliseconds是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用
      • 当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover

5.Sentinel哨兵模式流程解析和实战

  • 核心流程解析

    • 每秒ping,超过时间不响应则认为主观下线
    • 满足多个主观下线则认为是客观下线
    • 投票选择主节点
    • 如果没有足够的节点同意master下线,则状态会被移除
  • 环境准备

    • 配置3个哨兵,每个哨兵的配置都是一样的
    • 启动顺序,先启动主节点再启动从节点,最后启动3个哨兵
    • 哨兵端口记得开放
    # 不限制IP
    bind 0.0.0.0
    # 后台运行
    daemonize yes
    # 配置监听的主服务器,mymaster代表服务器的名称,自定义;2代表只有两个或两个以上的哨兵认为主服务器不可用的时候才会进行failover操作
    sentinel monitor mymaster 192.168.1.12 6379 2
    # 定义服务的密码
    sentinel auth-pass mymaster 123456
    # 超过5秒master还没有连接上,则认为master已经停止
    sentinel down-after-milliseconds mymaster 5000
    # 如果该时间内没完成failover操作,则认为本次failover失败
    sentinel failover-timeout mymaster 30000
    
  • vim /data/redis/sentinel1.conf

    port 26379
    bind 0.0.0.0
    daemonize yes
    sentinel monitor mymaster 192.168.1.12 6379 2
    sentinel auth-pass mymaster 123456
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 30000
    pidfile /var/run/redis_sentinel1.pid
    logfile "/usr/local/redis6/log/redis_sentinel1.log"
    dir /usr/local/redis6/data
    
  • vim /data/redis/sentinel2.conf

    port 26380
    bind 0.0.0.0
    daemonize yes
    sentinel monitor mymaster 192.168.1.12 6379 2
    sentinel auth-pass mymaster 123456
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 30000
    pidfile /var/run/redis_sentinel2.pid
    logfile "/usr/local/redis6/log/redis_sentinel2.log"
    dir /usr/local/redis6/data
    
  • vim /data/redis/sentinel3.conf

    port 26381
    bind 0.0.0.0
    daemonize yes
    sentinel monitor mymaster 192.168.1.12 6379 2
    sentinel auth-pass mymaster 123456
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 30000
    pidfile /var/run/redis_sentinel3.pid
    logfile "/usr/local/redis6/log/redis_sentinel3.log"
    dir /usr/local/redis6/data
    
  • 启动哨兵集群

    /usr/local/redis6/bin/redis-server /data/redis/sentinel1.conf --sentinel
    /usr/local/redis6/bin/redis-server /data/redis/sentinel2.conf --sentinel
    /usr/local/redis6/bin/redis-server /data/redis/sentinel3.conf --sentinel
    
  • 优点:主从可以自动切换,可用性更高

  • 缺点:主从切换会丢失短暂数据;主节点的写能力和存储能力受限

6.SpringCloud整合Redis哨兵模式

  • 配置文件

    spring:
      redis:
        password: 123456
        sentinel:
          master: mymaster
          nodes: 192.168.1.12:26379,192.168.1.12:26380,192.168.1.12:26381
    

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

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

相关文章

案例:应用内字体大小调节

文章目录 介绍相关概念完整实例 代码结构解读保存默认大小获取字体大小修改字体大小 介绍 本篇Codelab将介绍如何使用基础组件Slider,通过拖动滑块调节应用内字体大小。要求完成以下功能: 实现两个页面的UX:主页面和字体大小调节页面。拖动…

【电子通识】开漏输出和推挽输出有什么差别?

在看一些MCU芯片手册的时候,能发现GPIO的功能有开漏输出和推挽式输出。那么这两种输出到底有什么差别? 如下是STM32F10xxx参考手册中对于GPIO的功能描述: 如下为GPIO内部框图: 在一些其他的芯片规格书中也同样看到不同的GPIO工作…

java基于Spring Boot的灾害应急救援评估调度平台

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。(1)鉴于该系统是一款面向…

详细讲解Python连接Mysql的基本操作

目录 前言1. mysql.connector2. pymysql 前言 连接Mysql一般有几种方法,主要讲解mysql.connector以及pymysql的连接 后续如果用到其他库还会持续总结! 对于数据库中的表格,本人设计如下:(为了配合下面的操作) 1. mysql.connector mysql.connector 是一…

高通平台开发系列讲解(PCIE篇)MHI (Modem Host Interface)驱动详解

文章目录 一、MHI驱动代码二、MHI读数据流程三、MHI写数据流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢MHI (Modem Host Interface)我们通过名字顾名思义知道,它是Modem与Host的桥梁。 MHI 可以很容易地适应任何外围总线,但它主要用于基于 PCIe 的设备。 MHI(…

MathType中文网站2024最新版本下载及嵌入word教程

MathType是一款专业的数学公式编辑器,兼容Office word,excel等700多种程序,用于编辑数学试卷、书籍、报刊、论文、幻灯演示等文档轻松输入各种复杂的数学公式和符号。 MathType是一款功能强大的数学公式编辑器,广泛用于编写和编辑数学公式。Word是微软公司推出的文…

力扣精选算法100题——水果成篮(滑动窗口专题)

本题链接👉水果成篮 第一步:了解题意 我就按照实例1来进行对这题的理解。 1代表种类类型,这个数组里面有2个种类类型 ps:种类1和种类2 ,只不过种类1是有2个水果,种类2有一个水果,共计3个水果。 本题需要解…

【K8s学习】

k8s的简单执行流程: Kubernetes Master(API Server、Scheduler等组件)负责调度Pod到合适的Node上。 当Pod被调度到某个Node时,该Node上的kubelet代理会收到指令并开始执行Pod的生命周期管理任务,包括创建、监控和终止P…

Java代码审计FastJson反序列化利用链跟踪动态调试autoType绕过

目录 0x00 前言 0x01 基础参考 JNDI注入实例 使用type加入User类解析 FastJson历史漏洞简介 0x02 FastJson 1.2.24 利用链分析 调试过程 构造Poc思路 CC链关键流程 0x03 FastJson 1.2.25-1.2.47 利用链分析 1、开启autoTypeSupport:1.2.25-1.2.41 调试过…

centos7 arm服务器编译安装python 3.8

前言 CentOS (Community Enterprise Operating System) 是一种基于 Red Hat Enterprise Linux (RHEL) 进行源代码再编译并免费提供给用户的 Linux 操作系统。 CentOS 7 采用了最新的技术和软件包,并提供了强大的功能和稳定性。它适用于各种服务器和工作站应用场景&a…

【数据库原理】(27)数据库恢复

在数据库系统中,恢复是指在发生某种故障导致数据库数据不再正确时,将数据库恢复到已知正确的某一状态的过程。数据库故障可能由多种原因引起,包括硬件故障、软件错误、操作员失误以及恶意破坏。为了确保数据库的安全性和完整性,数…

SpringMVC SpringMVC 的入门

2.1.环境搭建 2.1.1.创建工程 2.1.2.添加web支持 右键项目选择Add framework support... 如果没有,可以参考idea2023版如何新建web项目 2.添加web支持 ​ 3.效果 ​ 注意: 不要先添加打包方式将web目录要拖拽到main目录下,并改名为…

MySQL多表关联查询练习题

一、创建表的素材 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: …

QTabelView使用代理自定义,第一列为QLabel第二列为下拉框

预览界面 代理源文件 CustomParamViewDelegate.cpp #include "CustomParamViewDelegate.h"CustomParamViewDelegate::CustomParamViewDelegate(QObject *parent): QStyledItemDelegate(parent) {}CustomParamViewDelegate::~CustomParamViewDelegate() {}QWidget* …

C#MQTT编程06--MQTT服务器和客户端(winform版)

1、前言 介绍完基础理论部分,下面在Windows平台上搭建一个简单的MQTT应用,进行简单的应用,整体架构如下图所示; 消息模型: 运用MQTT协议,设备可以很方便地连接到物联网云服务,管理设备并处理数…

基于SSM的网上招聘系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

云服务器CVM_云主机_云计算服务器_弹性云服务器-腾讯云

腾讯云服务器CVM提供安全可靠的弹性计算服务,腾讯云明星级云服务器,弹性计算实时扩展或缩减计算资源,支持包年包月、按量计费和竞价实例计费模式,CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格,提供9个9的数…

【QML COOK】- 009-组件(Components)

组件对于QML来说就如同C的类一样。可以用同一个组件创建多个对象。 组件有两种定义方式: 用独立的.qml文件定义组件在.qml文件中用Component对象定义组件 1. 创建项目,新建文件IndependentComponent.qml import QtQuickRectangle {id : rootText {id…

Sqoop安全性:确保安全的数据传输

确保数据传输的安全性在大数据处理中至关重要。Sqoop作为一个用于数据传输的工具,也提供了多种安全性措施,以确保数据在传输过程中的机密性和完整性。本文将深入探讨Sqoop的安全性特性,提供详细的示例代码和全面的内容,以帮助大家…

Flink-SQL——时态表(Temporal Table)

时态表(Temporal Table) 文章目录 时态表(Temporal Table)数据库时态表的实现逻辑时态表的实现原理时态表的查询实现时态表的意义 Flink中的时态表设计初衷产品价格的例子——时态表汇率的例子——普通表 声明版本表声明版本视图声明普通表 一个完整的例子测试数据代码实现测试…