Redis高可用解决方案之Redis集群,和Spring Cloud集成实战

专栏集锦,大佬们可以收藏以备不时之需

Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html

Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html

Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html

tensorflow专栏:https://blog.csdn.net/superdangbo/category_8691332.html

Redis专栏:https://blog.csdn.net/superdangbo/category_9950790.html

Spring Cloud实战:

Spring Cloud 实战 | 解密Feign底层原理,包含实战源码

Spring Cloud 实战 | 解密负载均衡Ribbon底层原理,包含实战源码

1024程序员节特辑文章:

1024程序员狂欢节特辑 | ELK+ 协同过滤算法构建个性化推荐引擎,智能实现“千人千面”

1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力

1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

1024程序员节特辑 | OKR VS KPI谁更合适?

1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

Spring实战系列文章:

Spring实战 | Spring AOP核心秘笈之葵花宝典

Spring实战 | Spring IOC不能说的秘密?

国庆中秋特辑系列文章:

国庆中秋特辑(八)Spring Boot项目如何使用JPA

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

国庆中秋特辑(六)大学生常见30道宝藏编程面试题

国庆中秋特辑(五)MySQL如何性能调优?下篇

国庆中秋特辑(四)MySQL如何性能调优?上篇

国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现

国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作

国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词

在这里插入图片描述

目录

  • 1、Redis 集群核心原理
  • 2、Redis集群搭建和验证
  • 3、Redis集群和Spring Cloud项目集成
  • 4、Redis集群注意事项
  • 5、Redis集群常见问题和解决方案

在这里插入图片描述
https://redis.io/

1、Redis 集群核心原理

Redis 集群的核心原理主要包括数据分片、节点角色、分布式哈希表、数据复制、故障转移和恢复等。下面将简要分析这些核心原理以及相关的核心代码。

  1. 数据分片:
    Redis 集群通过将数据根据 key 的哈希值分散到多个节点上,实现数据的分布式存储。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterCreate(const std::string &node_ip, uint16_t node_port) {  // ...  int ret = redisClusterCreate(node_ip.c_str(), node_port);  if (ret == REDIS_CLUSTER_OK) {  // 添加到集群  redisClusterAddNode(node_ip.c_str(), node_port);  }  return ret;  
}
  1. 节点角色:
    Redis 集群中的节点分为三种角色:主节点(Master)、从节点(Slave)和空闲节点(Idle)。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterSetNodeRole(const std::string &node_ip, uint16_t node_port, RedisClusterNodeRole role) {  // ...  return redisClusterSetNodeRole(node_ip.c_str(), node_port, role);  
}
  1. 分布式哈希表:
    Redis 集群采用分布式哈希表(DHT)来存储和管理数据。DHT 能够确保数据在不同节点之间的分布式存储和一致性。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterSet(const std::string &key, const std::string &value, uint32_t expiration) {  // ...  return redisClusterSet(key.c_str(), value.c_str(), expiration);  
}
  1. 数据复制:
    Redis 集群采用主从复制机制确保数据在不同节点之间的同步。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterReplicaSync(const std::string &master_ip, uint16_t master_port, const std::string &slave_ip, uint16_t slave_port) {  // ...  return redisClusterReplicaSync(master_ip.c_str(), master_port, slave_ip.c_str(), slave_port);  
}
  1. 故障转移和负载均衡:
    Redis 集群通过节点间的协作实现故障转移和负载均衡。当某个节点发生故障时,其负责的哈希槽会自动转移给其他节点。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterSlotMove(uint16_t slot, const std::string &new_node_ip, uint16_t new_node_port) {  // ...  return redisClusterSlotMove(slot, new_node_ip.c_str(), new_node_port);  
}
  1. 去中心化通信:
    Redis 集群采用去中心化 gossipsub 协议进行节点间通信。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterNodeAdd(const std::string &ip, uint16_t port, RedisClusterNode *node) {  // ...  return redisClusterNodeAdd(ip.c_str(), port, node);  
}
  1. 自动故障检测和恢复:
    Redis 集群通过周期性的心跳检测和故障转移策略来实现自动故障检测和恢复。核心代码如下:
// RedisClusterClient.c  
int RedisClusterClient::clusterHeartbeat(const std::string &node_ip, uint16_t node_port) {  // ...  return redisClusterHeartbeat(node_ip.c_str(), node_port);  
}

