用到的软件清单:
ps:zookeeper服务器这里直接使用已经搭建好的,没有具体的zookeeper搭建过程等
服务名称 | 服务器ip | 端口 |
---|---|---|
zookeeper | - | - |
zookeeper | - | - |
zookeeper | - | - |
proxy | 127.0.0.1 | 11080(admin)/19000 |
dashboard | 127.0.0.1 | 18080 |
redis (主) | 127.0.0.1 | 6501 |
redis (从) | 127.0.0.1 | 6502 |
fe | 127.0.0.1 | 8080 |
ha | 127.0.0.1 |
Codis Server:基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
Codis Proxy:客户端连接的Redis代理服务, 实现了Redis协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的Redis没有区别(就像Twemproxy)。
Codis Dashboard:集群管理工具,支持codis-proxy、codis-serve的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy的状态的一致性。
Codis Admin:集群管理的命令行工具。
Codis FE:集群管理界面。
Codis HA:为集群提供高可用。
Storage:为集群状态提供外部存储。
这里我是使用的现成的搭建好的zk集群,后面这里在进行信息补充
因为Codis是go语言写的,所以这些机器需要安装go环境。
cd /root/jiachang/go
wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
tar xvf go1.11.4.linux-amd64.tar.gz -C /usr/local
mkdir /usr/local/codis
设置GO的环境变量,编辑 /etc/profile文件
vim /etc/profile
##新增如下内容
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis
##在 PATH 变量后面增加如下内容
:$GOROOT/bin:$GOPATH/bin
应用环境变量
source /etc/profile
查看GO的版本
go version
go version go1.11.4 linux/amd64
Codis编译的时候需要用到godep,不然会报错的。
$ mkdir -p $GOPATH/src/github.com/tools
$ cd $GOPATH/src/github.com/tools
$ go get -u github.com/tools/godep
$ cd godep
## 会将godep执行程序生成到$GOPATH/bin下
$ go install ./
然后将$GOPATH/bin加到/etc/profile.主要是引用godep命令
## 在PATH的最后追加
:$GOPATH/bin
应用环境变量
source /etc/profile
查看godep效果
[root@localhost bin]# godep version
godep v80 (linux/amd64/go1.11.4)
[root@localhost bin]# which godep
/usr/local/codis/bin/godep
Codis 源代码需要下载到 $GOPATH/src/github.com/CodisLabs/codis:
$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.0
直接通过 make 进行编译
$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
make -j -C extern/redis-2.8.21/
.........
这里噼里啪啦的有一堆东西输出
编译完成看下Codis产生的文件
在bin文件夹内生成codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server六个可执行文件。另外, bin/assets文件夹是codis-dashboard http服务需要的前端资源, 需要和codis-dashboard放置在同一文件夹下。
修改环境变量文件PATH变量的值,并生效。
## PATH 后面追加
:/usr/local/codis/src/github.com/CodisLabs/codis/bin/
## 应用生效
source /etc/profile
$ mkdir -p /data/codis/sh
$ mkdir -p /data/codis/conf
$ mkdir -p /data/codis/log
$ mkdir -p /data/codis/run
$ mkdir -p /data/codis/redis/bin
$ mkdir -p /data/codis/redis/redis-6501
$ mkdir -p /data/codis/redis/redis-6502
这里其实Codis基于Redis改造的,要把他源码的这些redis-server这些命令拷过来,等我们在控制台敲 redis-server 的时候,其实是用它改写过的脚本。
$ cd /usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src/
$ cp ./{redis-benchmark,redis-cli,redis-sentinel,redis-server} /data/codis/redis/bin/
## 在PATH后面追加
:/data/codis/redis/bin
source /etc/profile
vim /data/codis/redis/redis-6501/redis.conf
vim /data/codis/redis/redis-6502/redis.conf
使用codis-server 启动
$ codis-server /data/codis/redis/redis-6502/redis.conf
$ codis-server /data/codis/redis/redis-6501/redis.conf
codis-dashboard --default-config | tee /data/codis/conf/dashboard.toml
/data/codis/conf/dashboard.toml
配置文件说明:
coordinator_name:外部存储类型,接受zookeeper/etcd,这里我们使用的zookeeper集群。
coordinator_addr:外部存储地址。
product_name:集群名称,满足正则\w[\w\.\-]*。
product_auth:集群密码,默认为空。
admin_addr:RESTful API端口。
nohup codis-dashboard --ncpu=2 --config=/data/codis/conf/dashboard.toml --log=/data/codis/log/dashboard.log --log-level=WARN &
参数解释:
–ncpu=N:最大使用CPU个数。
-c CONF, –config=CONF:指定启动配置文件。
-l FILE, –log=FILE:设置log输出文件。
–log-level=LEVEL:设置log输出等级:INFO,WARN,DEBUG,ERROR,默认INFO,推荐WARN。
PS:dashboard只需要在一个节点启动即可,启动时会向zookeeper注册信息(topom),如果有其他节点也启动dashboard时,向zookeeper注册信息发现里面有信息时,就会无法启动的。
$ codis-proxy --default-config | tee /data/codis/conf/proxy.toml
配置项说明
product_name:产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集。
product_auth:集群密码,默认为空。Codis 3.x支持AUTH,但是要求所有组件使用的AUTH必须完全相同。
admin_addr:RESTful API端口。
proto_type:Redis端口类型,接受tcp/tcp4/tcp6/unix/unixpacket。
proxy_addr:Proxy端口地址或者路径。
jodis_addr:Jodis注册zookeeper地址。
jodis_timeout:Jodis注册session timeout时间,单位second。
backend_ping_period:与codis-server探活周期,单位second,0表示禁止。
session_max_timeout:与client连接最大读超时,单位second,0表示禁止。
session_max_bufsize:与client连接读写缓冲区大小,单位byte。
session_max_pipeline:与client连接最大的pipeline大小。
session_keepalive_period:与client的tcp keepalive周期,仅tcp有效,0表示禁止。
nohup codis-proxy --ncpu=2 --config=/data/codis/conf/proxy.toml --log=/data/codis/log/proxy.log --log-level=WARN &
启动命令说明:
–ncpu=N:最大使用CPU个数。
-c CONF, –config=CONF:指定启动配置文件。
-l FILE, –log=FILE:设置log输出文件。
–log-level=LEVEL:设置log输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN。
–ulimit=NLIMIT:检查ulimit -n的结果,确保运行时最大文件描述不少于NLIMIT。
codis-proxy启动后,处于waiting状态,监听proxy_addr地址,但是不会accept连接,添加到集群并完成集群状态的同步,才能改变状态为online。添加的方法有以下两种:
// 11080是proxy的admin_addr
codis-admin --dashboard=dashboard_ip:18080 --create-proxy -x proxy_ip:11080
其中–dashboard需要指定codis-dashboard的管理地址,–create-proxy指定为和codis-proxy的admin_addr地址,。添加过程中,codis-dashboard会完成如下一系列动作:
1)获取proxy信息,对集群name以及auth进行验证,并将其信息写入到外部存储中;
2)同步slots状态;
3)标记proxy状态为online,此后proxy开始accept连接并开始提供服务;
codis-admin --dashboard-list --zookeeper=xxxx:2181 | tee /data/codis/conf/codis.json
拉取的配置信息如下:
cat /data/codis/conf/codis.json
注意启动codis-fe的时候,必须要使用codis-fe的全路径进行启动,因为codis-fe需要找到前端静态文件,也就是要找到
/usr/local/codis/src/github.com/CodisLabs/codis/bin/assets
目录。
nohup `which codis-fe` --ncpu=2 --log=/data/codis/log/fe.log --log-level=WARN --dashboard-list=/data/codis/conf/codis.json \
--listen=0.0.0.0:8080 &
web端监控的是8080端口,浏览器访问 http://ip:8080
就能看的页面了!
codis-ha --log=/data/codis/log/ha.log --log-level=WARN --interval=3 --dashboard=127.0.0.1:18080 &
默认以5s(–interval是调整时间间隔的)为周期,codis-ha会从codis-dashboard中拉取集群状态,并进行主从切换;
codis-ha在以下状态下会退出:
从codis-dashboard获取集群状态失败时;
向codis-dashboard发送主从切换指令失败时
页面添加
命令添加
codis-admin --dashboard=172.16.150.xx:18080 --create-group --gid=1
添加完成以后这里能看到server的主从关系等数据。
# 先添加主server
codis-admin --dashboard=ip:18080 --group-add --gid=1 --addr=主server ip:从server port
# 添加从server
codis-admin --dashboard=ip:18080 --sync-action --create --addr=从server的ip:从server的port
# slave提升为master
codis-admin --dashboard=ip:18080 --promote-server --gid=1 --addr=从server的ip:从server的port