【Redis】集群

文章目录

  • 一、集群是什么?
  • 二、 Redis集群分布式存储
    • 为什么redis集群的最大槽数是16384(不太懂)
    • redis的集群主节点数量基本不可能超过1000个
  • 三、 配置集群(三主三从)
    • 3.1 配置config文件
    • 3.2 启动六台redis
    • 3.2 通过redis-cli命令为6台机器构建集群关系
    • 3.3 任意连接一个作为切入点(集群只需要连一个),并检验集群状态
  • 四、 扩展


以下是本篇文章正文内容

一、集群是什么?

  • 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。

Redis集群是一个提供在多个Redis节点间共享数据的程序集

  • Redis集群可以支持多个Master

在这里插入图片描述

  • Redis集群支持多个Master,每个Master又可以挂载多个Slave
  • 读写分离
  • 支持海量数据的高可用
  • 支持海量数据的读写存储操作
  • 由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
  • 客户端和Redis的节点连接,不再需要连接集群中所有节点,只需连接集群中的任意一个可用节点即可
  • 槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系
  • redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令

二、 Redis集群分布式存储

槽位
集群的密钥空间被分成16384个槽,有效地设置了16384个主节点的集群大小上限(但是,建议的最大节点大小约为1000个节点)。
Redis集群投有使用一致性hash,而是引入了哈希槽的概念.
Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。
集群的每个节点(master)负责一部分hash槽。

比如,有一个集群有三个节点:
在这里插入图片描述

分片
使用Redis集群时我们会将存储的数据分散到多台redis机器上,这称为分片。简言之,集群中的每个Redis实例都被认为是整个数据的一个分片。

如何找到给定key的分片:为了找到给定key的分片,我们对key进行CRC16(key)算法处理并通过对总分片数量取模。然后,使用确定性哈希函数,这意味着给定的key将多次始终映射到同一个分片,我们可以推断将来读取特定key的位置。

Redis集群分布式存储有大概有3种解决方法

哈希取余分区
在这里插入图片描述
hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点:

  • 简单粗暴,直接有效,只需要预估好数据规划节点例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用

缺点:

  • 直接规划好节点,进行扩容或者缩容会很麻烦,不管扩还是缩,每次数据变动会导致节点有变动,映射关系都要重新计算,在服务器个数固定不变时没有问题。
  • 如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化,Hash(key)/3会变成Hash(key) /?
  • 此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。

一致性哈希算法分区

为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不行了。
目的是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系

算法步骤:

哈希槽分区

  • 哈希槽实质就是一个数组,数组[0,2^14 -1]形成hash slot空间。

解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系(即解决映射问题),现在就相当于节点上放的是槽,槽里放的是数据。
在这里插入图片描述
一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。

接下来就需要对key求哈希值,然后对16384取模,余数是几key就落入对应的槽里。集群会记录节点和槽的对应关系。
HASH_SLOT = CRC16(key) mod 16384
以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

写入的总体流程:当需要在 Redis 集群中放置一个 key-value时,redis先对key使用crc16算法算出一个结果然后用结果对16384求余数[ CRC16(key) % 16384],这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。

为什么redis集群的最大槽数是16384(不太懂)

Redis集群并没有使用一致性hash而是引入了哈希槽的概念。Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

正常的心跳数据包带有节点的完整配置,可以用幂等方式用旧的节点替换旧节点,以便更新旧的配置。这意味着它们包含原始节点的插槽配置,该节点使用2k的空间和16k的插槽,但是会使用8k的空间(使用65k的插槽)。同时,由于其他设计折衷,Redis集群不太可能扩展到1000个以上的主节点。因此16k处于正确的范围内,以确保每个主机具有足够的插槽,最多可容纳1000个矩阵,但数量足够少,可以轻松地将插槽配置作为原始位图传播。请注意,在小型群集中,位图将难以压缩,因为当N较小时,位图将设置的slot / N位占设置位的很大百分比。

redis的集群主节点数量基本不可能超过1000个

集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者不建议redis cluster节点数量超过1000个。 那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了。没有必要拓展到65536个。

三、 配置集群(三主三从)

Redis集群为什么至少需要三个master节点
因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。

Redis集群为什么推荐节点数为奇数?
奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。

3.1 配置config文件

本案例的配置是在一台虚拟机的6个端口分别配置了6个redis服务器
集群配置

  • 端口 6381
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 123456
masterauth 123456cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
  • 端口 6382
