Codis VS Redis Cluster

2021/02/24 posted in  实践

Redis 切片集群使用多个实例保存数据,能够很好地应对大数据使用场景。而Codis 也是一种提供切片集群的解决方案

Codis 整体架构和基本流程

Codis 包含四个组件

  • codis server : 进行二次开发的Redis实例,增加了额外的数据结构,支持数据迁移操作,主要负责具体的读写请求
  • codis proxy : 接受客户端请求并吧请求转发到codis server
  • Zookeeper 集群 : 保存集群元数据
  • codis dashboard 和codis fe : 集群管理工具



基本流程

  1. 先使用codis dashboard 设置 codis server 和codis proxy 访问地址,设置完成后codis server 和codis proxy 才会接受访问
  2. 客户端直接和codis proxy 连接
  3. codis proxy 接受到请求后,查询请求数据和codis server 映射关系,并把请求转发给相应的codis server



Codis 关键技术原理

数据如何在集群中分布

Codis 数据如何分布式通过逻辑槽映射完成的

  1. Codis 一共有1024个Slot ,编号依次是0到1023,把1024个逻辑槽 手动或者是自动分配给codis server
  2. 读取数据时,根据CRC32算法计算数据key的哈希值,并把Hash值对1024取模,取模的值就是Slot编号,然后根据之情的映射到codis server



Slot 和 codis server的映射关系称为数据路由表,路由表会缓存在本地同时保存在zookeeper 中

数据分布Codis 和 Redis Cluster 区别

  1. Codis 中的路由表是通过 codis dashboard 分配和修改的,并保存在Zookeeper中,如果修改会重新发送给codis proxy
  2. Redis Cluster 中数据路由表是通过实例间相互通信传递的,最后在每个实例上都会保存一份

集群扩容和数据迁移

Codis 集群扩容

Codis 扩容包含codis proxy 和 codis server 增加

  1. codis server 增加
    1. 启动新的codis server ,将他加入集群
    2. 把数据迁移到新的server


数据迁移流程

Codis 按照数据Slot粒度进行迁移

  1. 在源server上,Codis 从要迁移的Slot上随机选择一个数据,发送给目的server
  2. 目的确认收到消息后,会给源server返回确认消息。源server删除刚迁移的数据
  3. 不断重复 步骤1 和步骤2 知道所有Slot 迁移完成

同步迁移和异步迁移:区别在迁移过程中源server是否阻塞;异步迁移bigkey 采用拆分指令的方式进行迁移




切片集群方案