Redis 分片
Redis Sharding | Redis 分片
Partitioning( 分片)
分片
- 允许使用很多电脑的内存总和来支持更大的数据库。没有分片,你就被局限于单机能支持的内存容量。
- 允许伸缩计算能力到多核或多服务器,伸缩网络带宽到多服务器或多网络适配器。
分片的缺点
涉及多个键的操作通常不支持。例如,你不能对映射在两个不同
涉及多个键的事务不能使用。
分片的粒度
当使用了分片,数据处理变得更复杂,例如,你需要处理多个
添加和删除容量也很复杂。例如,
分片基础(Basic)
有很多不同的分片标准
Range Partitioning( 范围分片)
最简单的执行分片的方式之一是范围分片
Hash Partitioning( 哈希分片)
一种范围分片的替代方案是哈希分片
- 使用一个哈希函数
( 例如,crc32 哈希函数) 将键名转换为一个数字。例如,如果键是foobar ,crc32(foobar) 将会输出类似于93024922 的东西。 - 对这个数据进行取模运算,以将其转换为一个
0 到3 之间的数字,这样这个数字就可以映射到我的4 台Redis 实例之一。93024922 模4 等于2 ,所以我知道我的键foobar 应当存储到R2 实例。注意:取模操作返回除法操作的余数,在许多编程语言总实现为% 操作符。
分片实现
Client Side Partitioning
客户端分片
客户端分片的优势在于所有的逻辑都是可控的,不依赖于第三方分布式中间件。开发人员清楚怎么实现分片、路由的规则,不用担心踩坑。而缺点在于:
- 这是一种静态的分片方案,需要增加或者减少
Redis 实例的数量,需要手工调整分片的程序。 - 可运维性差,集群的数据出了任何问题都需要运维人员和开发人员一起合作,减缓了解决问题的速度,增加了跨部门沟通的成本。
- 在不同的客户端程序中,维护相同的分片逻辑成本巨大。例如,系统中有两套业务系统共用一套
Redis 集群,一套业务系统用Java 实现,另一套业务系统用PHP 实现。为了保证分片逻辑的一致性,在Java 客户端中实现的分片逻辑也需要在PHP 客户端实现一次。相同的逻辑在不同的系统中分别实现,这种设计本来就非常糟糕,而且需要耗费巨大的开发成本保证两套业务系统分片逻辑的一致性。
Proxy assisted partitioning: 代理协助分片
我们的客户端发送请求到一个可以理解
Query routing: 查询路由方式
查询路由意味着,你可以发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点。
图
如图
- 一个
Redis 实例具备了“数据存储”和“路由重定向”,完全去中心化的设计。这带来的好处是部署非常简单,直接部署Redis 就行,不像Codis 有那么多的组件和依赖。但带来的问题是很难对业务进行无痛的升级,如果哪天Redis 集群出了什么严重的Bug ,就只能回滚整个Redis 集群。 - 对协议进行了较大的修改,对应的
Redis 客户端也需要升级。升级Redis 客户端后谁能确保没有Bug ?而且对于线上已经大规模运行的业务,升级代码中的Redis 客户端也是一个很麻烦的事情。
综合上面所述的两个问题,