95.什么是 Redis 分区?
? 关于如下四个问题,直接看 《Redis 分区》 文章。
- Redis 分区是什么?
- 分区的优势?
- 分区的不足?
- 分区类型?
可能有胖友会懵逼,又是 Redis 主从复制,又是 Redis 分区,又是 Redis 集群。傻傻分不清啊!
Redis 分区是一种模式,将数据分区到不同的 Redis 节点上,而 Redis 集群的 Redis Cluster、Twemproxy、Codis、客户端分片( 不包括 Redis Sentinel ) 这四种方案,是 Redis 分区的具体实现。
注意,Redis Sentinel 实现的是 Redis 的高可用,一定要分清楚。实际上,胖友可以对比 MySQL 和 MongoDB 的高可用、集群的方案,发现思路都是一致的。
Redis 每个分区,如果想要实现高可用,需要使用到 Redis 主从复制。
? 你知道有哪些 Redis 分区实现方案?
Redis 分区方案,主要分成两种类型:
- 客户端分区,就是在客户端就已经决定数据会被存储到哪个 Redis 节点或者从哪个 Redis 节点读取。大多数客户端已经实现了客户端分区。
- 案例:Redis Cluster 和客户端分区。
- 代理分区,意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些 Redis 实例,然后根据 Redis 的响应结果返回给客户端。
- 案例:Twemproxy 和 Codis 。
查询路由(Query routing)的意思,是客户端随机地请求任意一个 Redis 实例,然后由 Redis 将请求转发给正确的 Redis 节点。Redis Cluster 实现了一种混合形式的查询路由,但并不是直接将请求从一个Redis 节点转发到另一个 Redis 节点,而是在客户端的帮助下直接 Redirect 到正确的 Redis 节点。
Redis Cluster 的重定向,可以认真看看 《Redis 开发与运维》 的「10.5 集群 - 请求路由」章节。
? 分布式 Redis 是前期做还是后期规模上来了再做好?为什么??
如下是网络上的一个答案:
既然 Redis 是如此的轻量,为防止以后的扩容,最好的办法就是一开始就启动较多实例。即便你只有一台服务器,你也可以一开始就让 Redis 以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。
一开始就多设置几个 Redis 实例,例如 32 或者 64 个实例,对大多数用户来说这操作起来可能比较麻烦,但是从长久来看做这点牺牲是值得的。
这样的话,当你的数据不断增长,需要更多的 Redis 服务器时,你需要做的就是仅仅将 Redis 实例从一台服务迁移到另外一台服务器而已(而不用考虑重新分区的问题)。一旦你添加了另一台服务器,你需要将你一半的 Redis 实例从第一台机器迁移到第二台机器。
- 和飞哥沟通了下,这个操作不是很合理。
- 无论怎么说,建议,需要搭建下 Redis Sentinel 高可用,至于拓展性,根据自己的情况,是否使用 Redis Cluster 集群。同时, Redis Cluster 集群会有运维的复杂性,同时会存在跨分片操作(例如说 mget 等等)、事务等操作是不支持的。