Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 , 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
Codis不支持的命令
Keys KEYS
MIGRATE
MOVE
OBJECT
RANDOMKEY
RENAME
RENAMENX
SCAN
Strings BITOP
MSETNX
Lists BLPOP
BRPOP
BRPOPLPUSH
Pub/Sub PSUBSCRIBE
PUBLISH
PUNSUBSCRIBE
SUBSCRIBE
UNSUBSCRIBE
Transactions DISCARD
EXEC
MULTI
UNWATCH
WATCH
Scripting SCRIPT
Server BGREWRITEAOF
BGSAVE
CLIENT
CONFIG
DBSIZE
DEBUG
FLUSHALL
FLUSHDB
LASTSAVE
LATENCY
MONITOR
PSYNC
REPLCONF
RESTORE
SAVE
SHUTDOWN
SLAVEOF
SLOWLOG
SYNC
TIME
Codis Slot SLOTSCHECK
SLOTSDEL
SLOTSINFO
SLOTSMGRTONE
SLOTSMGRTSLOT
SLOTSMGRTTAGONE
SLOTSMGRTTAGSLOT
这些命令是“半支持”。CODIS系统不支持跨节点的操作,所以你必须使用Hash tag,如果所有的key在一个请求显示到同一个槽然后可以使用这些命令。
Lists RPOPLPUSH
Sets SDIFF
SINTER
SINTERSTORE
SMOVE
SUNION
SUNIONSTORE
Sorted Sets ZINTERSTORE
ZUNIONSTORE
HyperLogLog PFMERGE
Scripting EVAL
EVALSHA
Codis版本
codis 1.9
● codis-server 基于 redis-2.8.13
● codis-proxy 对 pipeline 支持不友好
● codis-proxy 对 zk 强依赖
● 同步迁移性能差,不支持大 key 迁移
codis 2.0
● codis-server 基于 redis-2.8.21
● 重构了codis-proxy,性能大幅提升,对 pipeline 支持比较好
● codis-proxy 对 zk 强依赖
● 同步迁移性能差,不支持大key迁移
codis 3.x
● 最新 release 版本为 codis-3.2,codis-server 基于 redis-3.2.8
● 支持 slot 同步迁移、异步迁移和并发迁移,对 key 大小无任何限制,迁移性能大幅度提升
● 相比 2.0:重构了整个集群组件通信方式,codis-proxy 与 zookeeper 实现了解耦,废弃了codis-config 等
● 元数据存储支持 etcd/zookeeper/filesystem 等,可自行扩展支持新的存储,集群正常运行期间,即便元存储故障也不再影响 codis 集群,大大提升 codis-proxy 稳定性
● 对 codis-proxy 进行了大量性能优化,通过控制GC频率、减少对象创建、内存预分配、引入 cgo、jemalloc 等,使其吞吐还是延迟,都已达到 codis 项目中最佳
● proxy 实现 select 命令,支持多 DB
● proxy 支持读写分离、优先读同 IP/同 DC 下副本功能
● 基于 redis-sentinel 实现主备自动切换
● 实现动态 pipeline 缓存区(减少内存分配以及所引起的 GC 问题)
● proxy 支持通过 HTTP 请求实时获取 runtime metrics,便于监控、运维
● 支持通过 influxdb 和 statsd 采集 proxy metrics
● slot auto rebalance 算法从 2.0 的基于 max memory policy 变更成基于 group 下 slot 数量
● 提供了更加友好的 dashboard 和 fe 界面,新增了很多按钮、跳转链接、错误状态等,有利于快速发现、处理集群故障
● 新增 SLOTSSCAN 指令,便于获取集群各个 slot 下的所有 key
● codis-proxy 与 codis-dashbaord 支持 docker 部
Codis 3.x 由以下组件组成:
● Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
● Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
○ 对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
○ 不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
● Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
○ 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
○ 所有对集群的修改都必须通过 codis-dashboard 完成。
● Codis Admin:集群管理的命令行工具。
○ 可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
● Codis FE:集群管理界面。
○ 多个集群实例共享可以共享同一个前端展示页面;
○ 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
● Storage:为集群状态提供外部存储。
○ 提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
○ 目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。
下载与编译
下载release binary文件安装
如果是重要的生产环境使用,尽量不要选择alpha、rc版本。 根据自己的部署平台,选择相应的文件下载即可。
编译源码安装
1、安装 Go 运行环境 参考这里
安装完成后可以运行下列命令进行检测:
$ go version
go version go1.7.3 linux/amd64
2、 设置编译环境
注意 $GOPATH
是本机所有第三方库 go 项目所在目录,Codis 仅是其中之一。
添加 $GOPATH/bin
到 $PATH
,例如:
PATH=$PATH:$GOPATH/bin。
$ go env GOPATH
/home/codis/gopath
3、下载 Codis 源代码
Codis 源代码需要下载到
$GOPATH/src/github.com/CodisLabs/codis:
$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
4、编译 Codis 源代码
● 直接通过 make 进行编译,会看到如下输出:
$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
make -j -C extern/redis-3.2.8/
... ...
go build -i -o bin/codis-dashboard ./cmd/dashboard
go build -i -o bin/codis-proxy ./cmd/proxy
go build -i -o bin/codis-admin ./cmd/admin
go build -i -o bin/codis-fe ./cmd/fe
$ ls bin/
total 69124
drwxr-xr-x 4 codis codis 4096 Jan 4 14:55 assets
-rwxr-xr-x 1 codis codis 17600752 Jan 4 14:55 codis-admin
-rwxr-xr-x 1 codis codis 18416320 Jan 4 14:55 codis-dashboard
-rwxr-xr-x 1 codis codis 9498040 Jan 4 14:55 codis-fe
-rwxr-xr-x 1 codis codis 11057280 Jan 4 14:55 codis-proxy
-rwxr-xr-x 1 codis codis 4234432 Jan 4 14:55 codis-server
-rw-r--r-- 1 codis codis 148 Jan 4 14:55 version
... ...
$ cat bin/version
version = 2016-01-03 14:53:22 +0800 @51f06ae3b58a256a58f857f590430977638846a3
compile = 2016-01-04 15:00:17 +0800 by go version go1.5.2 linux/amd64
快速启动
2分钟快速构建一个单机版测试 codis 集群,无任何外部组件依赖.
源码中 admin 文件夹提供了一系列脚本以便快速启动、停止各个组件,提高运维效率。
启动codis-dashboard
使用 codis-dashboard-admin.sh 脚本启动 dashboar