Codis3手册
2016-03-14 17:14
295 查看
Codis3手册
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 列表,配置文件可自动更新。
Codis HA:为集群提供高可用。
依赖 codis-dashboard 实例,自动抓取集群各个组件的状态;
会根据当前集群状态自动生成主从切换策略,并在需要时通过codis-dashboard 完成主从切换。
Storage:为集群状态提供外部存储。
提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
目前仅提供了 Zookeeper 和 Etcd 两种实现,但是提供了抽象的 interface 可自行扩展。
![](http://s2.51cto.com/wyfs02/M00/7D/59/wKiom1bmfKLgo7sTAACMn_tLWkM285.png)
![](http://s2.51cto.com/wyfs02/M01/7D/59/wKiom1bmfLrzlY2NAAKccX4UsS8699.gif)
172.16.54.136:19000
172.16.54.136:7000、172.16.54.136:7001(主从)
下载地址:http://golangtc.com/static/go/1.5.2/go1.5.2.linux-amd64.tar.gz 解压到/usr/local下下载codis3源代码
下载地址:https://github.com/CodisLabs/codis/archive/3.0.2.tar.gz
安装完成后验证:
![](http://s2.51cto.com/wyfs02/M01/7D/59/wKiom1bmfijymeKnAABPF93c6cs757.png)
![](http://s2.51cto.com/wyfs02/M01/7D/58/wKioL1bmfsnBMWy7AAAPofD8vqg537.png)
![](http://s2.51cto.com/wyfs02/M02/7D/59/wKiom1bmfj_i4dQqAAAO-ooksLc419.png)
添加成功后:
![](http://s3.51cto.com/wyfs02/M02/7D/58/wKioL1bmftiig-dHAABDugulbPY763.png)
![](http://s3.51cto.com/wyfs02/M00/7D/58/wKioL1bmfumjareQAAARUvdXXjs879.png)
![](http://s3.51cto.com/wyfs02/M02/7D/59/wKiom1bmfl-RRdWFAAAWSfLy5ew572.png)
![](http://s4.51cto.com/wyfs02/M01/7D/59/wKiom1bmfpiDXCz7AAATjVq1u1c608.png)
![](http://s4.51cto.com/wyfs02/M01/7D/58/wKioL1bmfyLh7lxFAAALSGnH-XY475.png)
添加完成后,指定主从,7001为从,则需要点击下图按钮:
![](http://s2.51cto.com/wyfs02/M02/7D/59/wKiom1bmfqrQrVEoAABVA0v9NxQ784.png)
![](http://s5.51cto.com/wyfs02/M02/7D/58/wKioL1bmf0eRNpFFAAAa57nlreE175.png)
![](http://s2.51cto.com/wyfs02/M00/7D/58/wKioL1bmf1mx2GVkAAAazkYDee8953.png)
迁移完后,如下图:
![](http://s3.51cto.com/wyfs02/M01/7D/58/wKioL1bmf2aB3Ts7AABGm6HMTP4250.png)
集群的稳定性会提升,proxy 不会再因为 session expired 导致进程自己退出;
外部存储 zookeeper/etcd 负载降低,无论是连接数还是数据读写操作,数据结构的组织也简单;
RPC 调用过程简单、直观,调试也容易;
要知道 Codis 2.x 的 RPC 都是通过读写 zookeeper/etcd 完成的,相对而言很复杂;
2. 对于 proxy 而言:稳定和可靠了
不再依赖外部存储,内部逻辑变得很简单,其他组件损坏也不会影响正常运行;
Codis 2.x 中,proxy 会自己向外部进行注册,拉取状态,并根据事件自主计算状态并决策;
Codis 3.x 中,所有对外部存储的访问以及状态决策都由 dashboard 负责,并通过状态机,主动同步到每个 proxy 去;
自分配的 ID 设计,集群部署变得容易了一些;
Codis 3.x 中,对 proxy 的操作都对ID 以及 NAME/AUTH 进行验证,误操作的可能性降低;
3. 对 dashboard 而言:变复杂了,但是比之前部署灵活和稳定(稳定待测)
对外部存储的访问,抽象出 CRUD/List 操作,目前仅实现了 zookeeper/etcd,但是扩展很容易;
Codis 2.x 中各个组件都严重依赖外部存储;
Codis 3.x 中仅 dashboard 依赖外部存储的实现,并且 dashboard 是随时可替换的,存在与否不影响服务本身;
在程序内增加了集群状态的缓存,降低存储的访问压力;
更多的检查,和错误处理;
不再提供管理页面,而将其抽出来作为 codis-fe 实现;
单个 codis-fe 监控多个集群,同时 codis-fe 作为反向代理,结合 nginx 部署更容易;
codis的proxy需要指定jodis
具体可以参考:
https://github.com/CodisLabs/jodis/issues/10
1. Codis3简介
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 CodisProxy 和连接原生的 RedisServer 没有显著区别 (不支持的命令列表),上层应用可以像使用单机的Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。Codis 3.x 由以下组件组成:Codis Server:基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 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 列表,配置文件可自动更新。
Codis HA:为集群提供高可用。
依赖 codis-dashboard 实例,自动抓取集群各个组件的状态;
会根据当前集群状态自动生成主从切换策略,并在需要时通过codis-dashboard 完成主从切换。
Storage:为集群状态提供外部存储。
提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
目前仅提供了 Zookeeper 和 Etcd 两种实现,但是提供了抽象的 interface 可自行扩展。
2. Codis3架构
![](http://s2.51cto.com/wyfs02/M00/7D/59/wKiom1bmfKLgo7sTAACMn_tLWkM285.png)
3. Codis3部署
3.1. 物理架构图
![](http://s2.51cto.com/wyfs02/M01/7D/59/wKiom1bmfLrzlY2NAAKccX4UsS8699.gif)
3.2. 部署角色
3.2.1. Codis-proxy
172.16.54.135:19000172.16.54.136:19000
3.2.2. Codis-server
172.16.54.135:7000、172.16.54.135:7001(主从)172.16.54.136:7000、172.16.54.136:7001(主从)
3.2.3. Codis-dashboard
172.16.54.135:180803.2.4. Codis-fe
172.16.54.135:80823.3. 部署步骤
3.3.1. 环境准备
安装gccyum install –y gcc安装go
下载地址:http://golangtc.com/static/go/1.5.2/go1.5.2.linux-amd64.tar.gz 解压到/usr/local下下载codis3源代码
下载地址:https://github.com/CodisLabs/codis/archive/3.0.2.tar.gz
备注:由于使用go get默认branch是master分支,而Codis3在release3.0分支,目前还不了解go get 下载指定branch,所以采用此方式
3.3.2. 编辑环境
编辑profile文件GOROOT=/usr/local/go GOPATH=/usr/local/gopath PATH=$PATH:$GOROOT/bin:$GOPATH/bin export GOROOT GOPATH MYCAT_HOME PATH安装完成后可以运行下列命令进行检测:
$ go version go version go1.5.2 linux/amd64 $ go env GOPATH /usr/local/gopath安装 godep 工具
$ go get -u github.com/tools/godep &&which godep /usr/local/gopath/bin/godep编译安装Codis
mkdir /usr/local/gopath/src/github.com/CodisLabs tar xf codis-3.0.2.tar.gz mv codis-3.0.2 /usr/local/gopath/src/github.com/CodisLabs/codis cd$GOPATH/src/github.com/CodisLabs/codis执行make编译
make MALLOC=libc注意:此时可能需要翻墙去下载一些包
安装完成后验证:
$ ll bin/ total 66908 drwxr-xr-x 4 root root 139 Mar 11 16:57 assets -rwxr-xr-x 1 root root 17601368 Mar 11 16:57codis-admin -rwxr-xr-x 1 root root 18416384 Mar 11 16:57codis-dashboard -rwxr-xr-x 1 root root 9498696 Mar 11 16:57 codis-fe -rwxr-xr-x 1 root root 9956728 Mar 11 16:57 codis-ha -rwxr-xr-x 1 root root 11060656 Mar 11 16:57codis-proxy -rwxr-xr-x 1 root root 1960969 Mar 11 16:52 codis-server -rw-r--r-- 1 root root 96 Mar 11 16:52 version
$ cat bin/version version = unknown version compile = 2016-03-11 16:52:58 +0800 by go versiongo1.5.2 linux/amd64
3.4. 启动Codis3
3.4.1. 启动Codis Dashboard
生成dashboard.toml文件$ ./bin/codis-dashboard --default-config | tee dashboard.toml ################################################## # # # Codis-Dashboard # # # ################################################## # Set Coordinator, only accept"zookeeper" & "etcd" coordinator_name = "zookeeper" coordinator_addr = "127.0.0.1:2181" # Set Codis Product {Name/Auth}. product_name = "codis-demo" product_auth = "" # Set bind address for admin(rpc),tcp only. admin_addr = "0.0.0.0:18080"2.修改dashboard.toml文件
product_name = "demo" coordinator_addr = "172.16.54.135:2181"3.启动dashboard
$ nohup ./bin/codis-dashboard --ncpu=4 --config=dashboard.toml \ --log=dashboard.log --log-level=WARN &
3.4.2. 启动Codis Proxy
生成proxy.toml文件$ ./bin/codis-proxy --default-config | tee proxy.toml ################################################## # # # Codis-Proxy # # # ################################################## # Set Codis Product {Name/Auth}. product_name = "codis-demo" product_auth = "" # Set bind address for admin(rpc),tcp only. admin_addr = "0.0.0.0:11080" # Set bind address for proxy,proto_type can be "tcp", "tcp4", "tcp6","unix" or "unixpacket". proto_type = "tcp4" proxy_addr = "0.0.0.0:19000" # Set jodis address & sessiontimeout. jodis_addr = "" jodis_timeout = 10 # Proxy will ping-pong backendredis periodly to keep-alive backend_ping_period = 5 # If there is no request fromclient for a long time, the connection will be droped. Set 0 to disable. session_max_timeout = 1800 # Buffer size for each clientconnection. session_max_bufsize = 131072 # Number of buffered requests foreach client connection. # Make sure this is higher thanthe max number of requests for each pipeline request, or your client may beblocked. session_max_pipeline = 1024 # Set period between keep alives.Set 0 to disable. session_keepalive_period = 602.修改proxy.toml文件
product_name = "demo" jodis_addr = "172.16.54.135:2181"3.启动Proxy
$ nohup ./bin/codis-proxy --ncpu=4--config=proxy.toml \ --log=proxy.log --log-level=WARN &
3.4.3. 启动Codis Server
与启动普通 redis 的方法一致,参考《codis简介以及安装指导手册》3.4.4. 启动Codis FE(可选,但强烈建议启动)
生成codis.json文件$ ./bin/codis-admin --dashboard-list --zookeeper=172.16.54.135:2181| tee codis.json [ { "name": "demo", "dashboard": "172.16.54.135:18080" } ]2.启动FE
$ nohup ./bin/codis-fe --ncpu=4 --log=fe.log--log-level=WARN \ --dashboard-list=codis.json --listen=172.16.54.135:8082 &
3.4.5. 启动Codis HA(可选)
$ nohup ./bin/codis-fe--log=ha.log --log-level=WARN --dashboard=172.16.54.135:18080 &
3.5. 利用FE添加proxy、server以及slot
访问浏览器 http://172.16.54.135:8082![](http://s2.51cto.com/wyfs02/M01/7D/59/wKiom1bmfijymeKnAABPF93c6cs757.png)
3.5.1. 添加proxy
![](http://s2.51cto.com/wyfs02/M01/7D/58/wKioL1bmfsnBMWy7AAAPofD8vqg537.png)
![](http://s2.51cto.com/wyfs02/M02/7D/59/wKiom1bmfj_i4dQqAAAO-ooksLc419.png)
添加成功后:
![](http://s3.51cto.com/wyfs02/M02/7D/58/wKioL1bmftiig-dHAABDugulbPY763.png)
3.5.2. 新建group
![](http://s3.51cto.com/wyfs02/M00/7D/58/wKioL1bmfumjareQAAARUvdXXjs879.png)
![](http://s3.51cto.com/wyfs02/M02/7D/59/wKiom1bmfl-RRdWFAAAWSfLy5ew572.png)
3.5.3. 添加server
![](http://s4.51cto.com/wyfs02/M01/7D/59/wKiom1bmfpiDXCz7AAATjVq1u1c608.png)
![](http://s4.51cto.com/wyfs02/M01/7D/58/wKioL1bmfyLh7lxFAAALSGnH-XY475.png)
添加完成后,指定主从,7001为从,则需要点击下图按钮:
![](http://s2.51cto.com/wyfs02/M02/7D/59/wKiom1bmfqrQrVEoAABVA0v9NxQ784.png)
3.5.4. 初始化solts
![](http://s5.51cto.com/wyfs02/M02/7D/58/wKioL1bmf0eRNpFFAAAa57nlreE175.png)
![](http://s2.51cto.com/wyfs02/M00/7D/58/wKioL1bmf1mx2GVkAAAazkYDee8953.png)
迁移完后,如下图:
![](http://s3.51cto.com/wyfs02/M01/7D/58/wKioL1bmf2aB3Ts7AABGm6HMTP4250.png)
4. Jodis客户端
Maven:<dependency> <groupId>io.codis.jodis</groupId> <artifactId>jodis</artifactId> <version>0.3.0</version> </dependency>代码:
JedisResourcePool jedisPool = RoundRobinJedisPool.create() .curatorClient("zkserver:2181", 30000).zkProxyDir("/zk/codis/db_xxx/proxy").build(); try(Jedis jedis = jedisPool.getResource()) { jedis.set("foo", "bar"); String value = jedis.get("foo"); System.out.println(value); }
5. 附录
5.1. Codis3与Codis2对比
1. RPC 不再依赖 zookeeper/etcd 而改为基于 HTTP 的 RESTful API 请求,这是最大的改动:集群的稳定性会提升,proxy 不会再因为 session expired 导致进程自己退出;
外部存储 zookeeper/etcd 负载降低,无论是连接数还是数据读写操作,数据结构的组织也简单;
RPC 调用过程简单、直观,调试也容易;
要知道 Codis 2.x 的 RPC 都是通过读写 zookeeper/etcd 完成的,相对而言很复杂;
2. 对于 proxy 而言:稳定和可靠了
不再依赖外部存储,内部逻辑变得很简单,其他组件损坏也不会影响正常运行;
Codis 2.x 中,proxy 会自己向外部进行注册,拉取状态,并根据事件自主计算状态并决策;
Codis 3.x 中,所有对外部存储的访问以及状态决策都由 dashboard 负责,并通过状态机,主动同步到每个 proxy 去;
自分配的 ID 设计,集群部署变得容易了一些;
Codis 3.x 中,对 proxy 的操作都对ID 以及 NAME/AUTH 进行验证,误操作的可能性降低;
3. 对 dashboard 而言:变复杂了,但是比之前部署灵活和稳定(稳定待测)
对外部存储的访问,抽象出 CRUD/List 操作,目前仅实现了 zookeeper/etcd,但是扩展很容易;
Codis 2.x 中各个组件都严重依赖外部存储;
Codis 3.x 中仅 dashboard 依赖外部存储的实现,并且 dashboard 是随时可替换的,存在与否不影响服务本身;
在程序内增加了集群状态的缓存,降低存储的访问压力;
更多的检查,和错误处理;
不再提供管理页面,而将其抽出来作为 codis-fe 实现;
单个 codis-fe 监控多个集群,同时 codis-fe 作为反向代理,结合 nginx 部署更容易;
2. codis-ha和dashboard部署几个实例
都是1个5.3. codis-ha原理
codis-ha的话,他只做一件事,定期给每个master发ping,发现有master挂了就把其中一个slave提升为master。其他事情都不管,比如如果有多个slave,其余slave不会自动和新的master同步5.4. jodis获取Proxy报错:Proxy list empty
codis 3.x 里面,proxy 注册目录换成了 /codis3/xxx/proxy/yyy,同时也会写入 /zk/codis/db_xxx/proxy/yyy 以兼容 jodis。codis的proxy需要指定jodis
#Set jodis address & session timeout. jodis_addr= "172.16.54.135:2181"
具体可以参考:
https://github.com/CodisLabs/jodis/issues/10
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- 在 AppImage、Flathub 和 Snapcraft 平台上搜索 Linux 应用
- 解决vc中unable to connect to the MKS:Internal error问题
- 杰奇一些安装详细说明文件,比官方更细
- 无线网卡安装DIY
- 网卡安装常见问题精解
- 春节长假安全手册
- DB2数据库的安装
- CentOS下DB2数据库安装过程详解
- 网吧组建完全手册
- ghost安装系统软件硬盘安装器 安装ghost图文教程
- CentOS 6.3下编译安装Ruby 2.0笔记
- FREEBSD安装POSTGRESQL笔记
- Redis总结笔记(一):安装和常用命令
- FreeBSD 6.2 安装全程图解教程
- 安装Apache和PHP的一些补充
- Lua在windows下的安装及环境配置
- PHP 5.3.0 安装分析心得
- 关于MSSQL 2005的安装与补丁
- sql2008安装教程 SQL Server 2008 R2 安装图解