超详细Redis入门教程——Redis分布式系统

前言

在这里插入图片描述

本文小新为大家带来 Redis分布式系统 相关知识,具体内容包括数据分区算法(包括:顺序分区哈希分区),系统搭建与运行(包括:系统搭建系统启动与关闭),集群操作(包括:连接集群写入数据集群查询故障转移集群扩容集群缩容),分布式系统的限制等进行详尽介绍~

不积跬步,无以至千里;不积小流,无以成江海。每天进步一点点,在成为强者的路上,小新与大家共同成长!

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

🚩欢迎关注小新的Git仓库:小新Java成长之路,不定期更新Java学习资料~

↩️本文上接:超详细Redis入门教程——Redis 主从集群(下)


目录

文章标题

  • 前言
  • 目录
  • 一、数据分区算法
    • 1️⃣顺序分区
    • 2️⃣哈希分区
  • 二、系统搭建与运行
    • 1️⃣系统搭建
    • 2️⃣系统启动与关闭
  • 三、集群操作
    • 1️⃣连接集群
    • 2️⃣写入数据
    • 3️⃣集群查询
    • 4️⃣故障转移
    • 5️⃣集群扩容
    • 6️⃣集群缩容
  • 四、分布式系统的限制
  • 后记

在这里插入图片描述
Redis 分布式系统,官方称为 Redis Cluster,Redis 集群,其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据,并将用户请求方便地路由到不同 Redis 的问题。

一、数据分区算法

分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器节点上,每个节点管理着整个数据集合中的一个子集。

在这里插入图片描述

常见的数据分区规则有两大类:顺序分区与哈希分区。

1️⃣顺序分区

顺序分区规则可以将数据按照某种顺序平均分配到不同的节点。不同的顺序方式,产生了不同的分区算法。例如,轮询分区算法、时间片轮转分区算法、数据块分区算法、业务主题分区算法等。由于这些算法都比较简单,所以这里就不展开描述了。

🍀(1)轮询分区算法

每产生一个数据,就依次分配到不同的节点。该算法适合于数据问题不确定的场景。其分配的结果是,在数据总量非常庞大的情况下,每个节点中数据是很平均的。但生产者与数据节点间的连接要长时间保持。

🍀(2)时间片轮转分区算法

在某人固定长度的时间片内的数据都会分配到一个节点。时间片结束,再产生的数据就会被分配到下一个节点。这些节点会被依次轮转分配数据。该算法可能会出现节点数据不平均的情况(因为每个时间片内产生的数据量可能是不同的)。但生产者与节点间的连接只需占用当前正在使用的这个就可以,其它连接使用完毕后就立即释放。

🍀(3)数据块分区算法

在整体数据总量确定的情况下,根据各个节点的存储能力,可以将连接的某一整块数据分配到某一节点。

🍀(4)业务主题分区算法

数据可根据不同的业务主题,分配到不同的节点。

2️⃣哈希分区

哈希分区规则是充分利用数据的哈希值来完成分配,对数据哈希值的不同使用方式产生了不同的哈希分区算法。哈希分区算法相对较复杂,这里详细介绍几种常见的哈希分区算法。

🍀(1)节点取模分区算法

该算法的前提是,每个节点都已分配好了一个唯一序号,对于 N 个节点的分布式系统,其序号范围为[0, N-1]。然后选取数据本身或可以代表数据特征的数据的一部分作为 key,计算 hash(key)与节点数量 N 的模,该计算结果即为该数据的存储节点的序号。

该算法最大的优点是简单,但其也存在较严重的不足。如果分布式系统扩容或缩容,已经存储过的数据需要根据新的节点数量 N 进行数据迁移,否则用户根据 key 是无法再找到原来的数据的。生产中扩容一般采用翻倍扩容方式,以减少扩容时数据迁移的比例。

🍀(2)一致性哈希分区算法

一致性 hash 算法通过一个叫作一致性 hash 环的数据结构实现。这个环的起点是 0,终点是 232 - 1,并且起点与终点重合。环中间的整数按逆/顺时针分布,故这个环的整数分布范围是[0, 232 - 1]

在这里插入图片描述
上图中存在四个对象 o1、o2、o3、o4,分别代表四个待分配的数据,红色方块是这四个数据的 hash(o)在 Hash 环中的落点。同时,图上还存在三个节点 m0、m1、m2,绿色圆圈是这三节点的 hash(m)在 Hash 环中的落点。