综上所述,Redis 集群的核心原理和核心代码涉及数据分片、节点角色、分布式哈希表、数据复制、故障转移和恢复、去中心化通信以及自动故障检测和恢复等方面。
在这里插入图片描述

2、Redis集群搭建和验证

Redis 集群的搭建分为以下几个步骤:

  1. 准备环境
    确保你的系统已安装 Redis,并检查 gcc 版本是否在 5.3 以上。如果未达到要求,请升级 gcc。以下是升级 gcc 的命令:
yum -y install centos-release-sclyum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils  
scl enable devtoolset-9 bash  
  1. 下载 Redis 源码
    访问 Redis 官网(https://redis.io/download)下载最新版本的源码。解压下载的文件:
tar -xzf redis-5.0.2.tar.gz  
  1. 编译 Redis
    进入解压后的目录,编译 Redis:
cd redis-5.0.2  
make  
make install  
  1. 配置 Redis 节点
    在搭建 Redis 集群之前,需要为每个 Redis 节点配置配置文件。在每个节点的配置文件(redis.conf)中,修改以下参数:
  • 开启集群模式:
cluster-enabled yes  
  • 设置集群节点地址:
cluster-node-timeout 5000  
  • 设置集群初始化密码:
cluster-initialize-password your_password  
  1. 启动 Redis 节点
    在每个节点上启动 Redis 服务:
redis-server /path/to/your/redis.conf  
  1. 创建 Redis 集群
    在第一个 Redis 节点上,创建 Redis 集群:
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1  

此时,你将看到如下输出,表示 Redis 集群创建成功:

127.0.0.1:7000 -> 0 nodes  
127.0.0.1:7001 -> 1 nodes  
127.0.0.1:7002 -> 2 nodes  
[OK] All nodes agree about slots configuration.  
  1. 验证 Redis 集群
    使用以下命令验证 Redis 集群是否正常运行:
redis-cli --cluster check 127.0.0.1:7000  

如果输出如下内容,表示集群正常运行:

127.0.0.1:7000 # node-id  - node-ip 127.0.0.1  - slot0-127.0.0.1:7000  - slot1-127.0.0.1:7001  - slot2-127.0.0.1:7002  - slot16384-127.0.0.1:7000  - pong 0 127.0.0.1:7001 127.0.0.1:7002  

至此,Redis 集群已成功搭建。你可以使用 Redis 客户端连接到集群并执行相关操作。

3、Redis集群和Spring Cloud项目集成

Redis 集群与 Spring Cloud 集成可以提高系统的可扩展性、稳定性和性能。集成过程中,主要涉及到以下几个方面:

  1. 配置 Redis 集群:
    在 Spring Cloud 项目中,需要配置 Redis 集群的相关信息,如节点地址、端口、密码等。配置文件示例:
spring:  redis:  cluster:  nodes:  - ip: 192.168.1.1  port: 7000  - ip: 192.168.1.2  port: 7001  - ip: 192.168.1.3  port: 7002  password: your_password  
  1. 集成 Spring Data Redis:
    在 Spring Cloud 项目中,引入 Spring Data Redis 组件,以便于使用一致的 API 操作 Redis 集群。
<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId>  
</dependency>  
  1. 创建 Redis 客户端 Bean:
    在 Spring Cloud 项目中,创建一个 Redis 客户端 Bean,用于封装 Redis 集群的连接和操作。
@Configuration  
public class RedisConfig {@Bean  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {  RedisTemplate<String, Object> template = new RedisTemplate<>();  template.setConnectionFactory(redisConnectionFactory);  return template;  }  
}
  1. 操作 Redis 集群:
    在 Spring Cloud 项目中,使用 Spring Data Redis 提供的 API 操作 Redis 集群。
@Service  
public class RedisService {@Autowired  private RedisTemplate<String, Object> redisTemplate;public String get(String key) {  return redisTemplate.opsForValue().get(key);  }public void set(String key, Object value) {  redisTemplate.opsForValue().set(key, value);  }// 其他操作...  
}
  1. 使用 Redis 集群:
    在 Spring Cloud 项目中的其他组件(如 Controller、Service 等),通过注入 RedisService Bean 的方式使用 Redis 集群。
@RestController  
public class SomeController {@Autowired  private RedisService redisService;@GetMapping("/get")  public String get(String key) {  return redisService.get(key);  }@PostMapping("/set")  public void set(String key, Object value) {  redisService.set(key, value);  }  
}

总之,Redis 集群与 Spring Cloud 集成过程中,需要配置 Redis 集群信息、引入 Spring Data Redis 组件、创建 Redis 客户端 Bean、操作 Redis 集群以及在其他组件中使用 Redis 集群。通过这些步骤,可以充分利用 Redis 集群的高性能、可扩展性等特点,提升 Spring Cloud 项目的整体性能。

4、Redis集群注意事项

Redis 集群搭建过程中需要注意以下几点:

  1. 节点选择:确保选择具有足够内存、CPU 能力和稳定网络连接的节点来搭建 Redis 集群。同时,根据实际需求规划节点数量,以便在后续扩展或调整集群规模时能够灵活应对。
  2. 配置文件:在配置文件中,设置 cluster-require-full-coverage 参数。该参数用于控制 Redis 集群是否需要全部覆盖 16384 个 slot 才能对外提供服务。建议将其设置为 no,以避免因个别 slot 异常导致整个集群无法提供服务。
  3. 集群状态监控:定期检查 Redis 集群状态,使用 redis-cli 命令查看集群信息,包括集群状态、节点信息、内存、CPU 使用情况等。确保集群运行正常,及时发现并解决潜在问题。
  4. 网络连通性:确保 Redis 集群内的节点之间网络连通正常,避免出现连接故障。可以通过测试连接、查看网络日志等方式进行检查。
  5. 数据分布:在搭建 Redis 集群时,应注意合理分配数据到各个节点。避免某个节点负担过重,导致性能瓶颈或其他问题。
  6. 配置主从复制:为了保证数据安全和高可用性,应配置主从复制关系。当主节点发生故障时,可以从节点顶替主节点,确保服务不受影响。
  7. 负载均衡:使用负载均衡策略,如 Redis Cluster 提供的轮询、最少连接等算法,合理分配客户端请求到各个节点,以提高集群整体性能。
  8. 安全防护:加强 Redis 集群的安全措施,例如设置密码、限制非法访问、监控异常行为等。
  9. 监控与报警:部署 Redis 集群监控系统,实时监控集群性能指标,如内存使用率、CPU 使用率等。当监控指标超过预设阈值时,自动触发报警,提醒运维人员及时处理。
  10. 定期维护:对 Redis 集群进行定期维护,包括检查节点状态、优化数据分布、升级软件版本等。这有助于确保集群长期稳定运行。
    总之,在搭建和运维 Redis 集群时,要注意以上几点,以保证集群的高可用性、性能和安全性。同时,不断学习和掌握 Redis 的新特性和技术动态,以便更好地应用于实际项目中。

5、Redis集群常见问题和解决方案

Redis 集群在实际应用过程中,可能会遇到一些常见问题,下面列举了一些典型问题及其解决方案:

  1. 内存使用过高:
    问题描述:Redis 是一个内存数据库,当数据量过大时,容易出现内存使用过高的问题。
    解决方案:
  • 使用 RDB 或 AOF 持久化机制,将部分数据保存到磁盘中,减少 Redis 使用的内存。
  • 配置 Redis 的最大内存限制,当 Redis 内存使用超过限制时,将会自动删除旧数据。
  1. 缓存雪崩:
    问题描述:当 Redis 中的缓存数据同时失效,导致大量请求直接落到后端数据库上,造成数据库压力过大,甚至崩溃的情况称为缓存雪崩。
    解决方案:
  • 使用多级缓存,如增加本地缓存、CDN 等,减少 Redis 缓存压力。
  • 设置缓存数据的过期时间随机化,防止大量缓存同时失效。
  • 增加 Redis 集群数量,将缓存数据分布在不同的节点上,减少单个节点压力。
  1. 数据库压力过大:
    问题描述:当 Redis 的请求量过大时,会造成数据库的压力过大。
    解决方案:
  • 优化 Redis 集群架构,如增加节点、调整数据分布等。
  • 优化数据库查询性能,如调整索引、优化 SQL 语句等。
  • 对数据库进行读写分离,减轻 Redis 压力。
  1. 节点故障:
    问题描述:Redis 集群中的节点发生故障,可能导致整个集群的服务中断。
    解决方案:
  • 配置主从复制,当主节点发生故障时,从节点可以顶替主节点,确保服务不受影响。
  • 定期检查节点状态,及时发现并解决故障节点。
  1. 网络故障:
    问题描述:Redis 集群内的节点之间网络连通性不佳,可能导致数据传输受到影响。
    解决方案:
  • 确保 Redis 集群内的节点之间网络连通性良好,可通过测试连接、查看网络日志等方式进行检查。
  • 部署网络监控系统,实时监控网络状态,发现并解决网络故障。
  1. 数据一致性:
    问题描述:在 Redis 集群中,可能会出现数据一致性问题,如某个节点数据与其他节点不同步。
    解决方案:
  • 确保 Redis 集群内的主从复制关系正常,定期检查同步进度。
  • 配置 Redis 集群的故障转移和自动重配置功能,确保在节点故障时,数据能够及时同步。
    以下是一个简单的 Redis 集群配置示例,展示了如何设置主从复制关系:
# 为主节点配置从节点  
redis-cli --cluster create 127.0.0.1:7000 --cluster add-node 127.0.0.1:7001 7000
# 从节点配置为主节点  
redis-cli --cluster promote 127.0.0.1:7001  

在实际应用中,需要根据具体场景和需求调整 Redis 集群的配置和策略。同时,不断学习和掌握 Redis 的新特性和技术动态,以便更好地应用于实际项目中。

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

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

相关文章

HDFS集群环境部署(超级详细!!)

一、部署Hadoop的关键点 1.上传&#xff0c;解压到/export/server,配置软链接 2.修改4个配置文件&#xff0c;workers&#xff0c;hadoop.env.sh&#xff0c;core-stie.xml&#xff0c;hdfs-site.xml 3.SCP分发到root2,root3&#xff0c;并设置环境变量 4.创建数据目录,并修改文…

diffusers-Load adapters

https://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adaptershttps://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adapters 有几种训练技术可以个性化扩散模型&#xff0c;生成特定主题的图像或某些风格的图像。每种训练方法都会产…

【论文阅读笔记】GLM-130B: AN OPEN BILINGUAL PRE-TRAINEDMODEL

Glm-130b:开放式双语预训练模型 摘要 我们介绍了GLM-130B&#xff0c;一个具有1300亿个参数的双语(英语和汉语)预训练语言模型。这是一个至少与GPT-3(达芬奇)一样好的100b规模模型的开源尝试&#xff0c;并揭示了如何成功地对这种规模的模型进行预训练。在这一过程中&#xff0…

inquirer.js——交互式命令行用户界面

一、什么是inquirer.js 1、inquirer.js是一个开源的交互式命令行用户界面&#xff08;CLI&#xff09;库&#xff0c;可以让你轻松地与用户进行交互&#xff0c;获取用户输入并做出相应的处理。它的主要功能是提供了一系列常用的命令行交互界面组件&#xff0c;例如input、con…

单目标应用:进化场优化算法(Evolutionary Field Optimization,EFO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、进化场优化算法EFO 进化场优化算法&#xff08;Evolutionary Field Optimization&#xff0c;EFO&#xff09;由Baris Baykant Alagoz等人于2022年提出&…

系统架构设计之云原生架构

云原生架构 一. 云原生技术介绍二. 传统架构模式 VS 云原生架构模式三. 云原生架构反模式四. 云原生架构设计原则 其它相关推荐&#xff1a; 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 所属专栏&#xff1a;系统…

家政APP开发服务同城预约维修接单管理系统软件小程序

家政服务小程序是一个基于移动端的家政服务平台&#xff0c;为用户提供方便快捷的家政服务。以下是小程序的主要功能&#xff1a; 1. 家政服务内容展示&#xff1a;商家可以在小程序中展示各种家政服务项目&#xff0c;如清洁、保洁、保姆、月嫂、钟点工等。用户可以浏览服务信…

Ansible中的变量及加密

目录 一、变量的设定 二、变量的使用方式 1、在playbook中直接定义变量 2、在文件中定义变量 3、设定主机变量和清单变量 4、目录设定变量 5、用命令覆盖变量 6、使用数组设定变量 7、注册变量 8、事实变量 9、魔法变量 三、JINJA2模板 四、加密控制 1、创建加…

Qt 插件开发详解

1.简介 Qt插件是一种扩展机制&#xff0c;用于将应用程序的功能模块化&#xff0c;并且可以在运行时动态加载和卸载。Qt框架为插件提供了一套标准的接口和管理机制&#xff0c;使得插件的使用和集成变得简单和灵活&#xff0c;通过插件机制&#xff0c;可以将应用程序的功能划…

Maven Repository使用

1.Maven Repository网站 https://mvnrepository.com/https://mvnrepository.com/ 2.查询需要的依赖 3.参考例子 <!-- https://mvnrepository.com/artifact/org.freeswitch.esl.client/org.freeswitch.esl.client --> <dependency> <groupId>org.freesw…

【k8s】资源管理命令-陈述式

一、资源管理介绍 1、资源管理概念 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 //kubernetes的本质就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;起始就是在kubernetes集群中运行一个个…

科技驱动教育!将名师智慧资产固定在系统中

文章目录 每日一句正能量前言未来教育教育趋势一、在线教育&#xff1a;打破时间和空间的限制二、混合式学习&#xff1a;结合线上和线下的优势三、项目式学习&#xff1a;以问题为导向&#xff0c;以项目为载体 科技驱动教育模式在线教育人工智能教育虚拟现实/增强现实教育游戏…

React事件处理

目录 前言 1. 添加事件处理函数 2. 传递参数 使用箭头函数 使用bind方法 3. 阻止默认行为和冒泡 阻止默认行为 阻止事件冒泡 4. 最佳实践 前言 React是一个流行的JavaScript库&#xff0c;用于构建用户界面。在React中&#xff0c;事件处理是非常重要的一部分&#xf…

“深入理解Nginx的负载均衡与动静分离“

目录 引言一、Nginx简介1. Nginx的基本概念2. Nginx的特点3. Nginx的安装配置 二、Nginx搭载负载均衡三、前端项目打包四、Nginx部署前后端分离项目&#xff0c;同时实现负载均衡和动静分离总结 引言 在现代互联网应用中&#xff0c;高性能和可扩展性是至关重要的。Nginx作为一…

吴恩达《机器学习》2-2->2-4:代价函数

一、代价函数的概念 代价函数是在监督学习中用于评估模型的性能和帮助选择最佳模型参数的重要工具。它表示了模型的预测输出与实际目标值之间的差距&#xff0c;即建模误差。代价函数的目标是找到使建模误差最小化的模型参数。 二、代价函数的理解 训练集数据&#xff1a;假设我…

操作系统 (1)

进程的概念 进程同步/进程互斥 进程互斥的软件实现 进程互斥的硬件实现 信号量机制 生产者消费者问题 以下wei8最终情况,不可调换位置,否则会发生死锁 预防死锁 避免死锁

警惕!当心AI诈骗!

本文参照材料有&#xff1a; 鄂尔多斯新闻公众号、澎湃新闻网、搜孤新闻、腾讯网等 AI换脸诈骗实例&#xff08;就发生在近期&#xff09; 事例一&#xff1a; 近期 “AI换脸”新型诈骗频发和你视频对话的可能不是本人&#xff01; 近日&#xff0c;东胜市民李女士遭遇了冒充…

Linux shell编程学习笔记18:while循环语句

上回我们研究和探讨了Linux shell编程中for 循环语句&#xff0c;与在C/C中一样&#xff0c;for 循环语句Linux shell编程中有很多灵活的用法。今天我们来研究和探讨while循环语句。 一、数字条件循环 我们继续以for循环语句中的例子&#xff0c;计算 从1到10与2的乘积 并输出…

浅述青犀AI算法人体攀爬行为检测的应用场景及解决方案

人体攀爬行为检测是指利用计算机视觉技术对人类攀爬物体的行为进行识别和分析。该技术主要依靠图像和视频数据进行分析&#xff0c;通过识别人类身体的各个部位&#xff0c;以及其在攀爬过程中的动作和姿态&#xff0c;实现对攀爬行为的检测和跟踪。该技术的场景应用比较广泛&a…

(2)STM32单片机上位机

使用VX小程序开发上位机&#xff0c; 样式如何创建&#xff1f; 在你所在页面 开辟空间 使用 view 在view 中 输入class 就是样式&#xff0c;在编辑样式的时候&#xff0c;如何寻找哪一块的样式 就是通过这个class寻找的 按钮使用switch