35 Codis VS Redis Cluster:我该

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再返回**客户端**
  • 切片集群的关注点:
+ 数据分布
+ 集群扩容和数据迁移
+ 客户端兼容性
+ 可靠性保证

\

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会消耗较多的集群网络资源\

集群扩容和数据迁移

  • 扩容的方向:增加 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的数量

客户端兼容性

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

可靠性保证

  • 组件越多,潜在的风险点也就越多
  • codis server\
+ 本质上还是Redis 实例
+ Redis 的主从复制机制和哨兵机制在 codis server 上都是可以使用的\
+ Codis 给每个 server 配置从库,并使用哨兵机制进行监控,当发生故障时,主从库可以进行切换,从而保证了 server 的可靠性\
  • Zookeeper\
+ 使用多个实例来保存数据
  • codis proxy\
+ 稳定性由Zookeeper保证
  • codis dashboard 和 codis fe
+ 它们主要提供配置管理和管理员手工操作,负载压力不大,所以,它们的可靠性可以不用额外进行保证了\

\

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

  • 从稳定性和成熟度来看,Codis 应用得比较早,在业界已经有了成熟的生产部署
  • 从业务应用客户端兼容性来看,连接单实例的客户端可以直接连接 codis proxy,而原本连接单实例的客户端要想连接 Redis Cluster 的话,就需要开发新功能\
  • Codis server 是基于开源的 Redis 3.2.8 开发的,所以,Codis 并不支持 Redis 后续的开源版本中的新增命令和数据类型,并且不支持部分命令\
  • 从数据迁移性能维度来看,Codis 能支持异步迁移,异步迁移对集群处理正常请求的性能影响要比使用同步迁移的小\

\

总结

  • codis组成
+ codis server
+ codis proxy\
+ Zookeeper codis也支持etcd 或本地文件系统保存元数据信息\
+ codis dashboard 和 codis fe\
  • 可以使用多套codis隔离业务

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%