前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Redis】分片集群(四)

【Redis】分片集群(四)

作者头像
陶然同学
发布于 2023-03-10 03:42:31
发布于 2023-03-10 03:42:31
70400
代码可运行
举报
文章被收录于专栏:陶然同学博客陶然同学博客
运行总次数:0
代码可运行

目录

4.1.搭建分片集群

4.2.散列插槽

4.2.1.插槽原理

4.2.1.小结

4.3.集群伸缩

4.3.1.需求分析

4.3.2.创建新的redis实例

4.3.3.添加新节点到redis

4.3.4.转移插槽

4.4.故障转移

4.4.1.自动故障转移

4.4.2.手动故障转移

4.5.RedisTemplate访问分片集群

4.1.搭建分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

使用分片集群可以解决上述问题,如图:

分片集群特征:

  • 集群中有多个master,每个master保存不同数据
  • 每个master都可以有多个slave节点
  • master之间通过ping监测彼此健康状态
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点

4.2.散列插槽

4.2.1.插槽原理

Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:

数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:

  • key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分
  • key中不包含“{}”,整个key都是有效部分

例如:key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。

如图,在7001这个节点执行set a 1时,对a做hash运算,对16384取余,得到的结果是15495,因此要存储到103节点。

到了7003后,执行get num时,对num做hash运算,对16384取余,得到的结果是2765,因此需要切换到7001节点

4.2.1.小结

Redis如何判断某个key应该在哪个实例?

  • 将16384个插槽分配到不同的实例
  • 根据key的有效部分计算哈希值,对16384取余
  • 余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

  • 这一类数据使用相同的有效部分,例如key都以{typeId}为前缀

4.3.集群伸缩

redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:

比如,添加节点的命令:

4.3.1.需求分析

需求:向集群中添加一个新的master节点,并向其中存储 num = 10

  • 启动一个新的redis实例,端口为7004
  • 添加7004到之前的集群,并作为一个master节点
  • 给7004节点分配插槽,使得num这个key可以存储到7004实例

这里需要两个新的功能:

  • 添加一个节点到集群中
  • 将部分插槽分配到新插槽

4.3.2.创建新的redis实例

创建一个文件夹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir 7004

拷贝配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp redis.conf /7004

修改配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sed /s/6379/7004/g 7004/redis.conf

启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-server 7004/redis.conf

4.3.3.添加新节点到redis

添加节点的语法如下:

执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-cli --cluster add-node  192.168.150.101:7004 192.168.150.101:7001

通过命令查看集群状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-cli -p 7001 cluster nodes

如图,7004加入了集群,并且默认是一个master节点:

但是,可以看到7004节点的插槽数量为0,因此没有任何数据可以存储到7004上

4.3.4.转移插槽

我们要将num存储到7004节点,因此需要先看看num的插槽是多少:

如上图所示,num的插槽为2765.

我们可以将0~3000的插槽从7001转移到7004,命令格式如下:

具体命令如下:

建立连接:

得到下面的反馈:

询问要移动多少个插槽,我们计划是3000个:

新的问题来了:

那个node来接收这些插槽??

显然是7004,那么7004节点的id是多少呢?

复制这个id,然后拷贝到刚才的控制台后:

这里询问,你的插槽是从哪里移动过来的?

  • all:代表全部,也就是三个节点各转移一部分
  • 具体的id:目标节点的id
  • done:没有了

这里我们要从7001获取,因此填写7001的id:

填完后,点击done,这样插槽转移就准备好了:

确认要转移吗?输入yes:

然后,通过命令查看结果:

可以看到:

目的达成。

4.4.故障转移

集群初识状态是这样的:

其中7001、7002、7003都是master,我们计划让7002宕机。

4.4.1.自动故障转移

当集群中有一个master宕机会发生什么呢?

直接停止一个redis实例,例如7002:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-cli -p 7002 shutdown

1)首先是该实例与其它实例失去连接

2)然后是疑似宕机:

3)最后是确定下线,自动提升一个slave为新的master:

