Redis集群详细介绍从0开始-包括集群的Jedis开发

news2024/11/18 3:32:43

集群

为什么需要集群-高可用性

1、生产环境的实际需求和问题

  • 容量不够,redis 如何进行扩容?
  • 并发写操作, redis 如何分摊?
  • 主从模式,薪火相传模式,主机宕机,会导致ip 地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息

2、传统解决方案-代理主机来解决

在这里插入图片描述

解读上图

  1. 客户端请求先到代理服务器
  2. 由代理服务器进行请求转发到对应的业务处理服务器
  3. 客户端请求先到代理服务器
  4. 由代理服务器进行请求转发到对应的业务处理服务器

3、redis3.0 提供解决方案-无中心化集群配置

在这里插入图片描述

解读上图

  1. 各个Redis 服务仍然采用主从结构
  2. 各个Redis 服务是连通的, 任何一台服务器, 都可以作为请求入口
  3. 各个Redis 服务器因为是连通的, 可以进行请求转发
  4. 这种方式, 就无中心化集群配置, 可以看到,只需要6 台服务器即可搞定
  5. 无中心化集群配置, 还会根据key 值, 计算slot , 把数据分散到不同的主机, 从而缓解单个主机的存取压力.[后面会演示和再说明]
  6. Redis 推荐使用无中心化集群配置
  7. 在实际生成环境各个Redis 服务器, 应当部署到不同的机器(防止机器宕机, 主从复制失效)
  8. 后面演示时, 为了方便, 是在一台机器(如果启6 个虚拟Linux, 电脑撑不住),请注意一下.

集群介绍

1、Redis 集群实现了对Redis 的水平扩容,即启动N 个redis 节点,将整个数据库分布存储在这N 个节点中,每个节点存储总数据的1/N。

2、Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求

Redis 集群搭建

需求说明/图解

在这里插入图片描述

搭建步骤演示

将rdb、aof 文件都删除掉

在这里插入图片描述

redis cluster 配置修改

cluster-enabled yes 打开集群模式

cluster-config-file nodes-6379.conf 设定节点配置文件名

cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换

删除不必要的内容

vi /hspredis/redis6379.conf , 删除不必要的内容, 增加cluster 配置, 文件最后内容,如图

在这里插入图片描述

注意这里打马赛克的是你自己设置的文件目录 注意前面的 include不要改变 是后面的 可以借助pwd看当前所在的绝对路径前提是在redis.conf位置

在这里插入图片描述
在这里插入图片描述

使用查找替换修改另外5 个文件

  • 替换指令:%s/6379/6380
  • vi redis6380.conf

在这里插入图片描述

  • 其它几个文件以此操作即可, 操作的时候,一定要小心, 最后建议再检查一下

启动6 个Redis 服务

在这里插入图片描述

在这里插入图片描述

将六个节点合成一个集群

在这里插入图片描述

将六个节点合成一个集群的指令:

redis-cli --cluster create --cluster-replicas 1 192.168.198.130:6379
192.168.198.130:6380 192.168.198.130:6381 192.168.198.130:6389
192.168.198.130:6390 192.168.198.130:6391

注意事项和细节

  1. 组合之前,请确保所有redis 实例启动后,nodes-xxxx.conf 文件都生成正常
  2. 此处不要用127.0.0.1, 请用真实IP 地址, 在真实生产环境, IP 都是独立的.
  3. replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组
  4. 搭建集群如果没有成功, 把sentinel 进程kill 掉, 再试一下
  5. 分析主从对应关系

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

集群方式登录

指令: redis-cli -c -p 6379

指令: cluster nodes 命令查看集群信息, 主从的对应关系, 主要看标注的颜色
在这里插入图片描述

注意事项和细节

1、一个集群至少要有三个主节点

2、选项–cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

3、分配原则:尽量保证主服务器和从服务器各自运行在不同的IP 地址(机器), 防止机器故障导致主从机制失效, 高可用性得不到保障

Redis 集群使用

什么是slots

  1. Redis 集群启动后, 你会看到如下提示

在这里插入图片描述
在这里插入图片描述

  1. 一个Redis 集群包含16384 个插槽(hash slot),编号从0-16383, Reids 中的每个键都属于这16384 个插槽的其中一个
  2. 集群使用公式CRC16(key) % 16384 来计算键key 属于哪个槽, 其中CRC16(key) 语句用于计算键key 的CRC16 校验和

在这里插入图片描述

  1. 集群中的每个节点负责处理一部分插槽。举个例子, 如果一个集群可以有主节点, 其中:

-节点A 负责处理0 号至5460 号插槽。

-节点B 负责处理5461 号至10922 号插槽。

-节点C 负责处理10923 号至16383 号插槽

在集群中录入值

  1. 在redis 每次录入、查询键值,redis 都会计算出该key 应该送往的插槽,如果不是该客户端对应服务器的插槽,redis 会告知应前往的redis 实例地址和端口。

  2. redis-cli 客户端提供了–c 参数实现自动重定向。

  3. 如redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向
    在这里插入图片描述

  4. 不在一个slot 下的键值,是不能使用mget,mset 等多键操作
    在这里插入图片描述

  5. 可以通过{}来定义组的概念,从而使key 中{}内相同内容的键值对放到一个slot 中去

