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

news/2024/2/25 21:05:56/文章来源:https://blog.csdn.net/2302_76363587/article/details/135613480

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: 123456sentinel:master: mymasternodes: 192.168.1.12:26379,192.168.1.12:26380,192.168.1.12:26381
    

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

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

相关文章

canvas绘制美队盾牌

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

STC8H8K蓝牙智能巡线小车——1. 环境搭建(基于RTX51操作系统)

1. 基本介绍 开发环境准备:Keil uVision5 烧录软件:STC-ISP(V6.92A) 芯片: STC8H8K64U-45I-LQFP64 芯片引脚: 2.创建项目 打开Keil,点击【Project】,选择【new uVersion proje…

快乐学Python,如何使用爬虫从网页中提取感兴趣的内容?

前面的内容,我们了解了使用urllib3和selenium来下载网页,但下载下来的是整个网页的内容,那我们又怎么从下载下来的网页中提取我们自己感兴趣的内容呢?这里就需要Python的另一个库来实现-BeautifulSoup。 BeautifulSoup 是一个 Py…

数据仓库(2)-认识数仓

1、数据仓库是什么 数据仓库 ,由数据仓库之父比尔恩门(Bill Inmon)于1990年提出,主要功能仍是将组织透过资讯系统之联机事务处理(OLTP)经年累月所累积的大量资料,透过数据仓库理论所特有的资料储存架构,做…

可以在微信群里使用midjourney,gpt4,gemini,文心一言4.0,且免费

免费使用gpt4和midjourney 免费使用 参考链接: https://chat.xutongbao.top/

【银行测试】银行项目,信用卡业务测试+常问面试(三)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 银行测试-信用卡业…

轻松识别Midjourney等AI生成图片,开源GenImage

AIGC时代,人人都可以使用Midjourney、Stable Diffusion等AI产品生成高质量图片,其逼真程度肉眼难以区分真假。这种虚假照片有时会对社会产生不良影响,例如,生成公众人物不雅图片用于散播谣言;合成虚假图片用于金融欺诈…

Angular系列教程之DOM操作

文章目录 引言1. ElementRef2. Renderer23. ViewChild结论 引言 在Angular中,DOM操作是开发Web应用程序的一个重要方面。通过对DOM进行操作,我们可以动态地修改页面内容、样式和元素行为。本文将详细介绍如何在Angular中进行DOM操作,并提供相…

从数据可视化到场景渲染:山海鲸的创新与实践

作为山海鲸的开发者,我们深知可视化模型场景渲染在数据分析和决策支持中的重要作用。因此在保证山海鲸可视化软件免费编辑、分享、部署的同时也在场景渲染方面不断优化,本文将介绍山海鲸在可视化模型场景渲染方面的技术革新与实践探索。 首先&#xff0…

【STM32】STM32学习笔记-USART串口数据包(28)

00. 目录 文章目录 00. 目录01. 串口简介02. HEX数据包03. 文本数据包04. HEX数据包接收05. 文本数据包接收06. 预留07. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持…

Go并发快速入门:Goroutine

Go并发:Goroutine 1.并发基础概念:进程、线程、协程 (1) 进程 可以比作食材加工的一系列动作 进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程…

unity面试题

一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。 二:Unity3d中的碰…

汽车线束的汽配企业MES管理系统解决方案

随着科技的飞速发展和环保需求的日益提升,新能源汽车在全球范围内崭露头角,成为未来出行的主导力量。在这股浪潮中,中国凭借其强大的研发实力和市场敏锐度,迅速崛起为新能源汽车领域的佼佼者。而作为汽车数字化控制与智能化应用的…

Excel地址

解题思路: 根据题中歪歪和笨笨的话可以有两种解法。 1.输入的数为多大,则循环1多少次,当值为27时就要进行进位操作。这时要分情况讨论。 当集合中元素为一个时,如26,则需要变为1 1,集合元素个数加一。 当…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C,其中项目 A 依赖 B,项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说,依赖的关系为:A—>B—>C, 那么我们执行项目 …

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…

ES高级查询

ES中提供了一种强大的检索数据方式,这种检索方式称为Query DSL,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 1.常见查询 1.1查询所有[match_all] match_all关键字:返回索引中的全部文档。 GET /products/_search { &…

Redis-redis.conf配置文件中的RDB与AOF持久化方式的详解与区别

RDB(Redis Database) RDB是Redis的默认持久化方式,它将内存中的数据以二进制格式写入磁盘,形成一个快照。RDB持久化有以下几个重要的配置选项: save:指定了保存RDB的策略,默认的配置是每900秒&…

域名群站开源系统分享开源域名授权系统

一、需要自己安装PHP和MYSQL服务器环境。 二、务必设置伪静态规则,否则将无法访问文章栏目页面。 三、启用伪静态功能,请在站点设置中选择使用thinkphp的伪静态规则。 四、在域名的根目录下找到”data/config.php”文件,填入数据库的账号和…

使用WAF防御网络上的隐蔽威胁之CSRF攻击

在网络安全领域,除了常见的XSS(跨站脚本)攻击外,CSRF(跨站请求伪造)攻击也是一种常见且危险的威胁。这种攻击利用用户已经验证的身份在没有用户知情的情况下,执行非授权的操作。了解CSRF攻击的机…