11. Redis集群(cluster)

news2024/11/25 9:21:44

11. Redis集群cluster

  • 是什么?
  • 能干嘛?
  • 集群算法-分片-槽位slot
    • 官网出处
    • redis集群的槽位slot
    • redis集群的分片
    • 他两的优势
    • slot槽位映射,一般业界有3种解决方案
      • 哈希取余分区
      • —致性哈希算法分区
      • 3大步骤
        • 算法构建一致性哈希环
        • redis服务器IP节点映射
        • key落到服务器的落键规则
      • 优点
        • 容错性
        • 扩展性
      • 缺点
      • 小总结
  • 集群环境案例步骤
    • 1.3主3从redis集群配置
      • 通过redis-cli命令为6台机器构建集群关系
        • 构建主从关系命令
        • —切OK的话,3主3从搞定
      • 链接进入6381作为切入点,查看并检验集群状态
        • 链接进入6381作为切入点,查看节点状态
    • 2.3主3从redis集群读写
      • 对6381新增两个key,看看效果如何
      • 为什么报错
      • 如何解决
      • 查看某个key该属于对应的槽位值CLUSTER KEYSLOT 键名称
    • 3.主从容错切换迁移案例
        • 随后,6381原来的主机回来了,是否会上位?
        • 手动故障转移or节点从属调整该如何处理
    • 4.主从扩容案例
      • 将新增的6387节点(空槽号)作为master节点加入原集群
      • 检查集群情况第1次
      • 重新分派槽号(reshard
      • 检查集群情况第2次
      • 槽号分派说明
      • 为主节点6387分配从节点6388
      • 检查集群情况第3次
    • 5.主从缩容案例
  • 集群常用操作命令和CRC16算法分析
    • 不在同一个slot槽位下的多键操作支持不好,通识占位符登场
    • CRC16源码浅谈
    • 集群是否完整才能对外提供服务

是什么?

在这里插入图片描述

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

能干嘛?

在这里插入图片描述

集群算法-分片-槽位slot

官网出处

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

redis集群的槽位slot

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

redis集群的分片

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

他两的优势

最大优势,方便扩缩容和数据分派查找
在这里插入图片描述

slot槽位映射,一般业界有3种解决方案

在这里插入图片描述

哈希取余分区

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

—致性哈希算法分区

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

3大步骤

算法构建一致性哈希环

一致性哈希环

  • 一致性哈希算法必然有个hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间[0,2^32-1],这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 = 2^32),这样让它逻辑上形成了一个环形空间。
  • 它也是按照使用取模的方法,前面笔记介绍的节点取模法是对节点(服务器)的数量进行取模。而一致性Hash算法是对232取模,简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-232-1(即哈希值是一个32位无符号整形),整个哈希环如下图:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、……直到232-1,也就是说0点左侧的第一个点代表232-1, 0和232-1在零点中方向重合,我们把这个由232个点组成的圆环称为Hash环。
  • 在这里插入图片描述

redis服务器IP节点映射

在这里插入图片描述

在这里插入图片描述

key落到服务器的落键规则

在这里插入图片描述

在这里插入图片描述

优点

在这里插入图片描述

容错性

在这里插入图片描述

扩展性

数据量增加了,需要增加一台节点NodeX,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,

不会导致hash取余全部数据重新洗牌。
在这里插入图片描述

缺点

Hash环的数据倾斜问题

在这里插入图片描述

小总结

在这里插入图片描述

集群环境案例步骤

1.3主3从redis集群配置

在这里插入图片描述

以: vim /myredis/cluster/redisCluster6381.conf为例

bind 0.0.0.0
daemonize yes
protected-mode no
port 6381
logfile "/myredis/cluster/cluster6381.log"
pidfile /myredis/cluster6381.pid
dir /myredis/cluster
dbfilename dump6381.rdb
appendonly yes
appendfilename "appendonly6381.aof"
requirepass 111111
masterauth 111111
 
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000

通过redis-cli命令为6台机器构建集群关系

构建主从关系命令

//注意,注意,注意自己的真实IP地址 //注意,注意,注意自己的真实IP地址
在这里插入图片描述

–cluster-replicas 1 表示为每个master创建一个slave节点
在这里插入图片描述
在这里插入图片描述

—切OK的话,3主3从搞定

在这里插入图片描述

链接进入6381作为切入点,查看并检验集群状态

链接进入6381作为切入点,查看节点状态

info replication   #当前结点信息

在这里插入图片描述

cluster nodes    #集群节点信息

在这里插入图片描述

cluster info		#集群信息

在这里插入图片描述

2.3主3从redis集群读写

在这里插入图片描述

对6381新增两个key,看看效果如何

在这里插入图片描述

为什么报错

在这里插入图片描述