现在要为数据分配其要存储的节点。该数据对象的 hash(o) 按照逆/顺时针方向距离哪个节点的 hash(m)最近,就将该数据存储在哪个节点。这样就会形成上图所示的分配结果。

该算法的最大优点是,节点的扩容与缩容,仅对按照逆/顺时针方向距离该节点最近的节点有影响,对其它节点无影响。

当节点数量较少时,非常容易形成数据倾斜问题,且节点变化影响的节点数量占比较大,即影响的数据量较大。所以,该方式不适合数据节点较少的场景。

🍀(3)虚拟槽分区算法

该算法首先虚拟出一个固定数量的整数集合,该集合中的每个整数称为一个 slot 槽。这个槽的数量一般是远远大于节点数量的。然后再将所有 slot 槽平均映射到各个节点之上。例如,Redis 分布式系统中共虚拟了 16384 个 slot 槽,其范围为[0, 16383]。假设共有 3 个节点,那么 slot 槽与节点间的映射关系如下图所示:

在这里插入图片描述

而数据只与 slot 槽有关系,与节点没有直接关系。数据只通过其 key 的 hash(key)映射到slot 槽:slot = hash(key) % slotNums。这也是该算法的一个优点,解耦了数据与节点,客户端无需维护节点,只需维护与 slot 槽的关系即可。

Redis 数据分区采用的就是该算法。其计算槽点的公式为:slot = CRC16(key) % 16384。CRC16()是一种带有校验功能的、具有良好分散功能的、特殊的 hash 算法函数。其实 Redis中计算槽点的公式不是上面的那个,而是:slot = CRC16(key) &16383。

若要计算 a % b,如果 b 是 2 的整数次幂,那么 a % b = a & (b-1)。

二、系统搭建与运行

1️⃣系统搭建

🍀(1)系统架构

下面要搭建的 Redis 分布式系统由 6 个节点构成,这 6 个节点的地址及角色分别如下表所示。一个 master 配备一个 slave,不过 master 与 slave 的配对关系,在系统搭建成功后会自动分配。

序号角色地址
1master127.0.0.1:6380
2master127.0.0.1:6381
3master127.0.0.1:6382
4slave127.0.0.1:6383
5slave127.0.0.1:6384
6slave127.0.0.1:6385

🍀(2)删除持久化文件

先将之前“Redis 主从集群”中在 Redis 安装目录下生成的 RDB 持久化文件 dump638*.conf与 AOF 持久化文件删除。因为 Redis 分布式系统要求创建在一个空的数据库之上。注意,AOF持久化文件全部在appendonlydir 目录中。

在这里插入图片描述

🍀(3)创建目录

在 Redis 安装目录中 mkdir 一个新的目录 cluster-dis,用作分布式系统的工作目录。

🍀(4)复制 2 个配置文件

将 cluster 目录中的 redis.conf 与 redis6380.conf 文件复制到 cluster-dis 目录。

在这里插入图片描述

🍀(5)修改 redis.conf

对于 redis.conf 配置文件,主要涉及到以下三个四个属性:

A、dir

在这里插入图片描述

指定工作目录为前面创建的 cluster-dis 目录。持久化文件、节点配置文件将来都会在工作目录中自动生成。

B、 cluster-enabled

在这里插入图片描述

该属性用于开启 Redis 的集群模式。

C、 cluster-config-file

在这里插入图片描述

该属性用于指定“集群节点”的配置文件。该文件会在第一次节点启动时自动生成,其生成的路径是在 dir 属性指定的工作目录中。在集群节点信息发生变化后(如节点下线、故障转移等),节点会自动将集群状态信息保存到该配置文件中。

不过,该属性在这里仍保持注释状态。在后面的每个节点单独的配置文件中配置它。

D、cluster-node-timeout

在这里插入图片描述

用于指定“集群节点”间通信的超时时间阈值,单位毫秒。

🍀(6)修改 redis6380.conf

在这里插入图片描述

仅添加一个 cluster-config-file 属性即可。

🍀(7)复制 5 个配置文件

使用 redis6380.conf 复制出 5 个配置文件 redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf、redis6385.conf。

在这里插入图片描述

cluster-dis 中出现了 7 个配置文件。

在这里插入图片描述

