Redis-切片集群

扩容的思路

  • 纵向扩展 scale up: 一台8G的变成一台24G的
    👍 简单
    👎 受硬件条件的限制
    👎 单机容量大对性能的影响,如Redis的fork操作耗时是和内存数据量正相关的
  • 横向扩展 scale out: 一台8G的变成3台8G的
    👍 扩容灵活,不会增大单机的存储
    👎 机制复杂,包括如何片键分片,避免热片,如何保证通信连接,数据聚合等等

以下主要讲的是Redis Cluster即Redis集群横向扩展的方式。

数据在哪个实例上?

Redis把数据分成了16384个哈希槽(Slot),通过 CRC16(Key)%16384来获取数据应该放在哪个槽。而分片集群,就是把这些槽均匀分布在不同实例上。

例如,如果是有两个主节点的分片集群,那么主1存0-8191号slot,主2存8192-16383号slot;如果是4个主节点的分片集群,主1存0-4095,主2存4096-8191,主3存8192-12287,主4存12288-16383。

部署

集群模式部署的Redis实例如下:

Redis-切片集群

重定向

Redis主节点会互相知道各自存的slot映射关系,客户端也会缓存一份这个哈希槽的映射关系在本地,那么当一个命令(例如get)出现时,客户端可以自己计算键所对应的哈希槽号,然后直接向存该槽的数据节点发送命令。

但是这个映射关系会在1.集群变化,如扩缩容2.负载均衡优化,重新分布slot时,改变。如果客户端缓存的映射和实际的不一致,就要靠Redis提供的重定向机制来保证,假如客户端像实例1请求数据,实例1发现这个数据其实是在实例2上,就会回复客户端 MOVED 哈希槽号 实例2HOST。如果请求时,正在发生数据迁移,那么会回复一个 ASK 哈希槽号 实例2HOST给客户端,表明需要后续再确认。

无中心化

Redis Cluster采用的无中心化模式(无Proxy,客户端与数据节点直连,这和我们在Mongodb看到的Mongos不一样),所以就存在数据节点纠正客户端路由表的能力,和数据节点之间交换路由表的能力。使用哈希槽的方式是为了简化这个路由映射表,减少该表的存储空间,便于扩缩容,负载均衡,数据迁移等。

中心化方案

其他Redis集群化方案如Codis,Twemproxy都是中心化模式(增加Proxy层,像mongos一样的),让客户端操作Redis集群像操作一个Redis实例一样,增加Proxy也势必带来性能的损耗。

Original: https://www.cnblogs.com/rachel-aoao/p/Redis_cluster.html
Author: rachel_aoao
Title: Redis-切片集群

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601474/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何把 MySQL 备份验证性能提升 10 倍

    JuiceFS 非常适合用来做 MySQL 物理备份,具体使用参考我们的官方文档。最近有个客户在测试时反馈,备份验证的数据准备( xtrabackup –prepare)过程非常…

    数据库 2023年5月24日
    073
  • C/C++内存泄漏检测方法

    内存泄漏 检测代码 使用链表记录每个malloc返回的指针,释放时从链表中查找并删除找到对应指针的节点。 最终输出链表,该链表记录了所有没有释放的动态内存。 #include #i…

    数据库 2023年6月14日
    083
  • Nginx进阶篇—web模块及proxy代理

    server { #在server{下面输入 sub_filter n…

    数据库 2023年6月14日
    0108
  • Linux 的应用安装,升级和卸载和Linux下更换yum源的方法

    Linux 的应用安装,升级和卸载 yum [-y] install 软件包名 (1)yum…

    数据库 2023年6月16日
    079
  • python实现Mysql数据库批量新增数据

    一、批量插入数据的场景 二、插入数据的工具选择 三、选择Python进行批量插入 Python实现批量插入Mysql数据库数据 一、批量插入数据的场景 在进行数据压力时需要进行大数…

    数据库 2023年6月6日
    0106
  • MySQL完整版详解

    一、数据库的操作 1.创建数据库 如果您在可视化软件上创建数据库,请参阅下图 [En] If you create a database on a visualization so…

    数据库 2023年5月24日
    096
  • 写给所有程序员的对象的一封信

    因为本人有一枚可爱的老婆,她经常有很多奇怪的问题(我承认其实是我老想跟她分享),但是有些问题需要有一定的理论支撑,所以我就打算在这里一并告诉她。就是一些关于编程的前置知识的汇总,如…

    数据库 2023年6月14日
    077
  • 容器化|自建 MySQL 集群迁移到 Kubernetes

    如果你有自建的 MySQL 集群,并且已经感受到了云原生的春风拂面,想将数据迁移到 Kubernetes 上,那么这篇文章可以给你一些思路。 文中将自建 MySQL 集群数据,在线…

    数据库 2023年6月11日
    080
  • Azkaban快速入门

    因为之前自己工作中有用过Azkaban作为自动化任务调度工具,所以想参考自己之前的使用经验,总结一下关于Azkaban的使用,方便大家使用Azkaban快速实现企业级自动化任务 如…

    数据库 2023年6月11日
    097
  • 啥是Session?

    什么是 Session 会话? 1、Session 就一个接口(HttpSession)。2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。3、每个客…

    数据库 2023年6月11日
    079
  • MySQL实战45讲 16

    16 | “order by”是怎么工作的? 以公民表为例,假设您想要查询所有城市为“杭州”的人的姓名,并根据他们的名字返回前1000人的姓名和年龄。 [E…

    数据库 2023年5月24日
    080
  • Golang context

    Context Go 语言中提供了 context 包,通过显示传递 context, 实现请求级别的元数据、取消信号、终止信号的传递。context 包提供了从现有的上下文值(c…

    数据库 2023年6月16日
    089
  • 【MySQL】MySQL的安装、卸载、配置、登陆和退出

    1 MySQL安装 安装环境:Win10 64位软件版本:MySQL 5.7.24 解压版 1.1 下载 https://downloads.mysql.com/archives/…

    数据库 2023年5月24日
    093
  • python_numpy数组入门

    NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。 在 NumPy中,每一个线性的数组称为是一个轴(axis…

    数据库 2023年6月11日
    089
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年6月14日
    0109
  • java如何获取一个文本文件的编码(格式)信息呢?

    文本文件是我们在windows平台下常用的一种文件格式, 这种格式会随着操作系统的语言不同,而出现其默认的编码不同 那么如何使用程序获取”文本文件”的编码方…

    数据库 2023年6月11日
    0167
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球