Redis系列复习笔记--Reids集群

Redis系列复习笔记–Reids集群

系列文章目录

第五章 Redis系列复习笔记–持久化
第七章 Redis系列复习笔记–Reids集群


七、Redis集群(数据分片)

7.1 数据分布

分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。需要重点关注的是数据分区规则。常见的分区规则有哈希分区和顺序分区两种。

分区方式特点
哈希分区离散性好,数据分布业务无关。无法顺序访问。
顺序分区离散度易倾斜,数据分布业务相关。可顺序访问。

由于Redis Cluster采用哈希分区规则,这里我们重点讨论哈希分区,常见的哈希分区规则有几种。

7.1.1 节点取余分区

使用特定的数据,如Redis的键或用户ID,再根据节点数量N使用公式:hash(key)%N计算出哈希值,用来决定数据映射到哪一个节点上。这种方案存在一个问题:当节点数量变化时,如扩容或收缩节点,数据节点映射关系需要重新计算,会导致数据的重新迁移。这种方式的突出优点是简单性,常用于数据库的分库分表规则,一般采用预分区的方式,提前根据数据量规划好分区数,保证可支撑未来一段时间的数据量。

7.1.2 一致性哈希分区

一致性哈希分区(Distributed Hash Table)实现思路是为系统中每个节点分配一个token,范围一般在0~2^32,这些token构成一个哈希环。数据读写执行节点查找操作时,先根据key计算hash值,然后顺时针找到第一个大于等于该哈希值的token节点。
这种方式相比节点取余最大的好处在于加入和删除节点只影响哈希环中相邻的节点,对其他节点无影响。但加减节点会造成哈希环中部分数据无法命中。同时,普通的一致性哈希分区在增减节点时需要增加一倍或减去一半节点才能保证数据和负载的均衡。

7.1.3 虚拟槽

虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有数据映射到一个固定范围的整数集合中,整数定义为槽(slot)。这个范围一般远远大于节点数,比如Redis Cluster槽范围是0~16383。槽是集群内数据管理和迁移的基本单位。采用大范围槽的主要目的是为了方便数据拆分和集群扩展。每个节点会负责一定数量的槽。
虚拟槽解耦了数据和节点之间的关系,简化了节点扩容和收缩难度。不过其也有一些限制,比如:批量操作mset、mget等只支持具有相同槽;key作为最小槽粒度不能拆分hash、list等;事务操作不支持跨节点。另外,Redis Cluster不支持多数据库空间。单机下的Redis可以支持16个数据库,集群模式下只能使用一个数据库空间,即db0。
数据和虚拟槽和节点的关联关系如下图所示。
63.png
问题:为什么Redis Cluster的Hash Slot 是 2^14=16384 而不是2^16?
这是为了在心跳包中包含槽信息,16k槽位使用2k大小,而65k槽位要使用8k大小,对放入心跳包而言太过分。另外,由于其它设计权衡,Redis Cluster不太可能扩展到超过 1000 个主节点,16k个槽位足够满足分布的节点数了。可以参考git上的解答:https://github.com/redis/redis/issues/2576

7.2 热点key

Redis Cluster的虚拟槽设计很好的拜托了业务依赖,同时能使key较均匀地分散在各节点上。但是对于热点key的高并发请求则依然会使单节点压力增大,出现类似hash倾斜的现象。这是不可避免的,当然可以使热点key倾斜到性能更优的节点或在加一层hash使多个热点key分散开来。

7.3 无底洞优化问题

Redis Cluster是不是节点越多越好,每个节点只需要负责较少的key却承受着较大的并发压力呢?答案肯定是否定的。节点的增加会极大的增加网络IO开销,尤其是涉及到批量命令时,一条命令要查找多个节点,对网络带宽的要求变高。
所以这里还要一个点需要注意,Redis Cluster其实并不适合使用发布/订阅功能,尤其是节点数量多的情况下。这是因为publish命令都会向所有节点(包括从节点)进行广播,严重消耗带宽。

参考文献

1、书籍《Redis开发与运维》
2、redis文档:https://redis.io/docs/latest/develop/
3、redisson文档:https://github.com/redisson/redisson/wiki/Table-of-Content
4、jedis文档:https://redis.io/docs/connect/clients/java/
5、https://pdai.tech/md/db/nosql-redis/db-redis-overview.html
6、https://xiaolincoding.com/redis/base/redis_interview.html#lru-%E7%AE%97%E6%B3%95%E5%92%8C-lfu-%E7%AE%97%E6%B3%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB
7、其它

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值