了解预分区前最好先了解一下 ​​分区​​。

分区存在一个问题,除非我们使用 Redis 作为缓存,否则增加和删除节点都是件麻烦事,而使用固定的键和实例映射要简单得多。

然而,数据存储的需求可能一直在变化。今天可接受 10 个 Redis 节点,但明天可能就需 50 个节点。

因为 Redis 只有相当少的内存占用且轻量级(一个空闲的实例只使用 1MB 内存),为防止以后的扩容,最好的办法就是一开始就启动较多实例。即便只有一台服务器,也可以一开始就让Redis以分布式的方式运行,使用分区来运行多个 Redis 实例在一台服务器上。

开始就可以选择很多数量的实例。例如:32 或 64 个实例能满足大多数用户,并且为未来的增长提供足够的空间。

随着时间的推移,数据存储需求总会发生变化。今天可能需要10个Redis节点就够了,但是明天可能就需要增加到50个节点。为防止以后的扩容,最好的办法就是一开始就启动较多实例。

这样,当数据存储增长,需要更多 Redis 服务器,你要做的就是简单地将实例从一台服务器移动到另外一台(而不用考虑重新分区的问题)。当你新添加了第一台服务器,你就需要把一半的 Redis 实例从第一台服务器搬到第二台,以此类推。

简单的说就是为了实现在线动态扩容和数据分区,Redis 的作者提出了预分区的方案,实际上就是在同一台机器上部署多个 Redis 实例,当容量不够时将多个实例拆分到不同的机器上,这样就达到了扩容的效果。

使用 Redis 复制,就可以在很小或者根本不需要停机的时间内完成移动数据:

  1. 在新服务器上启动一个空实例
  2. 移动数据,配置新实例为源实例的从服务
  3. 停止客户端
  4. 更新被移动实例的服务器 IP 地址配置
  5. 向新服务器上的从节点发送 SLAVEOF NO ONE 命令
  6. 以新的更新配置启动你的客户端
  7. 最后关闭掉旧服务器上不再使用的实例

以上拆分流程是 Redis 作者提出的一个平滑迁移的过程,不过该拆分方法还是很依赖 Redis 本身的复制功能的。如果主库数据文件过大,复制的过程也会相应的变长,同时也会给主库带来压力。