Redis学习集群篇-----Codis

Redis中的Codis
Codis式redis集群方案,是一个代理中间件,和redis一样也使用Redis协议对外提供服务,接收到客户端指令然后转发给redis,是客户端和redis之间的中间代理
原理图
Codis是无状态的服务,每个节点都是对等的
1、Codis分片原理
在Codis中默认将所有的key划分为1024个槽位(solt),在Codis中会对客户端传过来的key进行特定运算找到key的槽位,每个槽位会唯一映射到后面的多个redis实例
计算公式:
hash = crc32(command.key)
slot_index = hash % 1024
redis = slots[slot_index].redis
redis.do(command)
槽位默认是1024,可以根据集群情况设置
2、不同的Codis实例之间槽位的同步
如果每个Codis节点中的槽位信息只保存在内存中,使用zookeeper进行持久化槽位,并提供Dashboard来观察和修改槽位之间的关系
槽位同步关系图
3、扩容
当codis的槽位只对应了一个Redis实例时,如果要进行新增redis实例,需要对槽位进行调整,需要将一半的槽位对应到新的Redis上,选哟对key进行迁移
如何找到槽位对应的key,Codis提供了SLOTSSCAN指令用于扫描出待迁移槽位的所有key然后进行迁移
如果是需要迁移的槽位有访问时,会立即进行迁移,然后让客户端去访问新的redis实例,单个key被迁移一次后就会从旧实例中彻底删除
4、自动均衡
Codis会在系统比较空闲的时候观察每个redis实例对应的slot数量,如果不平衡就会自动进行迁移
5、Codis的代价
由于Key分散在不同的Redis实例中,因此不支持事务,rename操作中的两个key不再一个Redis实例中也不能完成
由于会存在集群迁移,因此value不宜过大(不超过1MB),防止出现迁移卡顿
增加了proxy作为中间层,网络开销上要比单个Redis大
6、mget指令操作过程
mget用于批量获取多个key(可分布在多个redis实例中),codis的策略是将key按照所分配的实例打散分组,然后依次调用mget

猜你喜欢

转载自blog.csdn.net/alvin_666/article/details/89737671