🍀(8)修改 5 个配置文件

修改 5 个配置文件 redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf、redis6385.conf 的内容,将其中所有涉及的端口号全部替换为当前文件名称中的端口号。例如,下面的是 redis6381.conf 的配置文件内容。

在这里插入图片描述

2️⃣系统启动与关闭

🍀(1)启动节点

启动所有 Redis 节点。

在这里插入图片描述

在这里插入图片描述

此时查看 cluster-dis 目录,可以看到生成了 6 个 nodes 的配置文件。

在这里插入图片描述
🍀(2)创建系统

6 个节点启动后,它们仍是 6 个独立的 Redis,通过 redis-cli --cluster create 命令可将 6个节点创建了一个分布式系统。

在这里插入图片描述

该命令用于将指定的 6 个节点连接为一个分布式系统。–cluster replicas 1 指定每个master 会带有一个 slave 作为副本。

回车后会立即看到如下日志:

在这里插入图片描述
输入 yes 后回车,系统就会将以上显示的动态配置信息真正的应用到节点上,然后就可可看到如下日志:

在这里插入图片描述

🍀(3)测试系统

在这里插入图片描述

通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建。不过,对于客户端连接命令 redis-cli,需要注意两点:

  • redis-cli 带有-c 参数,表示这是要连接一个“集群”,而非是一个节点。
  • 端口号可以使用 6 个中的任意一个。

🍀(4)关闭系统

对于分布式系统的关闭,只需将各个节点 shutdown 即可。

在这里插入图片描述

三、集群操作

1️⃣连接集群

连接集群

在这里插入图片描述

与之前单机连接相比的唯一区别就是增加了参数-c。

2️⃣写入数据

🍀(1)key 单个写入

无论 value 类型为 String 还是 List、Set 等集合类型,只要写入时操作的是一个 key,那么在分布式系统中就没有问题。例如,

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

🍀(2)key 批量操作

对一次写入多个 key 的操作,由于多个 key 会计算出多个 slot,多个 slot 可能会对应多个节点。而由于一次只能写入一个节点,所以该操作会报错。

在这里插入图片描述

不过,系统也提供了一种对批量 key 的操作方案,为这些 key 指定一个统一的 group,让这个 group 作为计算 slot 的唯一值。

在这里插入图片描述

3️⃣集群查询

🍀(1)查询 key 的 slot

通过 cluster keyslot 可以查询指定 key 的 slot。例如,下面是查询 emp 的 slot。

在这里插入图片描述

🍀(2)查询 slot 中 key 的数量

通过 cluster countkeysinslot 命令可以查看到指定 slot 所包含的 key 的个数。

在这里插入图片描述

🍀(3)查询 slot 中的 key

通过 cluster getkeysinslot 命令可以查看到指定 slot 所包含的 key。

在这里插入图片描述

4️⃣故障转移

分布式系统中的某个 master 如果出现宕机,那么其相应的 slave 就会自动晋升为 master。如果原 master 又重新启动了,那么原 master 会自动变为新 master 的 slave。

🍀(1)模拟故障

通过 cluster nodes 命令可以查看系统的整体架构及连接情况。
在这里插入图片描述

当然,也可以通过 info replication 查看当前客户端连接的节点的角色。可以看到,6381节点是 master,其 slave 为 6383 节点。

在这里插入图片描述

为了模拟 6381 宕机,直接将其 shutdown。

在这里插入图片描述

通过客户端连接上 6383 节点后可以查看到,其已经自动晋升为了 master。

在这里插入图片描述

重启 6381 节点后查看其角色,发现其自动成为了 6383 节点的 slave。

在这里插入图片描述

🍀(2)全覆盖需求

如果某 slot 范围对应节点的 master 与 slave 全部宕机,那么整个分布式系统是否还可以对外提供读服务,就取决于属性cluster-require-full-coverage 的设置。

在这里插入图片描述

该属性有两种取值:

  • yes:默认值。要求所有 slot 节点必须全覆盖的情况下系统才能运行。
  • no:slot 节点不全的情况下系统也可以提供查询服务。

5️⃣集群扩容

下面要在正在运行的分布式系统中添加两个新的节点:端口号为 6386 的节点为 master节点,其下会有一个端口号为 6387 的 slave 节点。

🍀(1)复制并修改 2 个配置文件

