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

news2024/11/24 9:47:49

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

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.coloradmin.cn/o/1164727.html

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

相关文章

Java网站如何集成支付宝当面付,企业个人都能使用的支付(比较简单)

创建应用 这个得先去登录 - 支付宝创建应用 相关配置设置 maven配置 <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.38.10.ALL</version></dependency> 支付服务代码 …

Linux:Docker-yum安装(2)

yum在线安装 我这里使用的是centos7默认仓库 如果没有了&#xff0c;可以去下面这个链接下载回来 KALItarro/default-yum: centos7-默认yum仓库 (github.com)https://github.com/KALItarro/default-yum wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.…

【Git企业开发】第三节.Git的合并冲突

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Git企业级开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff0…

海外问卷调查现在还可以做吗?

可以做&#xff0c;海外问卷调查是一个稳定长期的互联网创业项目。 大家好&#xff0c;我是橙河&#xff0c;这篇文章讲一讲海外问卷调查现在还可以做吗&#xff1f; 海外问卷调查&#xff0c;简单来说&#xff0c;就是外国的商业公司对外发放的付费调查问卷&#xff0c;按照…

1,2,3,4,5 专家正上路

早在20世纪70年代&#xff0c;德雷福斯兄弟(Hubert Dreyfus和Stuart Dreyfus)就开始研究人类如何获取和掌握技能&#xff0c;他们考察了日常生活中常见的各项技能活动&#xff0c;如开车、下棋、体育运动等&#xff0c;提出了德雷福斯模型。它是种构建理论&#xff0c;概括了从…

第十六章 隐马尔科夫模型

文章目录 简介概念随机变量与随机过程马尔可夫链隐含马尔可夫模型两个基本假设三个基本问题 算法观测序列生成算法概率计算算法前向概率与后向概率前向算法后向算法小结 概率与期望 学习问题监督学习方法Baum-Welch算法 预测算法近似算法(MAP)维特比算法(Viterbi) 简介 动态贝叶…

java--this关键字

1.this是什么 this就是一个变量&#xff0c;可以用在方法中&#xff0c;来拿到当前对象(这个this就相当于你的车钥匙&#xff0c;当你在把车停到了车库&#xff0c;然后你发现找不到你的车的时候&#xff0c;就会按一下车钥匙&#xff0c;让你的车叫一下&#xff0c;你就会晓得…

《现代C++语言核心特性解析》笔记(一)

一、新基础类型&#xff08;C11&#xff5e;C20&#xff09; C基础类型回顾一览表 1. 整数类型 long long 我们知道long通常表示一个32位整型&#xff0c;而long long则是用来表示一个64位的整型。不得不说&#xff0c;这种命名方式简单粗暴。不仅写法冗余&#xff0c;而且表…

若依笔记(四):代码生成器

已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码&#xff0c;前提是数据库中有数据表&#xff0c;生成pojo类以及对于该数据表的增删改查命令的代码&#xff0c;若依更进一步能选择表后生成代码、预览、下载&#xff0c;同时可以生产前端代…

构建强大的Web应用之Django详解

引言&#xff1a; Django是一个功能强大且灵活的Python Web框架&#xff0c;它提供了一套完整的工具和功能&#xff0c;帮助开发者快速构建高效的Web应用。本篇文章将带您逐步了解Django的基本概念和使用方法&#xff0c;并通过实际的代码案例&#xff0c;帮助您从零开始构建自…

【docker】安装xxl-job-admin调配中心

1.安装数据库&#xff08;注意版本号&#xff0c;这里选择版本2.3.1&#xff09; 1.1下载代码&#xff0c;并切换到2.3.1分支 1.2 打开并运行xxl-job/doc/db/tables_xxl_job.sql 2.编写docker-compose.yaml&#xff0c;并运行 1. docker-compose.yaml 2.将yaml放入Linux系…

滑模控制问题总结

设计切换函数/滑模面S&#xff08;x&#xff09; 线性&#xff1a; 滑模面参数确定方法&#xff1a;Hurwitz 保证多项式为Hurwitz&#xff0c;即特征值在左半平面。 主要适用于速度和精度要求都不高的非线性系统 非线性 《滑模变结构控制理论研究综述》 终端滑模控制&#xff1…

Redis事务管道

文章目录 Redis事务1.简介&#xff08;1&#xff09;什么是事务&#xff08;2&#xff09;Redis事务的特点 2.实操案例&#xff08;0&#xff09;事务命令&#xff08;1&#xff09;正常执行&#xff08;2&#xff09;放弃事务&#xff08;3&#xff09;全体连坐&#xff08;4&…

tiki靶机攻略

tiki靶机攻略 扫描 渗透 访问robots.txt 发现目录&#xff0c;访问一下 再次扫描/tiki/目录&#xff0c;然后发现changelog下又tiki的版本信息 kali漏洞搜索&#xff0c;找到一个符合版本的 python3 48927.py 10.4.7.159执行过后&#xff0c;显示不需要密码即可登录 随后bp登…

gd32f470zgt6最小系统 上哪找到

gd32f470zgt6最小系统 上哪找到

Docker 学习路线 2:底层技术

了解驱动Docker的核心技术将让您更深入地了解Docker的工作原理&#xff0c;并有助于您更有效地使用该平台。 Linux容器&#xff08;LXC&#xff09; Linux容器&#xff08;LXC&#xff09;是Docker的基础。 LXC是一种轻量级的虚拟化解决方案&#xff0c;允许多个隔离的Linux系…

VS Code 开发Java之代码导航和代码编辑

快速导航 VS Code提供了一些功能可以在Java开发时快速导航。 代码导航 大纲视图&#xff08;Outline view&#xff09;&#xff1a; 方便地导航当前文件中的成员项目视图&#xff08;Projects view&#xff09;&#xff1a; 项目的详细概述Java编辑器&#xff1a; 支持调用层…

模电学习路径

交流通路实质 列出电路方程1&#xff0c;方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分&#xff1a;两个不同时刻的方程1相减&#xff0c;并 令两时刻差为 无穷小 微分 改成 差 模电学习路径&#xff1a; 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?

3D CAD数据在制造、工程和设计等各个领域都扮演着重要的角色。为了促进不同软件应用程序之间的协作和互操作性&#xff0c;它通常以不同的格式进行交换。 HOOPS Exchange是一个强大的软件开发工具包&#xff0c;提供了处理和将3D CAD数据从一种格式转换为另一种格式的解决方案…

WoShop跨境电商源码:告别繁琐,一键实现批量发货

随着全球电子商务的飞速发展&#xff0c;越来越多的商家开始进军跨境电商领域。然而&#xff0c;搭建一个成功的跨境电商平台需要考虑众多因素&#xff0c;如订单处理、物流配送、支付结算等。在这个过程中&#xff0c;WoShop跨境电商源码因其强大的功能和简易的操作&#xff0…