前言:
codis 是一个分布式的redis解决方案,对于上层业务来说,连接到Codis Proxy和连接原生的Redis Server没有显著区别。上层可以像使用单机的redis一样使用。Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
codis是有golang + redis源码改造的一套强大的分布式redis解决方案。
redis cluster和codis的区别:
- redis-cluster需要redis3.0以上版本支持。codis则redis3.0以下版本支持。
- codis与redis-cluster支持的命令集不同,codis支持命令集相对来说少一些。比如事物、订阅/发布等等都不支持。
- redis-cluster有16384个槽,codis由1024 个 slot 分配到各个 group。
golang版本: go1.13.5 darwin/amd64
codis版本:codis 3.2
参考资料:
https://github.com/CodisLabs/...
不支持命令集
https://github.com/CodisLabs/...
(一)配置codis
1.1 Codis 3.x组件组成
Codis Server:
基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。
Codis Proxy:
客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外,表现的和原生的 Redis 没有区别(就像 Twemproxy)。
1)对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
2)不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
Codis Dashboard:
集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
1)对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
2)所有对集群的修改都必须通过 codis-dashboard 完成。
Codis Admin:
集群管理的命令行工具。可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
Codis FE:
集群管理界面。
1)多个集群实例共享可以共享同一个前端展示页面;
2)通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
Storage:
为集群状态提供外部存储。
1)提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
2)目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。
1.2 安装codis
下载 Codis 源代码
#mkdir -p $GOPATH/src/github.com/CodisLabs
#cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
编译 Codis 源代码
cd $GOPATH/src/github.com/CodisLabs/codis
make
启动服务
启动redis
#bin/codis-server config/redis.conf
启动哨兵
#bin/redis-sentinel config/sentinel.conf
启动codis-proxy
#admin/codis-proxy-admin.sh start
启动codis-server
#admin/codis-server-admin.sh start
启动codis-dashboard
#admin/codis-dashboard-admin.sh start
启动codis-fe
#admin/codis-fe-admin.sh start
启动完成后打开地址:
http://localhost:9090/#codis-demo
图中为为fe绑定端口代码。
(二)配置codis
访问:http://localhost:9090/#codis-demo
2.1 第一步添加Group和redis
group可以填写1 ~ 9999,Codis Server Address填写 ip:端口。
2.2 第二步添加Slots
2.3第三步添加proxy
proxy的admin绑定端口为11080、可以在config/proxy.toml 查看
admin_addr = "0.0.0.0:11080" #admin端口
proxy_addr = "0.0.0.0:19000" #proxy端口,用于redis-cli连接
2.4第四步添加哨兵
哨兵配置在config/sentinel.conf中。由于我只启动一个。
Dsashboard默认启动端口18080,在config/dashboard.toml配置中可以看到。
(三) 源码分析
3.1 目录结构预览
.
├── Godeps #工具管理包
├── admin #后台服务启动脚本
├── ansible #ansible自动化运维工具,可以实现快速部署
├── bin #执行文件目录
│ └── assets #codis-fe前端文件
├── cmd #脚本源码入口文件目录
│ ├── admin #codis-admin入口文件目录
│ ├── dashboard #codis-dashboard入口文件目录
│ ├── fe #codis-fe入口文件目录
│ ├── ha #codis-ha入口文件目录
│ └── proxy #codis-proxy入口文件目录
├── config #配置文件目录
├── deploy #部署配置目录,
├── doc #文档
├── example #示例目录,一个小例子
├── extern #修改版本的redis源代码
├── kubernetes #k8s管理目录
│ └── zookeeper #zk配置目录
├── log #日志文件
├── pkg #核心代码部门
├── scripts #运行脚本
└── vendor #管理工具外部支持包
3.2 codis-fe源码分析
添加server请求:
通过dlv下断点可以看到除了/list以外的其他地址连接走的都是代理。
代理的地址是192.168.1.105:18080,这个是Dashboard的地址。通过以上代码可以得知,为了解决前端兼容跨域请求问题,codis-fe添加了Dashboard的代理接口。
总结:
1.codis由1024 个 slot 分配到各个 group。
2.codis-fe为了兼容前端跨域请求,除了list列表,都添加了代理功能。
3.redis-cluster需要redis3.0以上版本支持。codis则redis3.0以下版本支持。
4.codis由: Codis Server、Codis Proxy、Codis Dashboard、Codis Admin、Codis FE、Storage等组件组成。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。