Redis之高可用方案浅析

news2024/9/29 21:31:35

在工程项目中,系统应用的高可用性越来越重要,业主越来越重视。其实高可用可以分为应用层高可用和数据层高可用,数据层高可用中常见的有关系型数据库mysql的高可用、非关系型NoSQl数据库redis的高可用等,下面聊聊典型的NoSQL数据库redis的高可用方案。

高可用(High Availability,即HA),指的是通过尽量缩短日常维护操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。一个业务系统如果全年无一时刻不在提供服务,它的可用性可达100%。那么什么样的系统可以称之为高可用呢,业界一般用几个九来衡量系统的可用性,当系统运行时间达到4个九即99.99%时的系统为高可用的,全年宕机时间为52分钟左右。

1、redis集群简介

redis集群是一种通过将多个redis节点连接在一起以实现高可用性数据分片负载均衡的技术。根据搭建的方式和集群的特性,redis集群主要有三种模式:主从复制Master-Slave模式、哨兵Sentinel模式和集群Cluster模式。
redis集群的作用和优势如下:

  • 容灾恢复:在哨兵模式下,redis集群可以在主节点出现故障时,快速切换到从节点,实现业务的无缝切换;
  • 高可用性:在cluster模式下,redis集群可以在某个节点发生故障时,自动进行故障转移,保证服务的持续可用;
  • 负载均衡:在cluster模式下,redis集群可以将客户端请求分发到不同的节点上,有效地分摊节点的压力,提高系统的整体性能;
  • 数据分片:在cluster模式下,redis集群可以将数据分散在不同的节点上,从而突破单节点内存限制,实现更大规模的数据存储;
  • 易于扩展:在cluster模式下,redis集群可以根据业务需求和系统负载,动态地添加或移除节点,实现水平扩展。

2、主从复制Master-Slave模式

2.1、主从复制原理

主从复制是redis的一种基本集群模式,它通过将一个redis节点(主节点)的数据复制到一个或多个其他redis节点(从节点)来实现数据的冗余和备份。
主节点负责处理客户端的写操作,同时从节点会实时同步主节点的数据。客户端可以从从节点读取数据,实现读写分离,提高系统性能。

2.2、主从复制配置

配置主节点:在主节点的redis.conf配置文件中,无需进行特殊配置,主节点默认监听所有客户端请求。

# 主节点默认端口号6379
port 6379

配置从节点:在从节点的redis.conf配置文件中,天津如下配置,制动主节点的地址和端口。

# 从节点设置端口号6380
port 6380

# replicaof 主节点IP 主节点端口
replicaof 127.0.0.1 6379

在主节点上执行写操作,然后在从节点上进行读操作,检查数据是否一致。

2.3、主从复制的优缺点

  • 优点:配置简单,易于实现;实现数据冗余,提供数据可靠性;读写分离,提供系统性能。
  • 缺点:主节点故障时,需要手动切换到从节点,不能自动实现故障转移,故障恢复时间较长;主节点承担所有写操作,可能成为性能瓶颈;无法实现数据分片,受单节点内存限制。

2.4、主从复制应用场景

主从复制模式适用于以下场景:

  • 数据备份和容灾恢复:通过从节点备份主节点的数据,实现数据冗余;
  • 读写分离:将读操作分发到从节点,减轻主节点压力,提高系统性能;
  • 在线升级和扩展:在不影响主节点的情况下,通过增加从节点来扩展系统的读取能力。

3、哨兵Sentinel模式

3.1、哨兵模式原理

哨兵模式是在主从复制模式的基础上加入了哨兵节点,实现了自动故障转移。哨兵节点是一种特殊的Redis节点,它会监控主节点和从节点的运行状态。当主节点发生故障时,哨兵节点会自动从从节点中选举出一个新的主节点,并通知其他从节点和客户端,实现故障转移。

3.2、哨兵模式配置

配置主从复制:首先按照主从复制模式的配置方法,搭建一个主从复制集群,参考上面。

配置哨兵节点:在哨兵节点上创建一个新的哨兵配置文件(如:sentinel.conf),并添加如下配置:

# sentinel节点端口号
port 26379

# sentinel monitor 被监控主节点名称 主节点IP 主节点端口 quorum
sentinel monitor mymaster 127.0.0.1 6379 2

# sentinel down-after-milliseconds 被监控主节点名称 毫秒数
sentinel down-after-milliseconds mymaster 60000

# sentinel failover-timeout 被监控主节点名称 毫秒数
sentinel failover-timeout mymaster 180000

其中,quorum是指触发故障转移所需的最小哨兵节点数。down-after-milliseconds表示主节点被判断为失效的时间。failover-timeout是故障转移超时时间。

