Redis主从模式与哨兵模式详解及案例分析

Redis主从模式与哨兵模式详解及案例分析

目录

  • Redis主从模式与哨兵模式详解及案例分析
    • 1. 引言
    • 2. Redis主从模式
      • 2.1 主从模式概述
      • 2.2 主从模式配置
      • 2.3 主从模式优缺点
    • 3. Redis哨兵模式
      • 3.1 哨兵模式概述
      • 3.2 哨兵模式配置
      • 3.3 哨兵模式优缺点
    • 4. 案例分析
      • 4.1 案例一:主从模式实现读写分离
      • 4.2 案例二:哨兵模式实现高可用
      • 4.3 案例三:主从模式与哨兵模式结合
    • 5. 总结

1. 引言

Redis是一个高性能的键值存储系统,广泛应用于缓存、消息队列、会话存储等场景。为了提高Redis的可用性和扩展性,Redis提供了主从模式和哨兵模式。本文将详细介绍这两种模式的工作原理、配置方法,并通过三个案例来展示如何在实际项目中使用这些模式。

2. Redis主从模式

2.1 主从模式概述

Redis主从模式是一种数据复制机制,其中一个Redis实例(主节点)将其数据复制到一个或多个Redis实例(从节点)。主节点负责处理写操作,而从节点负责处理读操作。通过这种方式,可以实现读写分离,提高系统的读取性能。

2.2 主从模式配置

在Redis中配置主从模式非常简单。假设我们有一个主节点(master)和两个从节点(slave1slave2),配置步骤如下:

  1. 主节点配置:主节点无需特殊配置,只需正常启动即可。

  2. 从节点配置:在每个从节点的配置文件中,添加以下配置:

    slaveof <master-ip> <master-port>
    

    例如,如果主节点的IP地址为192.168.1.100,端口为6379,则在slave1slave2的配置文件中添加:

    slaveof 192.168.1.100 6379
    
  3. 启动Redis实例:分别启动主节点和从节点。

2.3 主从模式优缺点

优点

  • 读写分离:主节点处理写操作,从节点处理读操作,提高了读取性能。
  • 数据冗余:从节点保存了主节点的数据副本,提高了数据的可靠性。

缺点

  • 单点故障:如果主节点宕机,整个系统将无法处理写操作。
  • 数据延迟:从节点的数据可能会有一定的延迟,尤其是在高负载情况下。

3. Redis哨兵模式

3.1 哨兵模式概述

哨兵模式是Redis提供的一种高可用解决方案。哨兵(Sentinel)是一个独立的进程,用于监控Redis主从节点的健康状态。当主节点发生故障时,哨兵可以自动将一个从节点提升为新的主节点,从而实现故障转移。

3.2 哨兵模式配置

假设我们有一个主节点(master)、两个从节点(slave1slave2)和三个哨兵节点(sentinel1sentinel2sentinel3),配置步骤如下:

  1. 主从节点配置:按照2.2节的方法配置主从节点。

  2. 哨兵节点配置:在每个哨兵节点的配置文件中,添加以下配置:

    sentinel monitor mymaster <master-ip> <master-port> <quorum>
    sentinel down-after-milliseconds mymaster <milliseconds>
    sentinel failover-timeout mymaster <milliseconds>
    sentinel parallel-syncs mymaster <number>
    

    例如,如果主节点的IP地址为192.168.1.100,端口为6379,则在sentinel1sentinel2sentinel3的配置文件中添加:

    sentinel monitor mymaster 192.168.1.100 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1
    
  3. 启动Redis实例:分别启动主节点、从节点和哨兵节点。

3.3 哨兵模式优缺点

优点

  • 高可用性:当主节点发生故障时,哨兵可以自动进行故障转移,确保系统的可用性。
  • 自动故障检测:哨兵可以自动检测主节点的健康状态,无需人工干预。

缺点

  • 配置复杂:哨兵模式的配置相对复杂,尤其是在大规模集群中。
  • 性能开销:哨兵节点需要额外的资源来监控主从节点的状态。

4. 案例分析

4.1 案例一:主从模式实现读写分离

场景描述:在一个高并发的Web应用中,数据库的读取压力较大,希望通过Redis主从模式实现读写分离,减轻主数据库的压力。

实现步骤

  1. 配置主从节点:按照2.2节的方法配置主从节点。
  2. 编写Python代码:使用Python的redis-py库来实现读写分离。
import redis# 主节点连接
master = redis.StrictRedis(host='192.168.1.100', port=6379, db=0)# 从节点连接
slave1 = redis.StrictRedis(host='192.168.1.101', port=6379, db=0)
slave2 = redis.StrictRedis(host='192.168.1.102', port=6379, db=0)# 写操作
master.set('key', 'value')# 读操作
value1 = slave1.get('key')
value2 = slave2.get('key')print(f"Slave1 value: {value1}")
print(f"Slave2 value: {value2}")