使用 redis6380.conf 复制出 2 个配置文件 redis6386.conf 与 redis6387.conf,并修改其中的各处端口号为相应端口号,为集群扩容做前期准备。

🍀(2)启动系统与 2 个节点

由于要演示的是在分布式系统运行期间的动态扩容,所以这里先启动分布式系统。

在这里插入图片描述

要添加的两个节点是两个 Redis,所以需要先将它们启动。只不过,在没有添加到分布式系统之前,它们两个是孤立节点,每个节点与其它任何节点都没有关系。

在这里插入图片描述

🍀(3)添加 master 节点

在这里插入图片描述

通过命令 redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort}可以将新的节点添加到系统中。其中{newHost}:{newPort}是新添加节点的地址,{existHost}:{existPort}是原系统中的任意节点地址。

添加成功后可看到如下日志。

在这里插入图片描述

添加成功后,通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其它 master 节点都分配有 slot,只有新添加的 master 还没有相应的 slot。当然,通过该命令也可以看到该新节点的动态 ID。

在这里插入图片描述

🍀(4)分配 slot

为新的 master 分配的 slot 来自于其它节点,总 slot 数量并不会改变。所以 slot 分配过程本质是一个 slot 的移动过程。

通过 redis-cli –c --cluster reshard {existIP}:{existPort}命令可开启 slot 分配流程。其中地址{existIP}:{existPort}为分布式系统中的任意节点地址。

在这里插入图片描述
该流程中会首先查询出当前节点的 slot 分配情况。

在这里插入图片描述

然后开始 Q&A 交互。一共询问了四个问题,这里有三个:

  • 准备移动多少 slot?
  • 准备由谁来接收移动的 slot?
  • 选择要移动 slot 的源节点。有两种方案。如果选择键入 all,则所有已存在 slot 的节点都将作为 slot源节点,即该方案将进行一次 slot 全局大分配。也可以选择其它部分节点作为 slot 源节点。此时将源节点的动态 ID 复制到这里,每个ID 键入完毕后回车,然后再复制下一个 slot 源节点动态 ID,直至最后一个键入完毕回车后再键入 done。

这里键入的是 all,进行全局大分配。

在这里插入图片描述

其首先会检测指定的 slot 源节点的数据,然后制定出 reshard 的方案。

在这里插入图片描述

这里会再进行一次 Q&A 交互,询问是否想继续处理推荐的方案。键入 yes,然后开始真正的全局分配,直至完成。

在这里插入图片描述

此时再通过 redis-cli -c -p 6386 cluster nodes 命令查看节点信息,可以看到 6386 节点中已经分配了 slot,只不过分配的 slot 编号并不连续。master 节点新增完成。

在这里插入图片描述

🍀(5)添加 slave 节点

现要将 6387 节点添加为 6386 节点的 slave。当然,首先要确保 6387 节点的 Redis 是启动状态。

通过 redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort} --cluster-slave --cluster-master-id masterID 命令可将新添加的节点直接添加为指定 master 的 slave。

在这里插入图片描述

回车后可看到如下的日志,说明添加成功。

在这里插入图片描述

此时再通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其已经添加成功,且为指定master 的 slave。
在这里插入图片描述
在这里插入图片描述

6️⃣集群缩容

下面要将 slave 节点 6387 与 master 节点 6386 从分布式系统中删除。

🍀(1)删除 slave 节点

对于 slave 节点,可以直接通过 redis-cli --cluster del-node : delNodeID命令删除。

在这里插入图片描述

此时再查看集群,发现已经没有了 6387 节点。

在这里插入图片描述

🍀(2)移出 master 的 slot

在删除一个 master 之前,必须要保证该 master 上没有分配有 slot。否则无法删除。所以,在删除一个 master 之前,需要先将其上分配的 slot 移出。

在这里插入图片描述
以上交互指定的是将 6386 节点中的 1999 个 slot 移动到 6380 节点。

注意:

  • 要删除的节点所包含的 slot 数量在前面检测结果中都是可以看到的,例如,6386 中的并不是 2000 个,而是 1999 个
  • What is the receiving node ID?仅能指定一个接收节点

回车后继续。

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

此时再查看发现,6386 节点中已经没有 slot 了。

在这里插入图片描述
🍀(3)删除 master 节点

此时就可以删除 6386 节点了。

在这里插入图片描述

