Redis - 集群 - Codis

1、Codis是一种集群的实现方式,是使用Go语言开发的一个代理中间件,其上斜挂的的所有Redis事例构造一个Redis集群,当空间不足时,可以增加Redis事例,实现动态扩容

2、Codis分片原理:

它负责将特定的key转发到特定的Redis实例上,实现原理,首先将key进行crc32运算计算哈希值,再将hash后的值对1024取模得到余数,这个余数就是对应key的槽位,每个槽位会唯一映射到后面多个Redis实例之一,Codis会在内存上维护槽位和Redis的对一个关系,槽位的数量可以修改。

 

3、不同的Codis实例之间槽位关系同步原理:

Codis使用Zookeeper来分布式持久化槽位关系,并提供一个Dashboard来观察和修改槽位关系,当槽位关系变化时,Codis Proxy会监听变化并重新同步槽位关系,实现多个Codis Proxy之间共享相同的槽位的关系配置,如下图11

Redis - 集群 - Codis_第1张图片

4、扩容

如果Codis集群只有一台Rdis实例,1024个槽位都指向该Redis,如果现在想扩容,再增加一台实例,需要将一半的槽位划分到新的节点,对一半的Key进行迁移,意味着需要滴槽位关系进行调整。

1)找到需要迁移的key:Codis对Redis进行改造,增加了SLOTSSCAN指令,可以便利指定slot下的所有key,所有通过该命令扫描出待前一槽位的所有key,然后挨个迁移每个key到新的Redis节点

2)处理迁移过程中新增请求:

如果迁移过程中有请求发来,因为当前槽位的数据同事存在与新旧俩个槽位中,Codis无法判断迁移过程key在那个实例中,当Codis接收到位于正在迁移槽位中的key后,会立刻强制对当前的单个key进行迁移,迁移完成后,在将请求转发到新的Redis实例

5、自动平衡

Redis新增实例后,需要均衡槽位slots,Codis会在系统比较空闲的时候观察每个Redis实例对一个slots数量,如果不平衡。就会自动进行迁移

6、Codis的缺点

1)Codis不支持事务,事务只能在单个Redis中

2)rename操作也很危险,如果2个key不在同一个Redis实例中,rename无法正确完成

3)单个key不宜过大,因为集群的迁移的最小单位时key,队医一个hash结构,会一次性使用hgetall拉取所有内容,然后通过hmset放置到另一个节点,如果hash内部kv太多,迁移过程中有存在卡顿,官方建议单个集合结构的总字节容量不超过1M,

4)Codis增加了Proxy位中转层,网络开销要比单个Redis大

5)Codis的集群配置中心使用zk来实现,意味着在部署上增加了zk运维的代价

7、优点

Codis设计上比官方集群方案要简单很多,他将分布式的问题交给zk/etcd去负责

8、MGET指令操作过程

mget指令用来批量获取多个key的值,这些key会分布在多个Redis实例中,Codis的方式是将key按照所分配的实例打散分组,然后依次对那个实例调用mget方法,最后将结果汇总位一个,再返回客户端

你可能感兴趣的:(java基础,缓冲)