iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >深入浅析Redis 集群伸缩原理
  • 907
分享到

深入浅析Redis 集群伸缩原理

2024-04-02 19:04:59 907人浏览 安东尼
摘要

目录一、集群扩容1. 手动扩容2. 使用 Redis-cli 扩容二、集群收缩1. 迁移槽2. 忘记节点Redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:Redis 槽和对

Redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:Redis 槽和对应数据在不同节点之间移动

环境:Centos7 搭建 Redis 集群

一、集群扩容

1. 手动扩容

(1) 准备节点 9007,并加入集群

192.168.11.40:9001> cluster meet 192.168.11.40 9007

【注意】若 cluster meet 加入已存在于其它集群的节点,会导致集群合并,造成数据错乱!。建议使用 redis-cli 的 add-node


# 若节点已加入其它集群或包含数据,会报错
add-node    new_host:new_port existing_host:existing_port
            --cluster-slave  # 直接添加为从节点
            --cluster-master-id <arg>  # 从节点对应的主节点id

(2) 迁移槽和数据

槽在迁移过程中集群可以正常提供读写服务

首先确定原有节点的哪些槽需要迁移到新节点。确保每个节点负责相似数量的槽,保证各节点的数据均匀

槽是 Redis 集群管理数据的基本单位。数据迁移是逐槽进行的

槽迁移流程:

  • 目标节点准备导入槽的数据:目标节点执行cluster setslot {slot} importing {sourceNodeId}
  • 源节点准备迁出槽的数据:源节点执行cluster setslot {slot} migrating {targetNodeId}
  • 获取 count 个属于槽 slot 的键:源节点执行cluster geTKEysinslot {slot} {count}
  • 迁移键:源节点执行migrate {targetIp} {targetPort} "" 0 {timeout} keys {keys...},把键通过流水线(pipeline)机制批量迁移到目标节点。Redis3.0.6 后才支持批量迁移
  • 重复上两步,直到槽下所有的键值数据迁移到目标节点
  • 向集群所有主节点通知槽被分配给目标节点:集群内所有主节点执行cluster setslot {slot} node {targetNodeId}

内部伪代码:


def move_slot(source,target,slot):
    # 目标节点准备导入槽
    target.cluster("setslot",slot,"importing",source.nodeId);
    # 目标节点准备全出槽
    source.cluster("setslot",slot,"migrating",target.nodeId);
    while true :
        # 批量从源节点获取键
        keys = source.cluster("getkeysinslot",slot,pipeline_size);
        if keys.length == 0:
            # 键列表为空时,退出循环
            break;
        # 批量迁移键到目标节点
        source.call("migrate",target.host,target.port,"",0,timeout,"keys",keys);
        # 向集群所有主节点通知槽被分配给目标节点
        for node in nodes:
            if node.flag == "slave":
                continue;
            node.cluster("setslot",slot,"node",target.nodeId);

(3) 将 9001 的槽 4096 迁移到 9007 中

准备数据

192.168.11.40:9001> set key:test:5028 value:5028
192.168.11.40:9001> set key:test:68253 value:68253

目标节点准备工作


192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620928869000 2 connected 0-5461
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620928868000 0 connected
...
# 9007 准备导入槽 4096 的数据
192.168.11.40:9007> cluster setslot 4096 importing 8ccdb0963411ebd05ce21952bdd4b7597825afdc
OK
# 槽 4096 已开启导入状态
192.168.11.40:9007> cluster nodes
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620928959000 0 connected [4096-<-8ccdb0963411ebd05ce21952bdd4b7597825afdc]
...

源节点准备工作


# 9001 准备导出槽 4096 数据
192.168.11.40:9001> cluster setslot 4096 migrating bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
OK
# 槽 4096 已开启导出状态
192.168.11.40:9001> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 myself,master - 0 1620929179000 2 connected 0-5461 [4096->-bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d]
...

导出数据


# 获取 100 个属于槽 4096 的键
192.168.11.40:9001> cluster getkeysinslot 4096 100
1) "key:test:5028"
2) "key:test:68253"
# 查看数据
192.168.11.40:9001> mget key:test:5028 key:test:68253
1) "value:5028"
2) "value:68253"
# 迁移这2个键:migrate 命令保证了每个键迁移过程的原子性
192.168.11.40:9001> migrate 192.168.11.40 9007 "" 0 5000 keys key:test:5028 key:test:68253
OK
# 再次查询会报 ASK 错误:引导客户端找到数据所在的节点
192.168.11.40:9001> mget key:test:5028 key:test:68253
(error) ASK 4096 192.168.11.40:9007

通知所有主节点:槽 4096 指派给 9007


192.168.11.40:9001> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
192.168.11.40:9002> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
192.168.11.40:9003> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
192.168.11.40:9007> cluster setslot 4096 node bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d

