Redis集群

  1. Redis 切片集群
  2. 1. 实际场景
  3. 2. 分片集群
    1. 2.1 如何处理数据在多实例之间的分布?
    2. 2.2 客户端如何确定想要访问的数据在哪个实例上?

Redis 切片集群

1. 实际场景

  • 用Redis保存5000万个键值对,每个键值对约为512B
  • 当我们选用32GB内存的主机来进行部署的时候,发现会很慢 (数据大小应当在25GB左右)
  • 这和Redis的持久化机制有关
    • 在使用RDB进行持久化的时候,Redis会fork子进程来完成,fork操作的用时和Redis的数据量是呈正相关的,fork在执行时会阻塞主线程
    • 数据量越大,fork操作造成的主线程阻塞的时间也会越长
    • 于是当使用RDB对25GB的数据进行持久化的时候,数据量比较大,后台运行的子进程在fork创建时阻塞了主线程,于是就导致Redis响应比较慢了

2. 分片集群

  • 指启动多个Redis实例组成一个集群,然后按照一定的规则,将收集到的数据划分成多份,每一份用一个实例来保存

    单实例 vs 集群

2.1 如何处理数据在多实例之间的分布?

实际上,切片集群是一种保存大量数据的通用机制,这个机制可以有不同的实现方案。在 Redis 3.0 之前,官方并没有针对切片集群提供具体的方案。从 3.0 开始,官方提供了一个名为 Redis Cluster 的方案,用于实现切片集群。Redis Cluster 方案中就规定了数据和实例的对应规则

  • Redis Cluster
    • 采用哈希槽 Hash Slot 来处理数据和实例之间的映射关系
    • 每个键值对都会根据它的key,被映射到一个哈希槽当中
  • 映射过程
    • 根据键值对的key,按照CRC16算法计算一个16bit的值
    • 再用这个16bit的值对16384取模,得到模数,每个数字都代表一个相应编号的哈希槽
  • 在创建Redis Cluster的方案的时候,在创建集群的时候Redis会自动将这些槽平均分布在集群实例上

2.2 客户端如何确定想要访问的数据在哪个实例上?

  • 定位键值对数据的时候,还是有两步

    • 关于所在哈希槽,是可以通过计算得到的,可以在客户端发送请求的时候执行
    • 进一步定位到实例,就需要知道哈希槽的分布了
  • 客户端如何定位数据?

    • 客户端和集群实例建立连接之后,实例就会将哈希槽的信息发给客户端
    • 当客户端收到了哈希槽的信息后,就会将哈希槽信息缓存在本地
    • 当客户端请求键值对的时候,会先计算键所对应的哈希槽,然后给相对应的实例发送请求
  • 实例和哈希槽对应关系的变更

    • Redis Cluster 重定向机制 — MOVED指令

      • 就是指,客户端给一个实例发送数据读写操作时,这个实例上并没有相应的数据,客户端要再给一个新实例发送操作命令。

      • 因为实例之间发生了数据的转移,而客户端这个时候还不知道,访问到了没有这个数据的实例

      • 因为实例是共享和哈希槽对应关系的信息表的,就可以返回给Client端正确的包含所需信息的实例的地址

      • client可以根据地址继续去访问

        MOVED 过程

  • ASK指令 — 访问到了正在迁移的实例

      GET hello:key
      (error) ASK 13320 172.16.19.5:6379
    • ASK表示客户端请求的键值对在13320这个哈希槽当中,在172.16.19.5这个实例上,但是这个哈希槽正在迁移
    • 客户端需要先给 172.16.19.5 这个实例发送一个 ASKING 命令。这个命令的意思是,让这个实例允许执行客户端接下来发送的命令。
    • 然后,客户端再向这个实例发送 GET 命令,以读取数据

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com

文章标题:Redis集群

文章字数:1k

本文作者:Leilei Chen

发布时间:2021-02-01, 20:36:06

最后更新:2021-02-01, 20:38:23

原始链接:https://www.llchen60.com/Redis%E9%9B%86%E7%BE%A4/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