vim /myredis/cluster/redisCluster6382.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 6382
logfile "/myredis/cluster/cluster6382.log"
pidfile /myredis/cluster6382.pid
dir /myredis/cluster
dbfilename dump6382.rdb
appendonly yes
appendfilename "appendonly6382.aof"
requirepass 123456
masterauth 123456cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 5000
  • 端口 6383
vim /myredis/cluster/redisCluster6383.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 6383
logfile "/myredis/cluster/cluster6383.log"
pidfile /myredis/cluster6383.pid
dir /myredis/cluster
dbfilename dump6383.rdb
appendonly yes
appendfilename "appendonly6383.aof"
requirepass 123456
masterauth 123456cluster-enabled yes
cluster-config-file nodes-6383.conf
cluster-node-timeout 5000
  • 端口 6384
vim /myredis/cluster/redisCluster6384.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 6384
logfile "/myredis/cluster/cluster6384.log"
pidfile /myredis/cluster6384.pid
dir /myredis/cluster
dbfilename dump6384.rdb
appendonly yes
appendfilename "appendonly6384.aof"
requirepass 123456
masterauth 123456cluster-enabled yes
cluster-config-file nodes-6384.conf
cluster-node-timeout 5000
  • 端口 6385
vim /myredis/cluster/redisCluster6385.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 6385
logfile "/myredis/cluster/cluster6385.log"
pidfile /myredis/cluster6385.pid
dir /myredis/cluster
dbfilename dump6385.rdb
appendonly yes
appendfilename "appendonly6385.aof"
requirepass 123456
masterauth 123456cluster-enabled yes
cluster-config-file nodes-6385.conf
cluster-node-timeout 5000
  • 端口 6386
vim /myredis/cluster/redisCluster6386.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 6386
logfile "/myredis/cluster/cluster6386.log"
pidfile /myredis/cluster6386.pid
dir /myredis/cluster
dbfilename dump6386.rdb
appendonly yes
appendfilename "appendonly6386.aof"
requirepass 123456
masterauth 123456cluster-enabled yes
cluster-config-file nodes-6386.conf
cluster-node-timeout 5000

3.2 启动六台redis

redis-server /myredis/cluster/redisCluter6381.conf 
..........
redis-server /myredis/cluster/redisCluter6386.conf 

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

redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.88.130:6381 192.168.88.130:6382 192.168.88.130:6383 192.168.88.130:6384 192.168.88.130:6385 192.168.88.130:6386
  • -cluster-replicas 1 表示为每个master创建一个slave节点

3.3 任意连接一个作为切入点(集群只需要连一个),并检验集群状态

  • 连接6381端口
redis-cli -a 123456 -p 6381 -c     // -c表示集群 不加的话不是按照集群启动的,对于在别的机器上的key,会报错

不加 -c 启动 ,在存值时,可能会报错,原因是在计算槽位时,可能是在别的master下管理的槽位
下图中的槽位是在6384端口,所以需要在6384端口的redis进行set操作
在这里插入图片描述
加上-c之后,会进行自动重定向
在这里插入图片描述

  • 查看集群主从关系
cluster nodes       // 查看集群的主从关系

在这里插入图片描述

  • 查看集群信息
 cluster info       // 查看集群信息     
  • 查看某个key该属于对应的槽位值
CLUSTER KEYSLOT key  //查询key所在的槽位值

在这里插入图片描述

四、 扩展

  • 不在同一个slot槽位下的键值无法使用mset.mget等多键操作

可以通过{}来定义同一个组的概念,使key中内相同内容的键值对放到一个slot槽位去,对照下图类似k1k2k3都映射为x,
在这里插入图片描述

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

在配置文件中有以下代码

cluster-require-full-coverage

默认YES,现在集群架构是3主3从的redis cluster由3个master平分16384个slot,每个master的小集群负责1/3的slot,对应一部分数据。
cluster-require-full-coverage:默认值 yes,即需要集群完整性,方可对外提供服务通常情况,如果这3个小集群中,任何一个(1主1从)挂了,你这个集群对外可提供的数据只有2/3了,整个集群是不完整的,
redis 默认在这种情况下,是不会对外提供服务的。

如果你的诉求是,集群不完整的话也需要对外提供服务,需要将该参数设置为no ,这样的话你挂了的那个小集群是不行了,但是其他的小集群仍然可以对外提供服务。

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

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

相关文章

理兔chat开发日记