此时再查看集群,发现已经没有了 6386 节点。

在这里插入图片描述

四、分布式系统的限制

Redis 的分布式系统存在一些使用限制:

  • 仅支持 0 号数据库
  • 批量 key 操作支持有限
  • 分区仅限于 key
  • 事务支持有限
  • 不支持分级管理

后记

在这里插入图片描述

👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~

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

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

相关文章

初学mybatis(七)缓存

学习回顾:初学mybatis(六) 一、简介 1、什么是缓存 [ Cache ]? 存在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询&#x…

赛效:如何将PDF文件分割成单页的PDF文档

1:打开wdashi点击PDF处理菜单里的“PDF分割”。 2:将本地PDF文件添加上去,在下方选择转换页码,在这里我们选择转换每一页。 3:点击右下角“开始转换”。 4:转换好后,点击绿色下载按钮将分割好的…

Generative Adversarial Network(生成对抗网络)

目录 Generative Adversarial Network(生成对抗网络) Basic Idea of GAN GAN as structured learning Can Generator learn by itself Can Discriminator generate Theory behind GAN Conditional GAN Generative Adversarial Network(…

【SpringMVC】| 报文信息转换器HttpMessageConverter

目录 框架搭建 报文信息转换器HttpMessageConverter 1. RequestBody注解 2. RequestEntity类型 3. RequestBody注解(常用) 重点:SpringMVC处理json 重点:SpringMVC处理ajax 重点:RestController注解 4. Respo…

Redis入门(4)-list

redis中list数据会按照插入顺序进行排序,其底层是一个无头结点的双向链表,因此表头和表尾的操作性能较高,但中间元素操作性能较差。 1.lpush key element [element ] 从表头插入元素 lpush nosql redis hbase lpush nosql mongdb2.lrange…

项目计划、进度与控制

思维导图 项目计划、进度与控制-思维导图 第一部分 项目管理概述 什么是项目 约瑟夫朱兰博士也说过,项目就是在已经确定好的时间内必须解决的问题 什么是项目管理 图1-1 项目管理就是工具、人和系统 image.png 组织是人的集合,过程是人在处理。如果人…

基于PaddleDetection fairmot目标跟踪 C++ 部署

1 源码下载 PaddleDetection 2 工程编译 参考:paddle 目标检测C部署流程 3 导出模型 python tools/export_model.py -c configs/mot/fairmot/fairmot_dla34_30e_576x320.yml --output_dir ./inference -o weightshttps://paddledet.bj.bcebos.com/models/mot/…

浅谈 Android Tombstone(墓碑日志)分析步骤 - 02

tomestone 日志: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: qti/trinket/trinket:11/RKQ1.211119.001/37:user/test-keys Revision: 0 ABI: arm Timestamp: 2023-06-19 23:47:310800 pid: 742, tid: 32482, name: CAM_M…

联想小新Pro16怎么重装Win10系统?联想小新Pro16重装系统Win10教程

如果您是联想小新Pro16的用户,并且想要重装Win10系统,那么您来对地方了,无论是出于系统崩溃、性能下降还是个人需求改变的原因,重新安装操作系统可以帮助您恢复电脑的正常运行和提升使用体验。以下小编将为您分享联想小新Pro16重装…

10 月发布,Ubuntu 23.10 已升级到 Linux Kernel 6.3 内核

导读Canonical 于近日宣布,代号为 Mantic Minotaur 的 Ubuntu 23.10 发行版本已升级基于 Linux Kernel 6.3 内核。 Canonical宣布,代号为 Mantic Minotaur 的 Ubuntu 23.10 发行版本已升级基于 Linux Kernel 6.3 内核。 Ubuntu 23.10 于今年 4 月下旬进入…

ISP之图像降分辨率

1、图像缩放背景 图像的放大、缩小(简称缩放)是图像处理的一种处理方法。所谓图像缩放是指图像分辨率的改变,它在图像显示、传输、图像分析以及动画制作、电影合成、甚至医学图像处理中都有着相当广泛的应用。比如要在1024 X 768 分辨率的显示器上全屏显示800 X 60…

Docker安全

一、Docker 容器与虚拟机的区别 1、隔离与共享 • 虚拟机通过添加 Hypervisor 层,虚拟出网卡、内存、CPU 等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核 • Docker容器则是通过隔离的方式,将文件系统、进程、设…