在这里插入图片描述

查询集群中的值

  1. 指令: CLUSTER KEYSLOT 返回key 对应的slot 值
  2. 指令: CLUSTER COUNTKEYSINSLOT 返回slot 有多少个key
  3. 指令: CLUSTER GETKEYSINSLOT 返回count 个slot 槽中的键

在这里插入图片描述

Redis 集群故障恢复

如果主节点下线, 从节点会自动升为主节点(注意15 秒超时, 再观察比较准确)

在这里插入图片描述

在这里插入图片描述

主节点恢复后,主节点回来变成从机
在这里插入图片描述

在这里插入图片描述

如果所有某一段插槽的主从节点都宕掉,Redis 服务是否还能继续, 要根据不同的配置而言

  1. 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么,整个集群都挂掉
  2. 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no , 那么, 只是该插槽数据不能使用,也无法存储
  3. redis.conf 中的参数cluster-require-full-coverage

在这里插入图片描述

集群的Jedis 开发

1、即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。

2、无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据

实验

将Redis 相关的端口都打开, 否则会报错

在这里插入图片描述

在这里插入图片描述

创建edisCluster

src\main\java\com\jedis\JedisCluster_.java


/**
 * 操作Redis集群
 */
public class JedisCluster_ {
    public static void main(String[] args) {

        /**
         * 解读
         * 1. 这里的set可以加入多个入口
         * 2. 因为我们没有做日志配置,输出时,有些提示,但是不影响使用
         * 3. 如果我们使用的是集群,需要把相关的端口都打开,否则会报错
         *
         * 4. JedisCluster的构造器有多个,也可以直接传入HostAndPort 代码如下
         * public JedisCluster(HostAndPort node) {
         *         this(Collections.singleton(node));
         *     }
         *
         */
        Set<HostAndPort> set = new HashSet<HostAndPort>();
        set.add(new HostAndPort("192.168.198.135",6379));

        JedisCluster jedisCluster = new JedisCluster(set);
        jedisCluster.set("address","bj~北京");
        String address = jedisCluster.get("address");
        System.out.println("address-->" + address);
        jedisCluster.close();

    }
}

完成测试

在这里插入图片描述

Redis 集群的优缺点

优点

1、实现扩容

2、分摊压力

3、无中心配置相对简单

缺点

1、多键操作是不被支持的

2、多键的Redis 事务是不被支持的。lua 脚本不被支持

3、由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而其它方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大

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

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

相关文章

linuxOPS系统服务_linux文件权限管理

什么是权限 **权限&#xff1a;**在计算机系统中&#xff0c;权限是指某个计算机用户具有使用软件资源的权利。 权限的目的 文件权限的设置目的&#xff1a;是想让某个用户有权利操作文件 权限的分类 普通权限rwx 用户正常情况去操作文件所具有的权限 高级权限st 用户对某…

FPGA基础知识-任务和函数

目录 学习目标 学习内容 1.任务和函数的区别 2.任务 3.函数 学习时间 学习总结 学习目标&#xff1a; 1.理解任务和函数之间的区别。 2.理解定义任务所需的条件&#xff0c;学会任务的声明和调用。 3.理解定义函数所需的条件&#xff0e;学会函数的声明和调用。 学习…