启动哨兵节点:使用如下命令启动哨兵节点

redis> redis-sentinel /path/to/sentinel.conf

手动停止主节点,观察哨兵节点是否自动选举出新的主节点,并通知其他从节点和客户端。

3.3、哨兵模式的优缺点

  • 优点:自动故障转移,提供系统的高可用性;具有主从复制的优点,如数据冗余和读写分离。
  • 缺点:配置和管理相对复杂,依然无法实现数据分片,受单节点内存限制。

3.4、哨兵模式应用场景

哨兵模式适用于以下场景:

  • 高可用性要求较高的场景:通过自动故障转移,确保服务的持续可用;
  • 数据备份和容灾恢复:在主从复制的基础上,提供自动故障转移功能;

4、集群Cluster模式

4.1、Cluster模式原理

Cluster模式是Redis的一种高级集群模式,它通过数据分片和分布式存储实现了负载均衡和高可用性。在Cluster模式下,Redis将所有的键值对数据分散在多个节点上。每个节点负责一部分数据,称为槽位。通过对数据的分片,Cluster模式可以突破单节点的内存限制,实现更大规模的数据存储。
集群部署的方式能自动将数据进行分片,每个master上放一部分数据,提供了内置的高可用服务,即使某个master宕机了,服务还可以正常地提供,类似如下:
在这里插入图片描述
(摘自网上,未再次绘制)
集群模式中数据通过数据分片的方式被自动分割到不同的master节点上,每个Redis集群有16384个哈希槽,进行set操作时,每个key会通过CRC16校验后再对16384取模来决定放置在哪个槽。数据在集群模式中是分开存储的,那么节点之间想要知道其他节点的状态信息,包括当前集群状态、集群中各节点负责的哈希槽、集群中各节点的master-slave状态、集群中各节点的存活状态等是通过建立TCP连接,使用gossip协议来进行集群信息传播。

4.2、Cluster模式配置

配置redis节点:为每个节点创建一个redis.conf配置文件,并添加如下配置

# cluster节点端口号
port 7001

# 开启集群模式
cluster-enabled yes

# 节点超时时间
cluster-node-timeout 15000

像这样的配置,一共需要创建6个,做一个三主三从的集群。

启动redis节点:使用如下命令启动6个节点

redis-server redis_7001.conf

创建redis集群:使用Redis命令行工具执行如下命令创建Cluster

redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

cluster-replicas 表示从节点的数量,1代表每个主节点都有一个从节点,要求集群至少6个;若从节点数量为2,则要求集群至少9个。
向Cluster发送请求,观察请求是否正确路由到相应的节点。

4.4、Cluster模式的优缺点

  • 优点:数据分片、实现大规模数据存储;负载均衡,提供系统性能;自动故障转移,提高高可用性。
  • 缺点:配置和管理较复杂。

4.5、Clustet模式应用场景

Cluster模式适用于以下场景:

  • 大规模数据存储:通过数据分片,突破单节点内存限制;
  • 高性能要求场景:通过负载均衡,提高系统性能;
  • 高可用性要求场景:通过自动故障转移,确保服务的持续可用;

5、搭建集群Cluster模式

redis版本:redis-5.0.12
系统:ubuntun16.04

创建6个Redis的配置文件,如下所示:

/usr/local/redis-5.0.12/redis-cluster-conf/7001/redis.conf
/usr/local/redis-5.0.12/redis-cluster-conf/7002/redis.conf
/usr/local/redis-5.0.12/redis-cluster-conf/7003/redis.conf
/usr/local/redis-5.0.12/redis-cluster-conf/7004/redis.conf
/usr/local/redis-5.0.12/redis-cluster-conf/7005/redis.conf
/usr/local/redis-5.0.12/redis-cluster-conf/7006/redis.conf

配置文件内容如下:

# 端口,每个配置文件不同7001-7006
port 7001 
# 启用集群模式 
cluster-enabled yes 
#节点配置文件
cluster-config-file nodes.conf 
# 超时时间
cluster-node-timeout 5000 
 # 打开aof持久化
appendonly yes
 # 后台运行
daemonize yes
# 非保护模式
protected-mode no 

启动6个redis节点,如下:

./bin/redis-server redis-cluster-conf/7001/redis.conf
./bin/redis-server redis-cluster-conf/7002/redis.conf
./bin/redis-server redis-cluster-conf/7003/redis.conf
./bin/redis-server redis-cluster-conf/7004/redis.conf
./bin/redis-server redis-cluster-conf/7005/redis.conf
./bin/redis-server redis-cluster-conf/7006/redis.conf

