前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis之分片集群

redis之分片集群

作者头像
编程黑洞
发布2023-03-06 19:45:11
6270
发布2023-03-06 19:45:11
举报
文章被收录于专栏:编程黑洞编程黑洞

# 0. 前言

在海量的数据面前,单个 redis 实例的能力是有限的,无可能无限增大的内存,所以必须要构建分片集群,来横向拓展来支持保存更多的数据。

# 1. 分片集群是什么?

分片集群主要是将 redis 的数据划分成多份,每一份都由一个实例来保存,然后由多个实例来组成一个一个集群。

为什么使用分片集群而不是增加内存?

  • 在 RDB 进行持久化时,会 fork 子进程来完成,fork 操作会阻塞主线程的时长与数据量成正比。
  • 硬件成本,把内存从 32GB 扩展到 64GB 还算容易,但是,要想扩充到 1TB,成本太高。

# 2. 分片集群的组建

在 Redis Cluster 方案中,一个切片集群有 16384 个哈希槽,每个键值对的 key 会进行计算并对 16384 取模,分配到一个对应编号的哈希槽。

在使用 cluster create 命令创建集群时,会自动将 16384 个槽平均分配到集群实例中。也可以通过 cluster meet 命令手动建立实例间的连接形成集群,再使用 cluster addslots 命令指定每个实例上的哈希槽的个数。

在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作。

数据分配到哪个实例?

数据根据分配到哈希槽编号写入到对应的实例中。

# 3. 客户端如何读取分片集群

客户端从哪个实例中读取数据?

客户端与集群建立连接后,实例会将哈希槽的分配信息发送给客户端。客户端将哈希槽信息缓存在本地,当客户端操作键值对时,先计算得到对应的哈希槽,再发送请求到相应的实例。

但哈希槽与实例的映射关系并不是一成不变的,可能会发生变化:

  • 集群中,实例有新增或删除,redis 会重新分配哈希槽
  • 为了负载均衡,redis 会将哈希槽在所有实例中重新分布。

当映射关系变化时,客户端如何感知?

重定向机制。客户端发送数据给一个实例,但是并没有这个键值对的哈希槽信息,则实例会发送 MOVED 命令结果给客户端,包含新实例的访问地址。客户端更新本地缓存实例与哈希槽的映射关系,并向新实例发送请求。

代码语言:javascript
复制
GET hello:key
(error) MOVED 13320 172.16.19.5:6379

客户端请求的哈希槽 13320 在 172.16.19.5 这个实例上

如果访问的数据正在迁移的哈希槽,该如何访问数据?

Slot 2 正在从实例 2 往实例 3 迁移,key1 和 key2 已经迁移过去,key3 和 key4 还在实例 2。客户端向实例 2 请求 key2 后,就会收到实例 2 返回的 ASK 命令。

ASK 命令表示两层含义:第一,表明 Slot 数据还在迁移中;第二,ASK 命令把客户端所请求数据的最新实例地址返回给客户端,此时,客户端需要给实例 3 发送 ASKING 命令,然后再发送操作命令。

和 MOVED 命令不同,ASK 命令并不会更新客户端缓存的哈希槽分配信息。

ASK 命令的作用只是让客户端能给新实例发送一次请求,而不像 MOVED 命令那样,会更改本地缓存,让后续所有命令都发往新实例。

客户端为什么可以在任意一个实例获取所有的哈希槽信息?

redis 实例之间也会建立连接,分享自己的哈希槽信息。

# 4. 参考文章

  • 本文主要是学习《极客时间-redis 核心技术与实战》专栏总结而来
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 0. 前言
  • # 1. 分片集群是什么?
  • # 2. 分片集群的组建
  • # 3. 客户端如何读取分片集群
  • # 4. 参考文章
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档