在Redis中,"路由到位"(routing to master)是指客户端与Redis主节点之间的连接被正确地建立和维护的概念。
Redis是一个分布式数据库系统,其中包含一个主节点和零个或多个从节点。
主节点负责接收写操作并将数据复制到从节点,而从节点负责接收读操作并复制主节点的数据。



当客户端发送命令到Redis时,需要将命令路由到正确的主节点上。
这是由Redis客户端库或代理完成的。
客户端库或代理通常维护一个与主节点的连接池,并根据某种策略将命令发送到适当的主节点。



一种常见的策略是通过在客户端与Redis主节点之间的连接建立时进行散列(hash)操作,将命令路由到适当的主节点。
通常,这个散列操作使用命令中的关键信息(例如键名)来计算一个哈希值,并根据哈希值选择目标主节点。
这样可以确保同一键的所有操作都被路由到同一个主节点上,从而保持数据的一致性。



当路由到位时,客户端可以与正确的主节点进行通信,发送读写操作并接收相应的响应。
这确保了在Redis集群中的数据访问和操作的正确性和一致性。



需要注意的是,当Redis主节点发生故障或进行故障切换时,路由到位的概念也会涉及到自动发现和重新路由的过程,以确保客户端可以与新的主节点建立连接并进行操作。
这通常由客户端库或代理来处理,以实现高可用性和容错性。

如何解决

防止路由失效加参数-c并新增两个key
在这里插入图片描述

查看某个key该属于对应的槽位值CLUSTER KEYSLOT 键名称

在这里插入图片描述

3.主从容错切换迁移案例

在这里插入图片描述

在这里插入图片描述

随后,6381原来的主机回来了,是否会上位?

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

Redis集群不保证强─致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令。
在这里插入图片描述

在这里插入图片描述

手动故障转移or节点从属调整该如何处理

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

4.主从扩容案例

在这里插入图片描述

以,,vim /myredis/cluster/redisCluster6387.conf为例:

bind 0.0.0.0
daemonize yes
protected-mode no
port 6387
logfile "/myredis/cluster/cluster6387.log"
pidfile /myredis/cluster6387.pid
dir /myredis/cluster
dbfilename dump6387.rdb
appendonly yes
appendfilename "appendonly6387.aof"
requirepass 111111
masterauth 111111

cluster-enabled yes
cluster-config-file nodes-6387.conf
cluster-node-timeout 5000

将新增的6387节点(空槽号)作为master节点加入原集群

将新增的6387作为master节点加入原有集群
redis-cli -a 密码 --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
redis-cli -a 111111  --cluster add-node 192.168.111.174:6387 192.168.111.175:6381

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

检查集群情况第1次

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