流程图

客户端
主节点
从节点1
从节点2
写操作
读操作
读操作

4.2 案例二:哨兵模式实现高可用

场景描述:在一个金融系统中,Redis用于存储用户的交易数据,要求系统具有高可用性,当主节点发生故障时,能够自动切换到从节点。

实现步骤

  1. 配置主从节点和哨兵节点:按照3.2节的方法配置主从节点和哨兵节点。
  2. 编写Python代码:使用Python的redis-py库来实现高可用。
import redis
from redis.sentinel import Sentinel# 哨兵节点连接
sentinel = Sentinel([('192.168.1.200', 26379), ('192.168.1.201', 26379), ('192.168.1.202', 26379)], socket_timeout=0.1)# 获取主节点和从节点
master = sentinel.master_for('mymaster', socket_timeout=0.1)
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)# 写操作
master.set('key', 'value')# 读操作
value = slave.get('key')print(f"Value: {value}")

流程图

客户端
哨兵节点1
哨兵节点2
哨兵节点3
主节点
写操作
从节点
读操作

4.3 案例三:主从模式与哨兵模式结合

场景描述:在一个电商系统中,Redis用于存储商品信息和用户购物车数据,要求系统具有高可用性和读写分离能力。

实现步骤

  1. 配置主从节点和哨兵节点:按照2.2节和3.2节的方法配置主从节点和哨兵节点。
  2. 编写Python代码:使用Python的redis-py库来实现高可用和读写分离。
import redis
from redis.sentinel import Sentinel# 哨兵节点连接
sentinel = Sentinel([('192.168.1.200', 26379), ('192.168.1.201', 26379), ('192.168.1.202', 26379)], socket_timeout=0.1)# 获取主节点和从节点
master = sentinel.master_for('mymaster', socket_timeout=0.1)
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)# 写操作
master.set('product:1', 'Product A')
master.set('cart:user1', 'Item1, Item2')# 读操作
product = slave.get('product:1')
cart = slave.get('cart:user1')print(f"Product: {product}")
print(f"Cart: {cart}")

流程图

客户端
哨兵节点1
哨兵节点2
哨兵节点3
主节点
写操作
从节点
读操作

5. 总结

Redis主从模式和哨兵模式是提高Redis可用性和扩展性的重要手段。主从模式通过读写分离提高了读取性能,而哨兵模式通过自动故障转移提高了系统的可用性。在实际项目中,可以根据需求选择合适的数据复制和高可用方案,或者将两者结合使用,以达到最佳的系统性能。

通过本文的三个案例,我们展示了如何在不同的场景中使用Redis主从模式和哨兵模式,并提供了完整的Python代码实现和流程图。希望这些案例能够帮助读者更好地理解和应用Redis的主从模式和哨兵模式。

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

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

相关文章

Linux 零拷贝技术

一、传统做法&#xff0c;经历“四次拷贝” 数据 1.读取到内核缓冲区 2.拷贝到用户缓冲区 3.写入到内核缓冲区 4.拷贝到网卡 使用 DMA&#xff0c;减少2次拷贝&#xff0c;还剩2次拷贝 DMA 负责硬盘到内核缓冲区和内核到网卡的传输。 CPU 仍需处理内核和用户缓冲区之间的数据…

【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

Centos 8 离线升级openssh 9.9

背景 根据云服务漏检报告&#xff0c;需要升级云服务器openssh服务&#xff08;离线环境&#xff09;。本文将采用rpm包形式&#xff0c;将openssh服务由OpenSSH_8.0p1 升级至OpenSSH_9.9p1。准备一台能够联网的服务器&#xff08;简称server1&#xff09;用于下载程序包&#…

利用Vue和javascript分别编写一个“Hello World”的定时更新

目录 一、利用Vue编写一个“Hello World”的定时更新&#xff08;1&#xff09;vue编码在Html文件中&#xff08;2&#xff09;vue编码在js文件中 二、利用javascript编写一个“Hello World”的定时更新 一、利用Vue编写一个“Hello World”的定时更新 &#xff08;1&#xff…

蓝桥杯python基础算法(2-1)——排序

目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 &#xff08;一&#xff09;冒泡排序 基本思想&#xff1a;比较相邻的元素&#xff0c;如果顺序错误就把它们交换过来。 &#xff08;二&#xff09;选择排序 基本思想…

洛谷 P4552 [Poetize6] IncDec Sequence C语言