4)当7002再次启动,就会变为一个slave节点了:

4.4.2.手动故障转移

利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

这种failover命令可以指定三种模式:

  • 缺省:默认的流程,如图1~6歩
  • force:省略了对offset的一致性校验
  • takeover:直接执行第5歩,忽略数据一致性、忽略master状态和其它master的意见

案例需求:在7002这个slave节点执行手动故障转移,重新夺回master地位

步骤如下:

1)利用redis-cli连接7002这个节点

2)执行cluster failover命令

如图:

效果:

4.5.RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:

1)引入redis的starter依赖

2)配置分片集群地址

3)配置读写分离

与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  redis:
    cluster:
      nodes:
        - 192.168.150.101:7001
        - 192.168.150.101:7002
        - 192.168.150.101:7003
        - 192.168.150.101:8001
        - 192.168.150.101:8002
        - 192.168.150.101:8003
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
redis 3.0尝鲜
1.安装redis wget  http://download.redis.io/releases/redis-3.0.5.tar.gz tar zxf  redis-3.0.5.tar.gz  -C /export/server/ cd /export/servers/redis-3.0.5 make && make install  mkdir conf;cp redis.conf conf/ 2.redis集群模式配置 2.1redis主配置文件: vim  /export/servers/red
BGBiao
2018/02/26
8520
【云原生进阶之PaaS中间件】第一章Redis-2.3.3集群模式
        Redis集群是一个提供在多个Redis节点之间共享数据的程序集。它并不像Redis主从复制模式那样只提供一个master节点提供写服务,而是会提供多个master节点提供写服务,每个master节点中存储的数据都不一样,这些数据通过数据分片的方式被自动分割到不同的master节点上。