此时启动的6个Redis服务是相互独立运行的,通过以下命令配置集群,如下:

./bin/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

配置完看到如下图所示信息表示集群搭建成功:

在这里插入图片描述
从图中可以看到启动了3个master节点,3个slave节点,16384个槽点平均分配到了3个master节点上。图中很长的一串字母数字的组合(07000b3a90…)为节点的ID。后面对节点的操作中会用到。

自动故障转移

当运行中的master节点挂掉了,集群会在该master节点的slave节点中选出一个作为新的master节点。

添加一个主节点

按之前的方式再复制一份配置文件,并修改配置,后启动该Redis服务,执行以下命令将该节点添加到集群中去,如下:

./bin/redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

程序中使用,springboot中连接Redis集群配置

spring:
  redis:
    cluster:
      nodes: 192.168.1.164:7001,192.168.1.164:7002,192.168.1.164:7003,192.168.1.164:7004,192.168.1.164:7005,192.168.1.164:7006
    database: 0
    password: <password>

6、小结

redis集群的每种模式都有其特点和应用场景,分析如下:

  • 主从复制模式:适用于数据备份和读写分离场景,配置简单,但在主节点故障时需要手动切换。
  • 哨兵模式:在主从复制的基础上实现自动故障转移,提高高可用性,适用于高可用性要求较高的场景。
  • Cluster模式:通过数据分片和负载均衡实现大规模数据存储和高性能,适用于大规模数据存储和高性能要求场景。

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

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

相关文章

C# 事件和委托的区别并说明

1.区别 事件是基于委托的&#xff0c;为委托提供了一个发布/订阅机制。可以说事件是一种特殊的委托&#xff0c;他的调用和委托是一样的。 事件的声明 public event 委托类型 事件名称 通常事件的命名以事件名称Event来命名。如public event delegate NotifyEvent; 事件和委…

C++ Primer Plus 第二章习题

目录 复习题 1.C程序的模块叫什么&#xff1f; 2.#include 预处理器编译指令的用处&#xff1f; 3.using namespace std; 该语句是干什么用的&#xff1f; 4.什么语句可以打印一个语句"hello,world"&#xff0c;然后重新换行&#xff1f; 5.什么语句可以用来创…

桂院校园导航 导入 与 配置教程

将 静态项目/云开发项目 文件夹下最新版本的 文件夹下的 项目 的整个文件夹 复制到项目路径下&#xff08;比如 D:\WeChatProjects&#xff09;&#xff0c;强烈建议不要直接扔在桌面上 云开发项目 需开通 云开发 功能&#xff08;首月免费&#xff0c;次月19.9&#xff09;&am…

【论文阅读笔记】CRFL: Certifiably Robust Federated Learning against Backdoor Attacks

个人阅读笔记&#xff0c;如有错误欢迎指出! 会议&#xff1a;PMLR 2021[2106.08283] CRFL: Certifiably Robust Federated Learning against Backdoor Attacks (arxiv.org) 问题&#xff1a; 现有的防御算法缺乏健壮性 创新&#xff1a; 证明了所提出框架得稳定性 通过马尔…

Generative AI 新世界 | 走进文生图(Text-to-Image)领域

在之前的四篇 “Generative AI 新世界” 中&#xff0c;我们带领大家一起探索了生成式 AI&#xff08;Generative AI&#xff09;&#xff0c;以及大型语言模型&#xff08;LLMs&#xff09;的全新世界概览。并在文本生成&#xff08;Text Generation&#xff09;领域做了一些概…

javascript基础十:说说你对Javascript中this对象的理解

一、定义 函数的 this 关键字在 JavaScript 中的表现略有不同&#xff0c;此外&#xff0c;在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下&#xff0c;函数的调用方式决定了 this 的值&#xff08;运行时绑定&#xff09; this 关键字是函数运行时自动生成的一…

进程控制与进程调度 —— 时间片轮转调度算法(C++版)

目录 实验一 进程控制与进程调度 一、实验目的 二、实验内容 三、数据结构及符号说明 四、运行环境说明 五、代码段 六、 效果展示 实验一 进程控制与进程调度 备注&#xff1a;大二&#xff08;下&#xff09;操作系统实验一 一、实验目的 掌握进程状态的转变、…

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit

