0x01:分区的概念
分区就是将数据分割到多个Redis实例,因此每个实例只保存一部分key - value,每一个 Redis 实例的 key 的一个子集。
如果只使用一个 Redis 实例时,那么这个 Redis 实例保存了服务器中全部的缓存数据,这样会有很大风险,如果单台 Redis 服务宕机了将会影响到整个服务。解决方案可以采用分片 / 分区的技术,将原来一台服务器维护的整个缓存,换为由多台服务器共同维护内存空间。
0x02: 分片的实现
采用在一台主机上实现分片的方式,所以只需要在该主机上配置启动三台 Redis 的实例。因为 Redis 默认使用的端口号为6379,所以这里分别使用6379、6380以及6381三个端口来实现。
配置:
1、进入到 Redis 的安装目录下,创建一个 shard 文件夹,然后将 Redis 的配置文件 redis.conf 复制一份,取名为redis-6379.conf ( 作为6379这台实例的配置文件 )。然后将该文件移动到shard文件夹下,再将 redis-6379.conf 复制两份。
redis-6380.conf:作为6380这台实例的配置文件
redis-6381.conf:作为6381这台实例的配置文件
2、修改6379这台实例的配置文件redis-6379.conf,因为端口6379默认就是 Redis 的端口,所以只需要指定该实例的持久化片区(文件)即可。
3、修改6380实例的配置文件redis-6380.conf
修改该实例占用的端口为6380
修改pid
修改dump文件名
4、修改6381实例的配置文件redis-6381.conf
修改该实例占用的端口为6381
修改pid
修改dump文件名
redis-6380.conf 与 redis-6381.conf 配置步骤一样的,只是配置的值不一样。
0x03:启动与测试:
1、分别启动3台 Redis 实例
2、测试
Redis分区有两种方式,对既定的 key 有不同的方式来选择这个 key 存放到哪个实例中,也就是说有不同的算法来映射某个 key 到某个 Redis 的实例中。
最简单的分区方式为范围分区,就是映射一定范围的对象到特定的 Redis 实例。比如,ID 从0到10000的用户会保存到实例 R0,ID 从10001到 20000的用户会保存到 R1,以此类推。
另一种方式是 hash 一致算法实现分区,对 key 值进行 hash 一致性计算后得到结果,最终将数据保存到某一台 Redis 实例中。
测试方案一:基于 jedis jar
方法中定义了一个redis分片的连接池,分别添加用于测试的三个节点实例,然后向redis中增加10个记录。
通过 redis-cli 客户端分别连接到这三台 Redis 实例。结果发现10个记录中有1个分到了6379区,3个分到了6380区,另外6个分到了6381区,因为是采用记录的 key 值来进行 hash 一致性算法来确定记录的存放区域,所以即使重新分区都不会改变记录的存放地址,所以仍然可以根据 key 值来获取到对应的 value 值。
测试方案一:基于 Spring
配置文件redis.properties
RedisConfig配置类
分区的不足:
分区是多台 Redis 共同作用的,如果其中一台出现了宕机现象,则整个分片都将不能使用,虽然是在一定程度上缓减了内存的压力,但是没有实现高可用。
涉及多个 key 的操作通常是不被支持的。举例来说,当两个 set 映射到不同的Redis 实例上时,就不能对这两个set执行交集操作。
涉及多个 key 的 Redis事务不能使用。
当使用分区时,数据处理较为复杂,比如需要处理多个 rdb / aof 文件,并且从多个实例和主机备份持久化文件。
高可用的解决方案
哨兵主从复制实现高可用
集群模式
喜欢,在看
领取专属 10元无门槛券
私享最新 技术干货