重新分派槽号(reshard

重新分派槽号
命令:redis-cli -a 密码 --cluster reshard IP地址:端口号
redis-cli -a 密码 --cluster reshard 192.168.111.175:6381

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

检查集群情况第2次

在这里插入图片描述

槽号分派说明

在这里插入图片描述

为主节点6387分配从节点6388

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

检查集群情况第3次

在这里插入图片描述

5.主从缩容案例

在这里插入图片描述

集群常用操作命令和CRC16算法分析

在这里插入图片描述

不在同一个slot槽位下的多键操作支持不好,通识占位符登场

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

CRC16源码浅谈

在这里插入图片描述

集群是否完整才能对外提供服务

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

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

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

相关文章

【Python sqlite3】零基础也能轻松掌握的学习路线与参考资料

Python sqlite3是Python语言自带的轻量级关系数据库管理系统,它可以让我们在不需要额外的安装和配置下,使用SQLite数据库进行操作和管理。SQLite是一个功能强大的嵌入式数据库,它非常适合在轻量级应用程序中使用,如桌面应用程序、…

ROS学习(4)——launch文件的编写

对于一个复杂的系统,会有十几个、几十个甚至是上百个节点在运行,如果我们每次都是采取“打 开终端、运行 rosrun 指令”来启动应用程序,显得效率非常低。我们需要一个更方便的方式来启动系统。ROS 中提供了“使用 launch 文件 roslaunch”命令来完成系统的启动。具体的实现方法…

Java·Lambda

文章目录 ⚽️1 背景⚽️🍏1.1 Lambda表达式的语法🍏🍎1.2 函数式接口🍎 🏀2 Lambda表达式的基本使用🏀🍈2.1 语法精简🍈 🏈3 变量捕获🏈🏆3.1 匿…

Linux Audio (7) DAPM-4 Path/Route添加过程

DAPM-4 Path/Route添加过程 route分类:route转化为Pathcodec驱动add widgetMechine驱动add kcontrol route分类: 常规route {“sink”, NULL, “source”},其path->connect1 sink widget是Mixer {“Mixer”, name1, “source1”} {“Mixe…

chatgpt赋能Python-python88

Python88 简介 Python88 是一个优秀的 Python 开源库,它提供了许多有用的函数和工具,可用于创建高效的 Web 应用程序,简化数据分析、数据可视化以及机器学习和人工智能任务等。 Python88 帮助开发人员以更简单、更快捷的方式编写代码&#…

VS Code Remote Development

1、Ubuntu 上启用 SSH (1)打开终端,并且安装openssh-server软件包: sudo apt update sudo apt install openssh-server 当被提示时,输入你的密码并且按 Enter,继续安装。 (2)安…

RocketMQ消息发送

消息发送示例代码: public static void main(String[] args) throws MQClientException, InterruptedException {DefaultMQProducer producer new DefaultMQProducer("please_rename_unique_group_name");producer.setNamesrvAddr("127.0.0.1:9876…

leetcode-743. 网络延迟时间

1.思路分析: 一道Dijkstra模板题 推荐Dijkstra算法讲解教程 Dijkstra(有向图某点到其他所有点的最短路径问题) Dijkstra算法的基本思想是贪心策略,每次从未确定最短路径的顶点中选择距离源点最近的一个,然后以该顶点…

Python使用正则表达式

正则表达式(Regular Expression),又称规则表达式,是一个计算机科学的概念,通常被用来检索和替换符合某些规则的文本。 1. 正则表达式语法 正则表达式就是记录文本规则的代码。 1. 行定位符 行定位符就是用来描述字…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十二届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置,直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

MySQL高级(InnoDB引擎)

(一)逻辑存储结构 表空间(ibd文件),会生成ibd文件,一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 段,分为数据段(Leaf node segment)、索引段…

学弟研一,有几篇SCI论文,做过前端,读博 or 走开发进国企?

同学你好,在正面先抛开选择就业的方面的问题,其实我觉得生活种的很多选择,都可以从以下的几点进行斟酌与考虑: (1)你最擅长的是哪个方面?(2)你的兴趣爱好是在哪个方面&am…

从0开始搭建完整UVM工程(可直接用于实际的工程中)、含源码(包括makefile文件)、可直接运行,及详细注释

一、说明 网上的实现uvm工程代码都是抄自张强所著的《UVM实战》,都是讲所有文件放到一个文件夹,且不涉及到实际工程中的uvm结构,以及多文件层级结构,让人理解起来较为困难,本文则将会从0开始教大家如何搭建一个具有实际工程效果的UVM框架: 其对应的书中的框架图如下所示:…

chatgpt赋能Python-pythoncontinue

简介 Python是一种高级编程语言,受到越来越多的人们的欢迎。其中,continue是Python语言中的一个很重要的关键字,它的出现可以很好地帮助程序员们实现自己的编程目标。在本文中,我们将介绍continue关键字,并解释它在Py…

Fourier分析入门——第5章——连续函数

目录 第 5 章 连续函数 5.1 引言 5.2 内积和正交性(Inner products and orthogonality) 5.3 对称性(Symmetry) 5.4 复数值函数 第 5 章 连续函数 5.1 引言 在前面的章节中,我们只考虑了在有限区间 L 上定义的离散函数的Fourier级数模型。此类函数在实验科学…

spring 源码

bean的创建 获取类class 推断构造方法 Autoware 创建一个普通对象 依赖注入 populateBean 把一些属性注入 初始化之前 PostConstruct 注解 初始注入 实际可以用构造方法啊 初始化 initializationBean 1.判断是否有aware接口 invokeAwareMethods 2.执行 applyBeanP…

enq: TM - contention等待事件引起的数据库卡顿分析

用户的数据库系统在2022年5月31日下午17:25至17:45出现严重的锁等待,导致对应的应用程序出现卡顿等情况,业务系统的正常使用受到影响,无法正常办理业务;在此情况下需要排查出锁问题的深层原因,从而从根本上解决问题。 …

【Python psycopg2】零基础也能轻松掌握的学习路线与参考资料

Python psycopg2是一个Python库,在Python中提供了一个连接PostgreSQL数据库的接口。它可以让Python应用程序和PostgreSQL数据库之间进行通信和数据传输。学习Python psycopg2的路线和教程可以在查阅资料和实践中快速入门。 一、学习前置知识 学习Python psycopg2需…

23 memset 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 内存数据的设置 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 memcpy,…

去面试测试开发工程师要做哪些准备?大厂真实面试题汇总

目录 1.黑盒测试和白盒测试的区别特点和方法。 2.单元测试、集成测试、系统测试、验收测试、回归测试 3.集成测试和系统测试的区别和应用场景 4.α测试、β测试,以及它们的区别 5.给你一个字符串,你怎么判断是不是ip地址?手写这段代码&…