分布式缓存的切片模式-hash一致性切片

一 为什么使用缓存

当前,我们通常使用Redis缓存,因为它有更多的数据类型,并且支持事物。之所以要使用缓存,是为了缓解查询数据库时的IO压力,我们将经常查的热点数据放到缓存里(内存中),当然比存在磁盘上的mysql数据库快了。

二 为什么使用分布式

那为什么要使用分布式架构呢?第一就是解决一台redis服务器容量不一定够啊,那无限扩容不行吗?当然不行,难道每次容量不够了就换一台容量更大的redis服务器?另外如果押宝在一台缓存数据库上,如果它坏了,岂不是gg?综上所述,分布式缓存就来啦

三 使用什么模式

部署分布式架构时有很多模式,这里主要介绍两种:主从复制模式,切片模式。
所谓主从复制模式/主从备份模式,很简单,例如设置一个主库,两个从库,进行写操作时对主库进行操作,主库自动同步,进行读操作时从从库读。想必大家可以看出来,这样很费容量,无法起到缓解内存大小压力的作用。
另一种模式就是切片模式,什么是切片模式,很简单,每一个数据用hash算法算完后对库数取模,放到对应的库中,这样每一个库都可以得到使用,即便挂了一个库也不会完全停摆。

四 常规切片模式的弊端

我们在开发一个项目时,扩展性是我们考虑的重点,部署数据库时也是一样。对于我们的项目,考虑到热点数据量可能超过我们当前的几个缓存数据库的总容量是有可能发生的,我们必然要增加更多数据库,但是按照切片模式的规则,一旦增加一个数据库,每个数据库保存的数据都可能要进行迁移,如果数据量过大,这一瞬间产生的数据移动就够系统喝一壶了,更别说redis数据库还是单线程的,如果大量被占用处理这件事,其他操作必然会遭到滞后。

五 更加犀利的切片模式-hash一致性切片

在这里插入图片描述
使用hash一致性算法,例如这个圆环上一共2^32个节点,我们将对数据库的ip和序号进行hash,放到这些节点中的一个里,当有数据时对数据进行hash,也放到某个节点,如上图
椭圆的是数据库,圆形的是数据,我们将当前数据库前那一部分数据放进当前数据库,如图中颜色标记,当我们增加一个数据库Redis3,如下图:
在这里插入图片描述我们不再需要移动所有数据,而只是将原本应该放进Redis1中的两个标红数据放进Redis3,完美!!!但是,真的完美吗?

六 不完美的数据倾斜以及解决方案

6.1 数据倾斜

我们看到在第一幅图中,大部分数据被放进Redis1,少部分数据被放入Redis2中,不均匀了,这会导致每个数据库不能充分利用,旱的旱死,涝的涝死,这就是数据倾斜。

6.2 解决办法

解决办法很简单,给每个数据库创建n个副本,如下图:
在这里插入图片描述这里需要注意,虽然创建多个副本,但并不意味着数据库数量增加了,只是逻辑上数据被这两个数据库均匀的瓜分了。

猜你喜欢

转载自blog.csdn.net/weixin_44062399/article/details/124257711
今日推荐