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

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方法,最后将结果汇总位一个,再返回客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CodisRedis Cluster 是两种不同的分布式架构方案,它们在客户端的使用上有一些区别: 1. **连接方式**: Codis 通过代理层来提供分片和高可用的功能,客户端需要连接到 Codis 代理层,并通过代理层来操作数据。而 Redis Cluster 是原生的 Redis 分布式方案,客户端可以直接连接到 Redis Cluster 的任意节点,并通过集群内部自动进行数据路由和分片。 2. **命令支持**: Codis 是基于 Redis 的协议实现的代理层,大部分 Redis 命令在 Codis 中都得到了支持。但是由于 Codis 引入了额外的代理层,某些 Redis 命令可能会有一些限制或行为上的差异。而 Redis Cluster 是原生的 Redis 实现,支持完整的 Redis 命令集。 3. **数据路由**: Codis 使用槽(slot)分片方式来将数据分散到不同的后端 Redis 节点上。这意味着在 Codis 中,客户端发送的命令会被转发到相应的后端节点上执行。而 Redis Cluster 使用哈希槽(hash slot)分片方式,将数据根据哈希值映射到不同的槽位,每个槽位对应一个 Redis 节点。客户端发送的命令会被自动路由到正确的节点上。 4. **容错和高可用性**: CodisRedis Cluster 都提供了容错和高可用性的机制。Codis 通过代理层的高可用性来保证服务的可用性,可以通过配置多个代理实例来实现容错和负载均衡。Redis Cluster 则通过在集群中的节点之间进行数据复制和故障转移来提供高可用性。 总的来说,CodisRedis Cluster 在客户端的使用上有一些细微的差别,主要体现在连接方式、命令支持和数据路由等方面。了解这些区别可以帮助你在选择和使用适合自己业务需求的分布式方案时做出明智的决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值