前言:

codis 是一个分布式的redis解决方案,对于上层业务来说,连接到Codis Proxy和连接原生的Redis Server没有显著区别。上层可以像使用单机的redis一样使用。Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
codis是有golang + redis源码改造的一套强大的分布式redis解决方案。
redis cluster和codis的区别:

  1. redis-cluster需要redis3.0以上版本支持。codis则redis3.0以下版本支持。
  2. codis与redis-cluster支持的命令集不同,codis支持命令集相对来说少一些。比如事物、订阅/发布等等都不支持。
  3. 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组件组成

1.png

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

2.png

启动服务

启动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

3.png
图中为为fe绑定端口代码。

(二)配置codis

访问:http://localhost:9090/#codis-demo

2.1 第一步添加Group和redis

4.png

group可以填写1 ~ 9999,Codis Server Address填写 ip:端口。

2.2 第二步添加Slots

5.png

2.3第三步添加proxy

6.png
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第四步添加哨兵

7.png
哨兵配置在config/sentinel.conf中。由于我只启动一个。
8.png

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请求:
9.png

10.png

通过dlv下断点可以看到除了/list以外的其他地址连接走的都是代理。
11.png
代理的地址是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等组件组成。


c_rain
23 声望8 粉丝