likes
comments
collection
share

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?

作者站长头像
站长
· 阅读数 20

Codis 的整体架构和基本流程

  • 基本概念:codis和redis  cluster都是切片集群方案

  • codis架构

    • codis server:二次开发的Redis实例,增加额外的数据结构,支持数据迁移操作,处理数据的读写请求\

    • codis proxy:接收客户端请求,并把请求转发给 codis server  client与server间的代理\

    • Zookeeper:保存集群元数据(数据位置信息codis proxy信息)\

    • codis dashboard 和 codis fe:共同组成了集群管理工具\

      • codis dashboard 负责执行集群管理工作,包括增删 codis server、codis proxy 和进行数据迁移\

      • codis fe 负责提供 dashboard 的 Web 操作界面,便于我们直接在 Web 界面上进行集群管理\

  • Codis怎么处理请求\

    • 使用codis dashboard 设置 codis server 和 codis proxy 的访问地址,让proxy和server建立连接

    • 客户端负责进行网络请求的三方包 实现操作接口)直接和 codis proxy(是支持 Redis 的 RESP 交互协议,可以从单例切换到codis) 建立连接\

    • codis proxy 接收到请求,就会查询zookeeper请求数据和 codis server的映射关系,并把请求转发给相应的 codis server 进行处理\

    • 最后结果返回给proxy,proxy再返回客户端

  • 切片集群的关注点:

    • 数据分布
    • 集群扩容和数据迁移
    • 客户端兼容性
    • 可靠性保证

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?\

Codis 的关键技术原理

数据分布

  • 是通过逻辑槽slot完成映射

    • Codis 集群一共有 1024 个 Slot,编号依次是 0 到 1023

    • Slot 手动分配给 codis server,每个 server 上包含一部分 Slot(可以选择自动平均分配)\

    • 会使用 CRC32 算法计算数据 key 的哈希值(64位int),并把这个哈希值对 1024 取模(得到Slot的编号)\

    • 查询zookeeper根据slot获取server编号

  • 路由

    • Slot 和 codis server 的映射关系称为数据路由表(简称路由表)

    • 在 codis dashboard 上分配好路由表后,dashboard 会把路由表发送给 codis proxy,同时,dashboard 也会把路由表保存在 Zookeeper 中\

    • codis-proxy 会把路由表缓存在本地,当它接收到客户端请求后,直接查询本地的路由表,就可以完成正确的请求转发了\

  • Codis 和 Redis Cluster区别\

    • Codis 中的路由表是我们通过 codis dashboard 分配和修改的,并被保存在 Zookeeper 集群中

    • 修改的路由发送给proxy(负责转发的中间层)\

    • 在 Redis Cluster 中,数据路由表是通过每个实例相互间的通信传递的,最后会在每个实例上保存一份(没有中间层,需要依靠节点互相传递)\

    •  Redis Cluster会消耗较多的集群网络资源\

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?

集群扩容和数据迁移

  • 扩容的方向:增加 codis server 和增加 codis proxy

  • 增加 codis server\

    • 启动新的 codis server,将它加入集群\

    • 把部分数据迁移到新的 server\

  • 增加 codis proxy\

    • 当新增了 proxy 后,Zookeeper 上会有最新的访问列表\

    • 客户端也就可以从 Zookeeper 上读取 proxy 访问列表,把请求发送给新增的 proxy\

  • 数据迁移流程(渐进式的迁移)

    • 在源 server 上,Codis 从要迁移的 Slot 中随机选择一个数据,发送给目的 server
    • 源server接收到目标ack后,删除本地数据
    • 不断重复上面的迁移过程,直到要迁移的 Slot 中的数据全部迁移完成
  • 可选择迁移方式

    • 同步:在数据从源 server 发送给目的 server 的过程中,源 server 是阻塞的(有潜在的风险 ,无法处理新的请求操作\

    • 异步:当源 server 把数据发送给目的 server 后,就可以处理其他请求操作了,不用等到目的 server 的命令执行完,都到ack消息后,删除本地数据

      • 迁移过程中,数据只读,保证数据一致性

      • 对于 bigkey,异步迁移采用了拆分指令的方式进行迁移,避免大数据的迁移\

      • 如果迁移过程中失败,会破坏数据一致性,在目标server上设置了过期时间,迁移失败则过期删除

      • SLOTSMGRTTAGSLOT-ASYNC 批量迁移key的数量

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?

客户端兼容性

  • 使用 Redis 单实例时,客户端只要符合 RESP 协议,就可以和实例进行交互和读写数据
  • codis proxy 直接和客户端连接,codis proxy 是和单实例客户端兼容的(保证兼容性)\

可靠性保证

  • 组件越多,潜在的风险点也就越多

  • codis server\

    • 本质上还是Redis 实例

    • Redis 的主从复制机制和哨兵机制在 codis server 上都是可以使用的\

    • Codis 给每个 server 配置从库,并使用哨兵机制进行监控,当发生故障时,主从库可以进行切换,从而保证了 server 的可靠性\

  • Zookeeper\

    • 使用多个实例来保存数据
  • codis proxy\

    • 稳定性由Zookeeper保证
  • codis dashboard 和 codis fe 

    • 它们主要提供配置管理和管理员手工操作,负载压力不大,所以,它们的可靠性可以不用额外进行保证了\

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?\

集群扩容和数据迁移如何进行?

  • 从稳定性和成熟度来看,Codis 应用得比较早,在业界已经有了成熟的生产部署

  • 从业务应用客户端兼容性来看,连接单实例的客户端可以直接连接 codis proxy,而原本连接单实例的客户端要想连接 Redis Cluster 的话,就需要开发新功能\

  • Codis server 是基于开源的 Redis 3.2.8 开发的,所以,Codis 并不支持 Redis 后续的开源版本中的新增命令和数据类型,并且不支持部分命令\

  • 从数据迁移性能维度来看,Codis 能支持异步迁移,异步迁移对集群处理正常请求的性能影响要比使用同步迁移的小\

35 | Codis VS Redis Cluster:我该选择哪一个集群方案?\

总结

  • codis组成

    • codis server

    • codis proxy\

    • Zookeeper codis也支持etcd 或本地文件系统保存元数据信息\

    • codis dashboard 和 codis fe\

  • 可以使用多套codis隔离业务