Redis 运维实战 第03期:Codis

本文介绍了Redis的另一种集群解决方案——Codis,包括其架构、安装、分片、扩容以及与其它集群方案的对比。Codis通过ZooKeeper管理槽位关系,支持平滑扩容和读写分离,但依赖于外部组件且集群性能略低于单个Redis实例。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在前面,我们提到了 Redis 集群方案 Redis Cluster,今天我们来聊聊 Redis 另外一种比较受欢迎的集群方案:Codis。
Codis 是豌豆荚开源的 Redis 分布式中间件,使用 Go 语言开发,其拥有不停机数据迁移、对客户端透明、平滑扩容、拥有管理后台等特点。
下面我们从几个方向聊聊这一集群方案:

1 架构
首先,一起来看看 Codis 的架构图:
在这里插入图片描述

这里简单介绍各个组件的作用:
Codis Server:Codis 3.x 是由 Redis 3.2.8 分支开发而来,相对 Redis 3.2.8,其变化可以参考官方文档:Redis 修改部分。
Codis Proxy:客户端连接 Redis 的代理,需要注意的是,有部分命令不支持:不支持的命令列表。
Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除操作,以及数据迁移操作等。
Codis Admin:集群管理的命令行工具。
Codis FE:集群管理界面。
Storage:为集群状态提供外部存储。

2 安装
Codis 安装参考 Github 安装文档(https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md)。

3 Codis 分片
在讲解 Redis Cluster 时,我们知道其有 16384 个虚拟槽,而 Codis,也是使用类似的槽结构,它默认把所有的 key 分为 1024 个槽(这个槽是可以配置,可以设置成 2048 或者 4096 个),每一个槽位都对应了一个分组,具体槽位的分配,可以进行自定义。首先要对客户端写入的 key 进行 CRC32 运算,计算出哈希值,再除以 1024 取余,然后就能算出这个 key 属于哪个槽,然后根据槽与分组的映射关系,就能去对应的分组当中处理数据了。
那么不同的 Codis 实例之间槽位关系是如何同步的呢?
Codis 通常是由 ZooKeeper 来管理的,当槽位关系发生变化时,Codis Proxy 会监听到这些变化,然后重新同步槽位关系,从而保证多个 Codis Proxy 之间共享相同的槽位关系配置。

4 扩容
比如某个 Codis 集群下,只有一个 Codis Server 实例,那 1024 个 slot 全部指向同一个 Codis Server。当扩容到两个实例时,如果选择的是自动均衡,那么会有一半的 slot 迁移到新的节点上。
那么此时 Codis 怎样找到槽位对应的所有 key 呢?
Codis 通过 SLOTSSCAN 指令,可以扫描需要迁移 slot 下所有的 key,然后挨个迁移每个 key 到新的 Codis Server 节点上 。
在迁移过程中,Codis 如果接收到位于正在迁移槽位中的 key 后,会立即强制对当前的单个 key 进行迁移,迁移完成后,再将请求转发到新的 Codis Server 实例上。这也是 Codis 为什么可以平滑扩容的原因。

5 几种集群方案的对比
在笔者以往的工作经历中,使用最多的就是 Codis、Twemproxy、Redis cluster,这里就通过一个表格,对三种集群方案做一个对比,具体选择哪个,可自行评估。

集群方案
优点
缺点

在这里插入图片描述

Codis
平滑扩容
支持读写分离
拥有管理平台
多线程
Codis 集群整体性能比单个 Redis 性能有所下降
依赖 zk
跟不上官方高版本 Redis 的新功能
Twemproxy
分布式
不支持平滑扩容
运维难度大
单线程
Redis cluster
无Proxy,直连性能较高
支持平滑扩容
无中心架构
读写分离实现复杂
不支持 pipeline
维护成本高
客户端必须支持集群协议

6 与 Codis 相关的问题
6.1 Codis 可以当队列使用吗?
Codis 支持 LPUSH LPOP 指令,但是当使用队列时,对于单个 key,只能落在一台机器上。因此不管这个队列多大,性能只相当于单实例。因此建议将一个大队列拆分成多个小的队列,放在不同的 key 中。

6.2 Codis 支持多线程吗?
Codis Proxy 是多线程的,启动的线程数是 CPU 的核数。

欢迎加入 Redis 交流社群

群内不定期邀请一些身边的 Redis 大牛

交流分享,解答工作中遇到的的问题

分享工作经验、面试技巧等!加vx:yzlkf09

也欢迎各位大牛投稿,内容可以是数据库、开发、运维、产品、运营等!

悦专栏 LIKECOLUMN

在这里,学好编程

做更优秀的 IT人!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值