多次调用java.awt.Toolkit.getDefaultToolkit方法获得是同一个单例的Toolkit java.awt.Toolkit.getDefaultToolkit()import java.awt.Toolkit;public class 多次调用Toolkit的getDefaultToolkit方法获得是同一个单例的Toolkit {static public void main (String...arguments)t…

WMS:系统窗口添加过程

WMS:系统窗口添加过程 1、经常使用的两大类窗口2、系统窗口StatusBar2.1 StatusBarWindowView添加流程2.2 简要时序图 android12-release 1、经常使用的两大类窗口 Android中的“窗口”类型有很多&#xff0c;经常使用的“窗口”大致分为两大类&#xff1a;一是&#xff0c;由系…

对于后端Linux的入门知识

为什么使用Linux 文章来自https://librehunt.org/&#xff0c;在这个网站里&#xff0c;你可以根据它提供的选项&#xff0c;最终选出适合你的Linux版本 It’s safe and private. No tracking. No company watching over you, no “big brother is watching you” nonsense. Ju…

article-三自由度机械臂运动学分析+仿真

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOmeEm3I-1685366971102)(data:image/svgxml;utf8, )] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCu0JrBB-1685366971103)(data:image/svgxml;utf8, )] 建立坐标系 1…

ROS:创建工作空间和编译功能包

目录 一、工作空间二、创建工作空间三、编译空代码的工作空间四、功能包五、创建功能包六、设置和检查环境变量七、功能包中的两个重要文件 一、工作空间 存放工程开发相关文件的文件夹。类似一个IDE&#xff08;例如Pycharm&#xff09;新建一个工程&#xff0c;就是一个工作…

权威认可!腾讯云EdgeOne入选Gartner® DDoS缓解方案市场指南

近日&#xff0c;Gartner发布《Market Guide for DDoS Mitigation Solutions》报告&#xff0c;腾讯云EdgeOne入选Gartner DDoS缓解方案市场指南。 “分布式拒绝服务&#xff08;DDoS&#xff09;缓解市场包括检测和缓解DDoS攻击并将其作为专用产品提供的供应商。它包括专业供…

有这个证书,网络安全工程师找工作不用愁

想要成为网络安全工程师&#xff0c;满足企业的用人要求。最基本的&#xff0c;你需要熟悉TCP/IP协议&#xff0c;熟悉sql注入原理和手工检测、熟悉内存缓冲区溢出原理和防范措施、熟悉信息存储和传输安全、熟悉数据包结构、熟悉Ddos攻击类型和原理。并且有一定的ddos攻防经验&…

I2C通信协议MPU6050

目录 I2C通信协议 硬件 软件 I2C时序 MPU6050 I2C通信协议 硬件 为了避免总线没协调好导致电源短路&#xff0c;配置为开漏输出&#xff0c;所有设备输出低电平不输出高电平&#xff0c;即右图。又为了避免高电平造成的引浮空&#xff0c;&#xff08;第三点&#xff09;总…

kotlin用CoroutineScope启动协程async等待结果返回

kotlin用CoroutineScope启动协程async等待结果返回 例如&#xff1a; import kotlinx.coroutines.*object MyCoroutineScope {private val coroutineContext Job() Dispatchers.Default CoroutineName("my_context")val coroutineScope CoroutineScope(corouti…

【Redis】聊一下Redis数据同步/复制

在分布式系统中&#xff0c;基本上所有的存储中间件都支持数据同步/复制功能&#xff0c;主要的原因是为实现高可用&#xff0c;单点宕机的故障&#xff0c;必须需要将数据进行共享&#xff0c;而共享的话&#xff0c;就需要将数据进行复制&#xff0c;对于已经学过的MySQL和Ka…

Jdk17中文在线手册(建议收藏)

本身学习技术就比较难&#xff0c;再来一个英文版的API&#xff0c;就难上加难&#xff0c;经过几周的研究翻译&#xff0c;JDK17最新版中文在线手册搞定&#xff0c;不要看错了哈是JDK17不是JDK1.7&#xff0c;全网最新的只有JDK11&#xff0c;JDK17中文在线手册是第一次出现&…

JavaEE进阶(5/29)SpringMVC

目录 1.复习 2.URL传参PathVariable 3.上传文件RequestPart 4.获取Cookie/Session/header 5.传统/维新获取cookies 6.传统/维信获得Header 7.获取Session&#xff08;非常重要&#xff09; 8.不加ResponseBody 9.如何获取Json数据&#xff0c;RequestBody 10.想…

王者之力,驭见未来 | 圣戈班量子膜全国核心店面大会圆满落幕!

5月24日&#xff0c;“王者之力&#xff0c;驭见未来”——2023年圣戈班量子膜全国核心店面大会在成都缇沃丽酒店隆重召开&#xff01; 圣戈班舒热佳特殊镀膜有限公司全球总裁Mehrotra Vishal先生、圣戈班舒热佳特殊镀膜有限公司亚太总裁陈剑超先生、圣戈班舒热佳特殊镀膜有限公…