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隔离业务
转载自:https://juejin.cn/post/7033952057392365604