Redis学习之六 —— Codis

 

在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘。首先体现在内存上单个 Redis的内存不宜过大,内存太大会导致 rdb (快照)文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢复时也会消耗很长的数据加载时间。其次体现在 CPU 的利用率上,单个 Redis 实例只能利用单个核心,这单个核心要完成海量数据的存取和管理工作压力会非常大。

在这样大数据高并发的需求之下,Redis 集群方案应运而生。它可以将众多小内存的 Redis 实例综合起来,将分布在多个机器上的众多 CPU 核心的计算能力聚集起来,完成海量数据存储和高并发读写操作。

Codis 是 Redis 集群方案之一,是中国人开发并开源的来自前豌豆荚中间件团队。

Codis 使用 Go 语言开发,它是一个代理中间件,它和 Redis 一样也使用 Redis 协议对外提供服务,当客户端向 Codis 发送指令时,Codis 负责将指令转发到后面的 Redis 实例来执行,并将返回结果再转回给客户端。

Codis 分片原理

Codis 将所有的 key 默认划分为 1024 个槽位(slot),它首先对客户端传过来的 key 进行 crc32 运算计算哈希值,再将 hash 后的整数值对 1024 这个整数进行取模得到一个余数,这个余数就是对应 key 的槽位。

每个槽位都会唯一映射到后面的多个 Redis 实例之一,Codis 会在内存维护槽位和 Redis 实例的映射关系。这样就知道 key 应该到哪个 Redis实例了。

不同的 Codis 实例之间槽位关系如何同步?

Codis 使用 Zookeeper 存储槽位关系。

扩容

刚开始 Codis 后端只有一个 Redis 实例,1024 个槽位全部指向同一个 Redis。然后一个 Redis 实例内存不够了,所以又加了一个 Redis实例。这个时候需要对槽位关系进行调整,讲一半的槽位划分到新的节点。这意味着需要对这一半的槽位对应的所有key 进行迁移,迁移到新的 Redis 实例。

Codis 对 Redis进行了改造,增加了 SLOTSSCAN 指令,可以遍历指定 slot 下所有的key,然后挨个迁移每个 key 到新的 Redis 节点。

自动均衡

Redis 新增实例,Codis 提供了自动均衡功能。自动均衡会在系统比较空闲的时候观察每个 Redis 实例对应的 Slots 数量,如果不平衡,就会自动进行迁移。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值