codis简介
Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的数据迁移等工 作,所有后边的一切事情,对于前面客户端来说是透明的,可以简单的认为后边连接是一个内存无限大的Redis服务。
codis由四部分组成:
codis proxy(codis-proxy) codis dashboard(codis-config)
codis redis(codis-server) zookeeper/etcd
codis-proxy是客户端连接的redis代理服务,codis-proxy本身实现 了redis协议,表现得和一个原生的redis没什么区别(就像twemproxy),对于一个业务来说,可以部署多个codis- proxy,codis-proxy本身是无状态的。
codis-config是codis的管理工具,支持包括:添加/删除redis节点,添加/删除proxy节点,发起数据迁移等操作。codis-config本身还自带了一个http-server,会启动一个dashboard,用户可以直接在浏览器上观察codis集群的运行状态。
codis-server是codis项目维护的一个redis分支,基于redis2.8.21开发,加入了slot的支持和原子的数据迁移指令。codis上层的codis-proxy和codis-config只能和这个版本的redis交互才能正常运行。
codis依赖zookeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过zookeeper同步到各个存活的codis-proxy。
codis支持按照namespace区分不同的产品,拥有不同的product name的产品,各项配置都不会冲突。
codis架构图如下:
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 可自行扩展。
实验准备
codis集群的搭建,需要zookeeper集群。除了zookeeper集群之外,我们还需要安装go语言环境,因为codis是基于go语言开发的。
实验环境(rhel7.3):
172.25.81.1 Codis-proxy server1
172.25.81.2 Codis-redis-master server2
172.25.81.3 Codis-redis-slave server3
1. 安装go环境(所有节点均须安装,在server1上做演示,其他节点相同)
[root@server1 ~]# tar zxf go1.12.linux-amd64.tar.gz -C /usr/local/
[root@server1 ~]# vim /etc/profile
export GOPATH=/usr/local/codis
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin[root@server1 ~]# source /etc/profile
[root@server1 ~]# go version ##显示go版本信息
2、设置编译环境
[kiosk@foundation81 Downloads]$ wget https://codeload.github.com/CodisLabs/codis/zip/release3.2 ##下载codis源码包
在$GOPATH 目录里建立 codis 编译目录,将下载后的codis解压到此目录
[root@server1 ~]# mkdir -p $GOPATH/src/github.com/CodisLabs
[root@server1 ~]# ls
go1.12.linux-amd64.tar.gz release3.2
jdk-7u79-linux-x64.tar.gz zookeeper-3.4.6.tar.gz[root@server1 ~]# unzip release3.2
[root@server1 ~]# mv codis-release3.2 $GOPATH/src/github.com/CodisLabs/codis
[root@server1 ~]# cd $GOPATH/src/github.com/CodisLabs/codis
3、编译 Codis 源码
在编译之前需要安装依赖包
[root@server1 codis]# yum install -y gcc git autoconf ##安装编译需要的依赖包
[root@server1 codis]# make MALLOC=libc
编译结果:
3.配置集群
Codis 源 码 编 译 完 成 后 , 组 件 的 启 动 脚 本 在$GOPATH/src/github.com/CodisLabs/codis/admin目录下。配置文件在
GOPATH/src/github.com/CodisLabs/codis/config 目录下。日志在$GOPATH/src/github.com/CodisLabs/codis/log 目录下。
(1)进行集群配置
codis-proxy 配置
<1>安装JDK
[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz
[root@server1 ~]# mv jdk1.7.0_79/ /usr/local/
[root@server1 local]# ln -s jdk1.7.0_79 java
[root@server1 local]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin[root@server1 local]# source /etc/profile
<2>安装zookeeper
[root@server1 ~]# tar zxf zookeeper-3.4.12.tar.gz -C /usr/local/
[root@server1 ~]# vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.12/
export PATH=$PATH:$ZOOKEEPER_HOME/bin[root@server1 ~]# source /etc/profile
<3>配置zookeeper,修改配置文件:
[root@server1 ~]# cp /usr/local/zookeeper-3.4.12/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.12/conf/zoo.cfg
[root@server1 ~]# vim /usr/local/zookeeper-3.4.12/conf/zoo.cfg
dataDir=/data/zookeeper/data
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
[root@server1 ~]# mkdir -p /data/zookeeper/data
设置myid:
设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件配置的srver.X中的X为什么数字,则myid文件就输入这个数字,这里只有一台zk,所以配置文件里可以不配置server.X,但还是要配置myid的,echo一个数字1进去即可。如果有多台zk,则分别在zk服务器上echo对应的数字进对应的myid文件
[root@server1 ~]# echo "1" > /data/zookeeper/data/myid
启动zookeeper:
因为环境变量里已经添加了路径,直接执行命令即可,执行zkServer.sh start后,要等一会再执行zkServer status:
[root@server1 ~]# zkServer.sh start
[root@server1 ~]# zkServer.sh status
在哪个目录下启动,就在哪个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。由于单个zookeeper,所以这里指示Mode: standalone,如果有多个zk节点,就只有一个Mode: leader的状态,别的都是Mode: follower状态。
[root@server1 ~]# vim /usr/local/codis/config.ini
zk=localhost:2181 ##zookeeper的地址,
如果是zookeeper集群,可以写成: zk=hostname1:2181,hostname2:2181,hostname3:2181,hostname4:2181,hostname5:2181,
如果是etcd,则写http://hostname1:port,http://hostname2:port,http://hostname3:port
product=test ##产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集
proxy_id=proxy_1 proxy会读取, 用于标记proxy的名字, 针对多个proxy的情况, 可以使用不同的config.ini, 只需要更改 proxy_id 即可
net_timeout=5 ##检测状态时间间隔
dashboard_addr=localhost:18087 dashboard 服务的地址,CLI 的所有命令都依赖于 dashboard 的 RESTful API,所以必须启动
coordinator=zookeeper ##如果用etcd,则将zookeeper替换为etcd
<3>启动各个组件
[root@server1 ~]# zkServer.sh start ##启动zookeeper
[root@server1 ~]# cd $GOPATH/src/github.com/CodisLabs/codis
[root@server1 codis]# ./admin/codis-dashboard-admin.sh start ##启动CodisDashboard组件
查 看日志文件看是否启动成功:$GOPATH/src/github.com/CodisLabs/codis/log/codis-dashboard.log.2019-03-04
[root@server1 codis]# ./admin/codis-proxy-admin.sh start ##启动CodisProxy组件
查看日志看是否启动成功:$GOPATH/src/github.com/CodisLabs/codis/log/codis-proxy.log.2019-03-04
[root@server1 codis]# ./admin/codis-server-admin.sh start ##启动 Codis Server 组件
查看日志看是否启动成功:/tmp/redis_6379.log
[root@server1 codis]# ./admin/codis-fe-admin.sh start
查看日志看是否启动成功:$GOPATH/src/github.com/CodisLabs/codis/log/codis-fe.log.2019-03-04
server2与server3配置:(以server3为例)
<1>安装go环境
<2>安装并编译 Codis 源码
<3>修改redis配置文件
[root@server3 ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis/config
[root@server3 config]# vim redis.conf
61 bind 0.0.0.0
84 port 6379
128 daemonize yes
[root@server3 ~]# cd /usr/local/codis/src/github.com/CodisLabs/codis
[root@server3 codis]# ./admin/codis-server-admin.sh start
查看日志看是否启动成功:
测试:
通过web浏览器访问集群管理页面(fe地址:172.25.81.1:9090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加 NEW GROUP
,NEW GROUP
行输入 1,再点击 NEW GROUP
即可 添加 Codis Server,Add Server
行输入我们刚刚启动的 codis-server 地址,添加到我们刚新建的 Group,然后再点击 Add Server
按钮加入相应的codis-server(server2,server3),如下图所示
通过fe初始化slot
新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而初始化最快的方法可通过 fe 提供的 rebalance all slots
按钮来做,如下图所示,点击此按钮,我们即快速完成了一个集群的搭建。