江中散人_Jun
2023/10/16
5200
【云原生进阶之PaaS中间件】第一章Redis-2.3.3集群模式
Redis分片集群
分片集群是将多个Redis主从结构联合起来,每个主从结构具有一个主实例和多个从实例。Redis的分片集群可以在数据量不断增大的情况下进行水平扩容,将键值放在指定的实例中,以此来降低系统对单主节点的依赖,从而提高Redis服务的读写性能。分片集群的结构图如下。
benym
2022/07/14
1.4K0
Redis分片集群
分布式缓存--Redis
RDB全称Redis Database Backup file(Redis**数据备份文件**),也被叫做**Redis数据快照**。简单来说就是把内存中的所有数据都**记录到磁盘**中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。
忆愿
2024/07/29
1340
分布式缓存--Redis
Redis进阶学习07--分布式缓存--下
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
大忽悠爱学习
2022/05/09
4630
Redis进阶学习07--分布式缓存--下
redis cluster(3)- redis集群管理:伸缩,故障
Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。这个槽是一个虚拟的槽,并不是真正存在的。正常工作的时候,Redis Cluster中的每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,这是可以由用户指定的,也可以在初始化的时候自动生成(redis-trib.rb脚本)。这里值得一提的是,在Redis Cluster中,只有Master才拥有槽的所有权,如果是某个Master的slave,这个slave只负责槽的使用,但是没有所有权。
黄规速
2022/04/14
7320
redis cluster(3)- redis集群管理:伸缩,故障
Redis cluster
Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。
DB之路
2021/03/12
7940
Redis Cluster模式
主从模式和哨兵模式数据库都存储了相同的数据,比较浪费内存。而且当数据量增加时,在单个数据库上很难实现在线扩容。Redis Cluster将数据分布存储在不同的节点上,每个节点存储不同的数据。添加节点就能解决扩容问题。
用户10384376
2023/02/26
6690
Redis Cluster模式
Redis高可用及分片集群
一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化操作即可。
星哥玩云
2022/08/16
4460
Redis高可用及分片集群
redis集群设计方案及原理
设计集群方案时,至少要考虑以下因素: (1)高可用要求:根据故障转移的原理,至少需要3个主节点才能完成故障转移,且3个主节点不应在同一台物理机上;每个主节点至少需要1个从节点,且主从节点不应在一台物理机上;因此高可用集群至少包含6个节点。 (2)数据量和访问量:估算应用需要的数据量和总访问量(考虑业务发展,留有冗余),结合每个主节点的容量和能承受的访问量(可以通过benchmark得到较准确估计),计算需要的主节点数量。 (3)节点数量限制:Redis官方给出的节点数量限制为1000,主要是考虑节点间通信带来的消耗。在实际应用中应尽量避免大集群;如果节点数量不足以满足应用对Redis数据量和访问量的要求,可以考虑:
星哥玩云
2022/08/18
6580
redis集群设计方案及原理
Redis 集群
所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态(高可用)。
Carlos Ouyang
2019/08/19
1.9K0
Redis 集群
Redis高可用(cluster集群):从单点故障到集群弹性扩展
这里推荐一篇实用的文章:《图灵测试到底是什么?怎么才能测试通过》,作者:【用户10024547】。
Lion 莱恩呀
2024/11/20
2610
Redis高可用(cluster集群):从单点故障到集群弹性扩展
Redis 高可用集群原理和实践
Redis 集群是 Redis 提供的分布式数据库方案,集群痛殴分片(sharding)来进行数据共享,并提供复制和故障转移能力。
PHP开发工程师
2022/05/31
3750
Redis 高可用集群原理和实践
Redis集群搭建
Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006)1+1+1+1+1+1 = 6
Yuou
2022/09/26
5470
如何搭建redis集群 --- redis-cluster
在之前的《来聊聊NoSql》一文中,已经说了redis三种集群模式中的主从和哨兵,接下来再看看redis-cluster怎么玩。本文基于redis-cluster官方文档(https://redis.io/topics/cluster-tutorial),将其细化具体化,每一个操作过程都详细记录,如果官方文档读起来有点吃力,本文会是你不错的选择。 本文内容包括:
贪挽懒月
2020/08/11
2K0
Redis 集群教程
本文档是Redis集群的入门教程, 从用户的角度介绍了设置、测试和操作集群的方法。 本教程不包含晦涩难懂的分布式概念, 也没有像Redis 集群规范那样包含Redis 集群的实现细节, 如果你打算深入地学习 Redis 集群的部署方法, 那么推荐你在阅读完这个教程之后, 再去看一看集群规范。 Redis 集群目前仍处于Alpha测试版本, 如果在使用过程中发现任何问题, 请到Redis 邮件列表 发贴, 或者到Redis的Github页面报告错误。 集群简介 Redis 集群是一个可以在多个 Redis 节
小小科
2018/05/02
8330
redis cluster(1)-redis集群安装配置详解
Redis Cluster是一个高性能高可用的分布式系统。由多个Redis实例组成的整体,数据按照Slot存储分布在多个Redis实例上,通过Gossip协议来进行节点之间通信。
黄规速
2022/04/14
9650
redis cluster(1)-redis集群安装配置详解
Redis(3.2.3)集群部署实战
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/52817923
shaonbean
2019/05/26
7550
通过 Docker 部署 Redis 集群
在 Redis 3.0 版本后正式推出 Redis 集群模式,该模式是 Redis 的分布式的解决方案,是一个提供在多个 Redis 节点间共享数据的程序集,且 Redis 集群是去中心化的,它的每个 Master 节点都可以进行读写数据,每个节点都拥有平等的关系,每个节点都保持各自的数据和整个集群的状态。
JAVA葵花宝典
2021/04/08
9130
通过 Docker 部署 Redis 集群
Redis Cluster集群总结性梳理
前面已经介绍了Redis Cluster集群及其部署过程,下面再补充下有关Redis Cluster应用原理部分内容,以便更加深刻透彻地理解Redis Cluster。 一、Redis Cluster集群最核心的三个目标 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、异步复制、客户端重定向等设计,而牺牲了部分的一致性、使用性。 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点。 可用性:在Cluster
洗尽了浮华
2018/01/23
4.5K3
Redis Cluster集群总结性梳理
相关推荐
redis 3.0尝鲜
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验