设为首页 收藏本站
查看: 201|回复: 0

[经验分享] Codis3手册

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-15 08:24:14 | 显示全部楼层 |阅读模式
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架构
wKiom1bmfKLgo7sTAACMn_tLWkM285.jpg
3.     Codis3部署3.1.   物理架构图 QQ截图20160315082316.jpg
3.2.   部署角色3.2.1.     Codis-proxy172.16.54.135:19000
172.16.54.136:19000
3.2.2.     Codis-server172.16.54.135:7000、172.16.54.135:7001(主从)
172.16.54.136:7000、172.16.54.136:7001(主从)
3.2.3.     Codis-dashboard172.16.54.135:18080
3.2.4.     Codis-fe172.16.54.135:8082
3.3.   部署步骤3.3.1.     环境准备
  • 安装gcc

1
yum install –y gcc



  • 安装go

  解压到/usr/local下
  • 下载codis3源代码

1
2
备注:由于使用go get默认branch是master分支,而Codis3在release3.0分支,目前还不了解go get
下载指定branch,所以采用此方式





3.3.2.     编辑环境
  • 编辑profile文件

1
2
3
4
GOROOT=/usr/local/go
GOPATH=/usr/local/gopath
PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOROOT GOPATH MYCAT_HOME PATH



安装完成后可以运行下列命令进行检测:
1
2
3
4
$ go version
go version go1.5.2 linux/amd64
$ go env GOPATH
/usr/local/gopath



  • 安装 godep 工具

1
2
$ go get -u github.com/tools/godep &&which godep
/usr/local/gopath/bin/godep



  • 编译安装Codis

1
2
3
4
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编译
1
make MALLOC=libc



注意:此时可能需要翻墙去下载一些包

安装完成后验证:
1
2
3
4
5
6
7
8
9
10
$ 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




1
2
3
$ cat bin/version
version = unknown version
compile = 2016-03-11 16:52:58 +0800 by go versiongo1.5.2 linux/amd64




3.4.   启动Codis33.4.1.     启动Codis Dashboard
  • 生成dashboard.toml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ./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文件
1
2
product_name = "demo"
coordinator_addr = "172.16.54.135:2181"



3.启动dashboard
1
2
$ nohup ./bin/codis-proxy --ncpu=4--config=proxy.toml \
   --log=proxy.log --log-level=WARN &



3.4.2.     启动Codis Proxy
  • 生成proxy.toml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ ./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 = 60



2.修改proxy.toml文件
1
2
product_name = "demo"
jodis_addr = "172.16.54.135:2181"



3.启动Proxy
1
2
$ 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文件

1
2
3
4
5
6
7
$ ./bin/codis-admin --dashboard-list --zookeeper=172.16.54.135:2181| tee codis.json
[
    {
       "name": "demo",
       "dashboard": "172.16.54.135:18080"
    }
]



2.启动FE
1
2
$ 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(可选)
1
$ 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
QQ截图20160315082328.jpg
3.5.1.     添加proxy wKioL1bmfsnBMWy7AAAPofD8vqg537.jpg
wKiom1bmfj_i4dQqAAAO-ooksLc419.jpg

添加成功后:
wKioL1bmftiig-dHAABDugulbPY763.jpg
3.5.2.     新建group
wKioL1bmfumjareQAAARUvdXXjs879.jpg
wKiom1bmfl-RRdWFAAAWSfLy5ew572.jpg
3.5.3.     添加server
wKiom1bmfpiDXCz7AAATjVq1u1c608.jpg
wKioL1bmfyLh7lxFAAALSGnH-XY475.jpg
添加完成后,指定主从,7001为从,则需要点击下图按钮:
wKiom1bmfqrQrVEoAABVA0v9NxQ784.jpg
3.5.4.     初始化solts
wKioL1bmf0eRNpFFAAAa57nlreE175.jpg
wKioL1bmf1mx2GVkAAAazkYDee8953.jpg
迁移完后,如下图:
wKioL1bmf2aB3Ts7AABGm6HMTP4250.jpg
4.     Jodis客户端
  • Maven:

1
2
3
4
5
<dependency>
  <groupId>io.codis.jodis</groupId>
  <artifactId>jodis</artifactId>
  <version>0.3.0</version>
</dependency>



  • 代码:

1
2
3
4
5
6
7
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

1
2
#Set jodis address & session timeout.
jodis_addr= "172.16.54.135:2181"




具体可以参考:
https://github.com/CodisLabs/jodis/issues/10


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-190896-1-1.html 上篇帖子: 双向同步镜像软件Unison 下篇帖子: Linux之父炮轰C++:糟糕程序员垃圾语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表