查看最终结果

192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620931743303 7 connected 0-4095 4097-5461
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620931741000 8 connected 4096
...

2. 使用 redis-cli 扩容

redis-cli 提供了槽重分片功能

reshard 命令参数详解:


reshard    host:port  # 集群内任意节点地址
           --cluster-from <arg>  # 源节点id,逗号分隔
           --cluster-to <arg>  # 目标节点id,只有一个
           --cluster-slots <arg>  # 迁移多少个槽
           --cluster-yes  # 确认执行reshard
           --cluster-timeout <arg>  # 每次 migrate 操作的超时时间,默认 60000ms
           --cluster-pipeline <arg>  # 每次批量迁移键的数量,默认 10
           --cluster-replace

将 9001、9002、9003 的槽迁移到 9007,共迁移 4096 个


$ /usr/local/redis/bin/redis-cli --cluster reshard 192.168.11.40:9001
M: 8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001
   slots:[0-4095],[4097-5461] (5461 slots) master
   1 additional replica(s)
M: bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007
   slots:[4096] (1 slots) master
...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 8ccdb0963411ebd05ce21952bdd4b7597825afdc
Source node #2: 5786e3237c7fa413ed22465d15be721f95e72cfa
Source node #3: 85ceb9826e8aa003169c46fb4ba115c72002d4f9
Source node #4: done
    Moving slot 0 from 8ccdb0963411ebd05ce21952bdd4b7597825afdc
    ...
    Moving slot 12287 from 85ceb9826e8aa003169c46fb4ba115c72002d4f9
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 0 from 192.168.11.40:9001 to 192.168.11.40:9007:
...
Moving slot 12287 from 192.168.11.40:9003 to 192.168.11.40:9007:

查看最终结果

192.168.11.40:9007> cluster nodes
8ccdb0963411ebd05ce21952bdd4b7597825afdc 192.168.11.40:9001@19001 master - 0 1620933907753 7 connected 1366-4095 4097-5461
5786e3237c7fa413ed22465d15be721f95e72cfa 192.168.11.40:9002@19002 master - 0 1620933906733 1 connected 6827-10922
85ceb9826e8aa003169c46fb4ba115c72002d4f9 192.168.11.40:9003@19003 master - 0 1620933905000 3 connected 12288-16383
bb1bb0f5f9e0ee67846ba8ec94a38da700e2e80d 192.168.11.40:9007@19007 myself,master - 0 1620933900000 8 connected 0-1365 4096 5462-6826 10923-12287
...

检查节点之间槽的均衡性


$ /usr/local/redis/bin/redis-cli --cluster rebalance 192.168.11.40:9001
...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.

迁移之后所有主节点负责的槽数量差异在 2% 以内,因此集群节点数据相对均匀,无需调整

二、集群收缩

1. 迁移槽

执行 reshard 三次,将数据平均分布到其他三个节点

2. 忘记节点

60s 内对所有节点执行如下操作:(不建议)


# 执行后,会将该节点加入禁用列表(持续 60s),不再向其发送 Gossip 消息
cluster forget {nodeId}

建议使用 redis-cli 的 del-node 忘记节点:


/usr/local/redis/bin/redis-cli --cluster del-node {host:port} {nodeId}

内部伪代码


def delnode_cluster_cmd(downNode):
    # 下线节点不允许包含slots
    if downNode.slots.length != 0
        exit 1
    end
    # 向集群内节点发送cluster forget
    for n in nodes:
        if n.id == downNode.id:
            # 不能对自己做forget操作
            continue;
        # 如果下线节点有从节点则把从节点指向其他主节点
        if n.replicate && n.replicate.nodeId == downNode.id :
            # 指向拥有最少从节点的主节点
            master = get_master_with_least_replicas();
            n.cluster("replicate",master.nodeId);
        #发送忘记节点命令
        n.cluster('forget',downNode.id)
    # 节点关闭
    downNode.shutdown();

若主从节点都要下线,先下线从,避免全量复制

以上就是Redis 集群伸缩原理的详细内容,更多关于Redis 集群原理的资料请关注编程网其它相关文章!

--结束END--

本文标题: 深入浅析Redis 集群伸缩原理

