读懂Redis Presharding

在解释Redis Presharding之前,先来说下sharding。Sharding,译为分片,有时也用partitioning(分区),这俩是同一个意思,说的是数据分散到Redis多个实例。

那presharding就是预分片的意思,这是Redis 3.0之前的概念。在Redis 3.0官方支持了Redis集群,在那之前,要想实现集群,用的是各种民间方法,如客户端侧的分片、代理等,典型的代表是Twitter的Twemproxy。同时,Redis作者也提出了一种集群方案,即为presharding。他戏称之为乞丐版的集群,正统的当然是之后的3.0集群方案啦。

如何分片,大家可能首先会想到如下的分片方案:Node = Hash(key) MOD N。hash是简单的,但rehash是很困难的,同时涉及到redis运行时key在不同实例间的迁移。

Redis Presharding不需要resharding,主要步骤如下:

0)在项目的开始阶段,在同一服务器上部署多个redis实例;

1)在扩容阶段,新增服务器,部署新的redis实例;

2)将新实例设为要迁移的旧实例的slave;

3)断开客户端;

4)更新配置:新实例的ip;

5)新实例执行slaveof no one,成为master;

6)重启客户端,使客户端使用新实例;

7)关闭旧实例。

作者提出这种方案,也是基于redis轻量的特点。因为redis代码量少,三方依赖少,因此内存占用相当少(1M+),故而可以在单机上部署相当多的实例。

使用presharding时,可以部署脚本来管理集群、增加监控、通过主从复制增强容错能力。

重点说明:

1)presharding前后,集群中的redis实例总数是不变的。正因为如此,避免了resharding,不存在key值从一个区转移到另一个分片区。

2)新增服务器上应部署多少个redis实例?

答:如果之前有1台服务器,加1台服务器,那么应迁移1/2的实例,以此类推。原则是每台服务器上实例数均衡。

3)presharding前后redis实例不变,那有什么意义?

答:集群的思想是用多台(可能性能相对差的)机器,得到高效的处理能力。随着业务的发展,单机上可能存储、CPU、内存不够用了,此时就需要增加机器,并进行实例的迁移,此时单机的实例数变少,单机的压力减小。因此,假设有N台机器,每台M个实例,随着业务的发展,N会逐渐增大,M逐渐减小,但N*M是保持不变的。

4)限制。该方案受限于初始设定的实例数,如果N*M个redis实例还满足不了需求,再增加机器就会出现resharding。作者建议初始单机部署32,64,128个redis实例,当然最终还是应该根据自己的业务实际情况和对未来的预估,或者直接升级redis版本唠。

参考资料:

1、(redis作者对presharding的详细说明)http://oldblog.antirez.com/post/redis-presharding.html

2、(官网关于分片的话题)https://redis.io/topics/partitioning

3、Redis Presharding

4、redis集群(Sharding)和在线扩容(Pre-Sharding)

5、(知乎小钢镚儿的回答)Redis集群方案应该怎么做?

你可能感兴趣的:(读懂Redis Presharding)