P4552 [Poetize6] IncDec Sequence - 洛谷 | 计算机科学教育新生态 题目描述 给定一个长度为 n 的数列 a1​,a2​,…,an​&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使这个区间内的数都加 1 或者都减 1。 请问至少需要多少次操作才能使数列中的所有数都一样&#…

Vue Dom截图插件,截图转Base64 html2canvas

安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…

88.[4]攻防世界 web php_rce

之前做过&#xff0c;回顾&#xff08;看了眼之前的wp,跟没做过一样&#xff09; 属于远程命令执行漏洞 在 PHP 里&#xff0c;system()、exec()、shell_exec()、反引号&#xff08;&#xff09;等都可用于执行系统命令。 直接访问index.php没效果 index.php?sindex/think\a…

为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?

为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同&#xff0c;实参前会加前缀&#xff0c;尤其参数很多的情况&#xff0c;可读性很强。例如&#xff1a; [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意&#xff0…

数据结构-堆和PriorityQueue

1.堆&#xff08;Heap&#xff09; 1.1堆的概念 堆是一种非常重要的数据结构&#xff0c;通常被实现为一种特殊的完全二叉树 如果有一个关键码的集合K{k0,k1,k2,...,kn-1}&#xff0c;把它所有的元素按照完全二叉树的顺序存储在一个一维数组中&#xff0c;如果满足ki<k2i…

【C#】Process、ProcessStartInfo启动外部exe

在C#中使用 Process 和 ProcessStartInfo 类启动外部 .exe 文件&#xff0c;可以按照以下步骤进行&#xff1a; 创建 ProcessStartInfo 实例&#xff1a;配置进程启动信息&#xff0c;包括可执行文件的路径、传递给该程序的参数等。 设置启动选项&#xff1a;根据需要配置 Pro…

oracle 基础语法复习记录

Oracle SQL基础 因工作需要sql能力&#xff0c;需要重新把sql这块知识重新盘活&#xff0c;特此记录学习过程。 希望有新的发现。加油&#xff01;20250205 学习范围 学习SQL基础语法 掌握SELECT、INSERT、UPDATE、DELETE等基本操作。 熟悉WHERE、GROUP BY、ORDER BY、HAVIN…

【Rust自学】20.2. 最后的项目:多线程Web服务器

说句题外话&#xff0c;这篇文章非常要求Rust的各方面知识&#xff0c;最好看一下我的【Rust自学】专栏的所有内容。这篇文章也是整个专栏最长&#xff08;4762字&#xff09;的文章&#xff0c;需要多次阅读消化&#xff0c;最好点个收藏&#xff0c;免得刷不到了。 喜欢的话…

RabbitMQ深度探索:简单实现 MQ

基于多线程队列实现 MQ &#xff1a; 实现类&#xff1a; public class ThreadMQ {private static LinkedBlockingDeque<JSONObject> broker new LinkedBlockingDeque<JSONObject>();public static void main(String[] args) {//创建生产者线程Thread producer n…

自定义多功能输入对话框:基于 Qt 打造灵活交互界面

一、引言 在使用 Qt 进行应用程序开发时&#xff0c;我们经常需要与用户进行交互&#xff0c;获取他们输入的各种信息。QInputDialog 是 Qt 提供的一个便捷工具&#xff0c;可用于简单的输入场景&#xff0c;但当需求变得复杂&#xff0c;需要支持更多类型的输入控件&#xff0…

国产编辑器EverEdit - 工具栏说明

1 工具栏 1.1 应用场景 当用户想显示/隐藏界面的标签栏、工具栏、状态栏、主菜单等界面元素时&#xff0c;可以通过EverEdit的菜单选项进行设置。 1.2 使用方法 选择菜单查看 -> 工具栏&#xff0c;在工具栏的子菜单中选择勾选或去掉勾选对应的选项。 标签栏&#xff1…

ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…

当大模型遇上Spark:解锁大数据处理新姿势

大模型与 Spark&#xff1a;技术初印象 在当今数字化浪潮中&#xff0c;大模型和 Spark 无疑是备受瞩目的两大技术。它们各自在人工智能和大数据处理领域大放异彩&#xff0c;而当这两者相遇&#xff0c;又会碰撞出怎样的火花呢&#xff1f;让我们先来分别认识一下大模型和 Sp…

第 1 天:UE5 C++ 开发环境搭建,全流程指南

&#x1f3af; 目标&#xff1a;搭建 Unreal Engine 5&#xff08;UE5&#xff09;C 开发环境&#xff0c;配置 Visual Studio 并成功运行 C 代码&#xff01; 1️⃣ Unreal Engine 5 安装 &#x1f539; 下载与安装 Unreal Engine 5 步骤&#xff1a; 注册并安装 Epic Game…