JavaScript之ES6高级语法(四)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 ES6高级语法(四&#xff09; 前言一、深浅拷贝1.1、浅拷贝1.2、深拷贝1.2.1、递归实现深拷贝1.2.2、js库lodash里面cloneDee…

你们软件测试面试最难的一道题是什么?

在测试面试时&#xff0c;面试官往往会出一个简单的场景让大家进行测试点设计来考察大家的测试设计能力&#xff0c;题目看似简单实则蕴藏杀机&#xff0c;测试人员需要根据自己的工作年限做出不同的回答方可过关。 如果你工作1-2年&#xff0c;那么你只需要回答功能方面的测试…

源来Intel——开放原子全球峰会

文章目录 Intel的开源之路AI领域边缘人工智能在中国的发展趋势边缘人工智能领域的挑战生态系统解决方案英特尔针对边缘人工智能的产品总结 英特尔基础软件赋能中国生态Intel : 软件优先 推动中国市场中国Linux操作系统生态Intel全力投入中国开源社区开发国产Linux厂商&#xff…

I2C中的时钟同步与仲裁

时钟同步和仲裁 在单主设备中&#xff0c;不需要时钟同步和仲裁。而在多设备时&#xff0c;多个主设备可以同时在空闲的总线上开始发送数据&#xff0c;这时就需要仲裁决定哪一个来控制总线并完成它的数据传输&#xff0c;有时候也需要时钟同步来协同设备间的工作。而这正是通过…

Android音视频开发实战02-Jni

一 JNI 1.1 什么是JNI JNI是Java Native Interface的缩写&#xff0c;是Java提供的一种机制&#xff0c;用于在Java代码中调用本地&#xff08;C/C&#xff09;代码。它允许Java代码与本地代码进行交互&#xff0c;通过JNI&#xff0c;Java应用程序可以调用一些原生库或者操作…

Maven编译常见问题收集

1、父pom里面有引入lombok依赖&#xff0c;为什么子pom有用到lombok&#xff0c;依然识别不到呢 这是因为父pom引入依赖的时候&#xff0c;把 <dependency></dependency>依赖标签&#xff0c;最外层包 在了<dependencyManagement></dependencyManagemen…

Python学了基本语法 下一步该干什么 ?

刚入门Python,学习了基本语法后&#xff0c;你可以开始编写简单的程序了。接下来&#xff0c;你可以学习Python的标准库和第三方库&#xff0c;掌握更多的编程技巧和知识&#xff0c;提高自己的编程能力。同时&#xff0c;也可以通过实践项目来巩固所学知识&#xff0c;提高自己…

web3描述以太坊与区块链之间的操作关系

好通过前面两篇文章 Web3.0概念 web3带大家简单建立区块链概念 大家开始明白 web3.0是基于区块链为基础开发的 我们讲区块链多次提到以太坊 EVM 那这个东西到底是什么呢&#xff1f; 就现在的情况来讲 从零到一去搭建一个区块链环境 那可太难了 所以 以太坊一开始 确实是做一…

关于GPT-3和GPT-4,你需要知道都在这里

友情提示 提示&#xff1a;本文约3500个文字&#xff0c;字数较长&#xff0c;可直接点击序号进入相关目录阅读字数 文章目录 友情提示前言一、什么是 GPT-3、GPT-4 和 ChatGPT&#xff1f;二、对未来的担忧三、什么时候可以用GPT4&#xff1f;四、GPT-4用在什么地方五、GPT-4能…

json_decode返回NULL

json_decode返回NULL 最近在调用某公司的API时&#xff0c;将对方返回的数据&#xff0c;使用PHP的json_decode函数解析&#xff0c;但是返回NULL,最终排查为对方传送来的json格式有误 打印$_REQUEST&#xff0c;数据结构大致如下&#xff1a; 1 2 3 4 5 6 7 8 9 10 array (…

Android 面试延伸技术点有哪些,你能答上几个?

1、如何进行单元测试&#xff0c;如何保证 App 稳定 &#xff1f; 参考回答&#xff1a; 要测试 Android 应用程序&#xff0c;通常会创建以下类型自动单元测试 本地测试&#xff1a;只在本地机器 JVM 上运行&#xff0c;以最小化执行时间&#xff0c;这种单元测试不依赖于 An…

JavaScript之ES6高级语法(三)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 ES6高级语法(三&#xff09; 前言一、原型对象1.1、constructor 属性1.2、对象原型 二、原型继承三、原型链 前言 今天学习的…

【C++】红黑树的概念与模拟实现

红黑树的概念与模拟实现 红黑树的概念红黑树的性质红黑树节点的定义红黑树的迭代器红黑树的插入红黑树和AVL树的比较红黑树的模拟实现 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。…

计算机组成原理(0)概述

前言 没有想好到底是要怎么学习&#xff0c;看哪个视频课&#xff0c;看到1.2 计算机的基本组成1.2-a1_哔哩哔哩_bilibili 是15年录的视频读PPT课本不一样就更不想看了&#xff0c;但是CSAPP难度大&#xff08;主要是广度&#xff0c;所以可能不很适用于考试或计组的学习&…

java代码审计和安全漏洞修复

java代码审计和安全漏洞修复 本文目录 java代码审计和安全漏洞修复开源&#xff1a;奇安信代码卫士官网使用gitee服务使用 非开源&#xff1a;思客云找八哥错误类型以及修改方法1.硬编码2. 路径操作3. 路径操作 - Zip文件条目覆盖4. SQL注入5. SQL注入 - Hibernate6. XML外部实…

视频与图片检索中的多模态语义匹配模型 ——原理、启示、应用与展望

前言 三多前笔者在《万字长文漫谈视频理解》[1]一文中&#xff0c;曾经将自己对视频理解的认识进行过简单总结&#xff0c;幸而获得了朋友们的认可&#xff0c;能让读者认可是笔者最为骄傲的成就。现在看来文中观点有不少纰漏狭隘之处&#xff0c;特别是近年来多模态模型的流行…

6.5this关键字

1. 关键字&#xff1a;this 1.1 this 是什么&#xff1f; 首先。this在Java中是一个关键字&#xff0c;this 指代的是本类的引用对象 1.2 什么时候使用 this 1.2.1 实例方法或构造器中使用当前对象的成员 1、在实例方法或构造器中&#xff0c;我们在使用get和set方法中使用…

行为型设计模式06-迭代器模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 迭代器模式 1、迭代器模式介绍 迭代器模式是一种行为型设计模式&#xff0c;它提供了一种方法来访问聚…