1.注册 注册跟以前的差不多,我们将我们的验证码放在redis下,我们在注册的时候先判断我们输入的验证码是否正确 验证码成功后在我们的实现类中,我们先判断邮箱是否重复,不重复我们就继续注册 我们拥有联号注册的功能,就…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者,Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

日志的编写与线程池的结合

目录 一、认识日志 二、时间的等级划分 三、日志的输出端 3.1 保存至文件 四、日志的部分信息 4.1 日志等级 4.2 日志时间 五、加载日志 六、日志的宏编写 七、ThreadPool Log 一、认识日志 记录事件: 日志用于记录系统运行过程中发生的各种事件&…

elementui 日历组件el-calendar使用总结

功能: 1.日历可以周视图、月视图切换; 2.点击月视图中日期可以切换到对应周视图; 3.点击周视图查看当日对应数据; 4.周、月视图状态下,点击前后按钮,分别切换对应上下的周、月; 5.点击回到…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷:P1601 AB Problem(高精&#x…

如何PR到别人仓库(指定分支,无废话)

如何PR到别人仓库(指定分支) 记录一下,之前都是直接master分支,现在记录如何pr到别人仓库的其他分支 首先进入别人仓库然后点击fork到自己仓库 步骤(以博主自己一个例子为例) (1)…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

【题目/训练】二叉树的创建遍历(递归非递归)

一、根据二叉树创建字符串 思路:在正常前序递归遍历的基础上,单独加上一个考虑到右子树为空的情况,如下:其结果为 1(2(4(5)(6)))&…

馥郁珍藏:品味红酒的层次与细腻

在生活的点滴中,总有一些事物以其不同的魅力,让我们为之驻足,为之沉醉。红酒,便是其中之一。它不仅仅是一种饮品,更是一种情感的寄托,一种生活的艺术。今天,就让我们一起走进红酒的世界&#xf…

工控主板:搭载海光3300处理器的全国产化工控主板

最近为客户定做了一款全国产化的工控机主板。搭载海光3300核心板的含有丰富接口的工控主板。

一张图生成绘画全过程,这下人人都成“原画师”了

玩过SD的应该都知道ControlNet吧,最近ControlNet的作者Lvmin Zhang 又搞了一个开源项目PaintsUndo,在Github刚上线就收获了2.7k Star。 只需要上传一张静态图像,PaintsUndo就可以根据提供的图像自动生成对应的绘画全过程视频。 展示从一张白…

linux中关于环境变量的常用的设置方法

一. linux中设置环境变量的方式 1.使用/etc/environment, 是一个全局的环境变量设置文件,它会影响到所有用户和所有进程。当你需要设置一个全局的环境变量时,应该使用这个文件。这个文件的格式是 KEYvalue,每行一个环境变量。 2. 使用/etc/…

C# Winform的三态CheckBox,以及批量修改Panel中的控件

在C# WinForms中,如果你想批量修改一个Panel容器内的所有CheckBox控件的状态,你可以使用foreach循环来遍历Panel的Controls集合。下面是一个示例,展示了如何将一个Panel内所有的CheckBox控件设为选中状态(Checked true&#xff0…

昇思25天学习打卡营第13天|munger85

文本解码原理–以MindNLP为例 重要的就是怎么样把数字最后转化成真正的文字。而且自回归模型它会一个字给一个字的预测,下一个字应该是什么? 如果这个模型下载很慢,你就可以通过这种方式从摩大社区进行下载。 这种方式, 每一次候…

如何让LabVIEW程序框图的图标简化,从而节省空间?

再点击选项 取消掉箭头所示的√即可。 这样就可以将生成的图标从下面所示: 变成简化的图标,如下所示:

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组:训练(train)、验证(validation)和测试(test)。使用训练数据集来训练模型,使用验证数据集跟踪模型在训练期间…

安全防御拓扑1

目录 实验的拓扑: 要求: 我搭建的实验拓扑 步骤: 创建vlan: 接口配置: 防火墙: 防火墙配置: 建立安全策略: 防火墙的用户: 办公区的市场部和研发部用户 市场部…

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中,0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug,使用_…

勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%

亚信安全信舷AE高性能防毒墙完成能力升级,全面完善勒索边界“全生命周期”防御体系,筑造边界勒索防御第一关! 勒索之殇,银狐当先 当前勒索病毒卷携着AI技术,融合“数字化”的运营模式,形成了肆虐全球的网…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next[1]都无脑写…