本文链接: https://www.lsjlt.com/news/126045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入浅析Redis 集群伸缩原理
    目录一、集群扩容1. 手动扩容2. 使用 redis-cli 扩容二、集群收缩1. 迁移槽2. 忘记节点Redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:Redis 槽和对...
    99+
    2022-11-12
  • Redis 集群伸缩原理
    Redis 节点分别维护自己负责的槽和对应的数据。伸缩原理:Redis 槽和对应数据在不同节点之间移动 环境:CentOS7 搭建 Redis 集群 一、集群扩容 1. 手动扩容 (1) 准备节点 9007,并加入集群 192.168.1...
    99+
    2019-10-16
    Redis 集群伸缩原理
  • 深入浅析RabbitMQ镜像集群原理
    目录集群架构1)首先一个基本的 RabbitMQ 集群不是高可用的2)其次 RabbitMQ 集群本身并没有提供负载均衡的功能3)接着假设我们只采用一台 HAProxy4)最后,任何...
    99+
    2022-11-12
  • Redis中集群伸缩的原理是什么
    本篇文章给大家分享的是有关Redis中集群伸缩的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、集群扩容1. 手动扩容(1) 准备节点 9007,并加入集群192....
    99+
    2023-06-15
  • K8s的集群伸缩原理是什么
    这篇文章给大家介绍K8s的集群伸缩原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。阿里云 K8s 集群的一个重要特性,是集群的节点可以动态的增加或减少。有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,...
    99+
    2023-06-04
  • Redis集群原理详细分析
    目录一致性哈希Redis 集群一致性哈希 节点的增加和减少,大部分节点的 Hash一致 package consistenthash import ( "hash/crc32" ...
    99+
    2022-12-19
    Redis集群 Redis集群原理 Redis集群模式
  • redis集群原理的示例分析
    这篇文章主要介绍redis集群原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!redis集群的原理如果说依靠哨兵可以实现redis的高可用,如果还想在支持高并发同时容纳海...
    99+
    2022-10-19
  • 深入浅析Java中 JVM的原理
    这篇文章将为大家详细讲解有关深入浅析Java中 JVM的原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真...
    99+
    2023-05-31
    java jvm ava
  • 深入浅析ELK原理与简介
    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、...
    99+
    2022-11-12
  • 深入浅出解析Java ThreadLocal原理
    目录1.了解ThreadLocal简介使用2.源码解析 – 探究实现思路threadLocals变量与ThreadLocalMapset(T value) 方法get() 方法rem...
    99+
    2022-11-12
  • 深入浅析HashMap的工作原理
    这篇文章给大家介绍深入浅析HashMap的工作原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集...
    99+
    2023-05-31
    hashmap
  • Redis cluster集群模式的原理解析
    redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放...
    99+
    2022-11-12
  • 深入浅析SpringBoot自动配置原理
    SpringBoot2.3.1版本源码 一、SpringBoot启动的时候加载主配置类,通过@EnableAutoConfiguration注解开启了自动配置功能 。 二...
    99+
    2022-11-12
  • 深入浅析java中反射的原理
    深入浅析java中反射的原理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.Class类任何一个类都是Class的实例对象,这个实例对象有三种表示方式//第一种表示方式---...
    99+
    2023-05-31
    java 反射 ava
  • 深入浅析JAVA中封装的原理
    本篇文章为大家展示了深入浅析JAVA中封装的原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一节 什么是JAVA中的封装面向对象的三大特性:封装、继承、多态。概念:将类的某些信息隐藏在类的内部,...
    99+
    2023-05-31
    java 封装 ava
  • Redis数据库原理深入刨析
    目录1.服务器和客户端实现的数据库2.数据库字典的实现3.键值对的生命周期管理4.过期键的管理策略5.持久化对过期键的处理6.主从复制对过期键的处理1.服务器和客户端实现的数据库  Redis服务器在启动时,会...
    99+
    2022-11-22
    Redis数据库 Redis数据库原理 Redis数据库怎么用
  • Redis集群写入/查询数据原理(理论)
    redis集群数据存储原理:    在redis cluster中,如果想要存入一个key-value,    这个key首先会通过CRC16算法取余(和16384取余),    结果会对应上0-16383...
    99+
    2022-10-18
  • 《深入浅出深度学习:原理剖析与pytho
    8.1 生物神经元(BN)结构 1、人脑中有100亿-1000亿个神经元,每个神经元大约会和其他1万个神经元相连 2、细胞体:神经元的主体,细胞体=细胞核+细胞质+细胞膜,存在膜电位 3、树突:从细胞体向外延伸出许多突起的神经纤维。输入...
    99+
    2023-01-31
    深入浅出 深度 原理
  • 深入浅出分析C++ string底层原理
    目录一、深浅拷贝 浅拷贝:深拷贝二、string迭代器原理 三、string的传统写法 1.构造实现 2.其他接口 一、深浅拷贝 浅拷贝: 在实现string时要是不实先strin...
    99+
    2022-11-12
  • 带你深入了解Vue.$nextTick(原理浅析)
    白话一点就是说,其实这是和JS当中的事件循环是息息相关的,就是Vue不可能对每一个数据变化都做一次渲染,它会把这些变化先放在一个异步的队列当中,同时它还会对这个队列里面的操作进行去重,比如你修改了这个数据三次,它只会保留最后一次。这些变化是...
    99+
    2023-05-14
    $nextTick 前端 Vue.js
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作