codis3.0.2安装部署使用
一、安装说明
Codis 由四部分组成:
1、Codis Proxy (codis-proxy) 是客户端连接的 Redis 代理服务
2、Codis Manager (codis-config) 是 Codis 的管理工具, 支持包括, 添加/删除 Redis 节点, 添加/删除 Proxy 节点, 发起数据迁移等
3、Codis Redis (codis-server) 是 Codis 项目维护的一个 Redis 分支, 基于 2.8.13 开发, 加入了 slot 的支持和原子的数据迁移指令
4、ZooKeeper 同步到各个存活的 codis-proxy
二、安装步骤及配置
1、安装go
wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
tar -C /usr/local/ -zxvf go1.6.linux-amd64.tar.gz
设置环境变量
# vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export PATH=$PATH:/gopath/bin
# source /etc/profile
# go version
go version go1.6 linux/amd64
2、安装zookeeper
本次测试因环境服务器不够,所以选择zk部署为单实例,生产环境务必保持>=3台的奇数台机器,建议5台
wget https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar zxvf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 /usr/local/zookeeper
mkdir -p /usr/local/zookeeper/logs
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg 修改配置文件
修改 dataDir
dataDir=/usr/local/zookeeper/data
并增加 日志
dataLogDir=/usr/local/zookeeper/logs
启动 zookeeper
/usr/local/zookeeper/bin/zkServer.sh start
3、安装codis 3.0.2
cd /usr/local
mkdir codis
go get -u -d github.com/CodisLabs/codis
# 执行上面如果报错:package github.com/wandoulabs/codis: cannot download, $GOPATH not set. For more details see: go help gopath,那要检查你的环境变量设置是否正确
# imports github.com/wandoulabs/codis: no buildable Go source files in/usr/local/codis/src/github.com/wandoulabs/codis 可无视
cd $GOPATH/src/github.com/CodisLabs/codis/
make
make gotest
会在bin下生成codis-config、codis-proxy、codis-server三个可执行文件
# ll bin/
total 39832
drwxr-xr-x 4 root root 4096 Mar 8 16:49 assets
-rwxr-xr-x 1 root root 17319392 Mar 8 16:49 codis-config
-rwxr-xr-x 1 root root 17145512 Mar 8 16:48 codis-proxy
-rwxr-xr-x 1 root root 6312973 Mar 8 16:50 codis-server
编辑配置文件
# cd $GOPATH/src/github.com/CodisLabs/codis/
# vi config.ini
zk=192.168.85.44:2181
dashboard_addr=192.168.85.44:18087
4、启动 dashboard
执行bin/codis-config dashboard 将会看到一个页面
cd /usr/local/codis/src/github.com/CodisLabs/codis
bin/codis-config dashboard
访问https://192.168.85.44:18087/admin/
后台启动
# bin/codis-config dashboard &
5、初始化 slots 该命令会在zookeeper上创建slot相关信息
cd /usr/local/codis/src/github.com/CodisLabs/codis/
bin/codis-config slot init
执行成功,都会返回:
{
"msg": "OK",
"ret": 0
}
6、启动 Codis Redis
这里redis没有使用codis集成的,而是单独使用的redis2.8版本,配置的主从
7、添加 Redis Server Group
每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, group id 仅支持大于等于1的整数
添加group_1,group的id为1
bin/codis-config server add 1 192.168.85.44:6379 master
bin/codis-config server add 1 192.168.85.45:6379 slave
添加group_2,group的id为2
bin/codis-config server add 2 192.168.85.44:6479 master
bin/codis-config server add 2 192.168.85.45:6480 slave
执行成功,都会返回:
{
"msg": "OK",
"ret": 0
}
8、设置 server group 服务的 slot 范围
设置编号为[0, 511]的 slot 由 server group 1 提供服务, 编号 [512, 1023] 的 slot 由 server group 2 提供服务
注,设置之前,要先初始化,上面第五步是初始化slot
bin/codis-config slot range-set 0 511 1 online
bin/codis-config slot range-set 512 1023 2 online
# bin/codis-config slot range-set 0 511 1 online
{
"msg": "OK",
"ret": 0
}
# ./bin/codis-config slot range-set 512 1023 2 online
{
"msg": "OK",
"ret": 0
}
9、启动codis-proxy
# ./bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=1 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000
_____ ____ ____/ / (_) _____
/ ___/ / __ \ / __ / / / / ___/
/ /__ / /_/ / / /_/ / / / (__ )
\___/ \____/ \__,_/ /_/ /____/
如果是刚启动的 codis-proxy 是处于 offline状态的, 要设置 proxy 为 online 状态, 只有处于 online 状态的 proxy 才会对外提供服务
# bin/codis-config -c config.ini proxy online <proxy_name> <---- proxy的id, 如 proxy_1
10、测试分片及负载
# redis-cli –h 127.0.0.1 -p 19000
127.0.0.1:19000> set a 1
OK
127.0.0.1:19000> set b 2
OK
127.0.0.1:19000> set c 3
OK
127.0.0.1:19000> set d 4
OK
127.0.0.1:19000> set f 5
OK
127.0.0.1:19000> set g 6
OK
127.0.0.1:19000> set h 7
OK
127.0.0.1:19000> set i 8
OK
127.0.0.1:19000> set j 9
OK
127.0.0.1:19000> set k 10
OK
打开管理系统https://192.168.85.44:18087/admin 刷新一下,可以看到数据全部写到group_2
使用脚本批量插入一些数据
然后看下管理系统的OP/S
以观察一下两个group,可以看到现在两边数据都进行了存储
11、关于启动codis-ha
go get github.com/ngaut/codis-ha
cd codis-ha
go build
codis-ha --codis-config=localhost:18087 --productName=test
此步骤未验证,暂时记录一下!可能是我网络问题,导致一直下载不了codis-ha
下载地址:https://github.com/ngaut/codis-ha
不过,关于codis高可用,也可以尝试使用keepalived,配置codis的高可用
三、FAQ
1、启动dashboard失败
./bin/codis-config dashboard
2016/03/10 09:39:14 dashboard.go:160: [INFO] dashboard listening on addr: :18087
2016/03/10 09:39:15 dashboard.go:234: [PANIC] create zk node failed
[error]: dashboard already exists: {"addr": "192.168.85.44:18087", "pid": 21121}
[stack]:
3 /usr/local/codis/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard.go:234
main.runDashboard
2 /usr/local/codis/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard.go:54
main.cmdDashboard
1 /usr/local/codis/src/github.com/CodisLabs/codis/cmd/cconfig/main.go:85
main.runCommand
0 /usr/local/codis/src/github.com/CodisLabs/codis/cmd/cconfig/main.go:152
main.main
... ...
解决办法:
zk: node already exists
无论是proxy还是dashboard,都会在zk上注册自己的节点,同时在程序正常退出的时候会删掉对应的节点,但如果异常退出或试用kill -9 {pid}就会导致zk的节点无法删除,在下一次启动的时候会报“zk: node already exists”的错误。
因此关闭服务的时候直接用kill {pid}不要-9,同时如果无法启动并且确认没有其他运行中的进程占用zk上的节点,可以在zk上手动删除/zk/codis/db_test/dashboard 或/zk/codis/db_test/fence/{host:port}.
# ./zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTED) 0] ls /zk/codis/db_test
[migrate_tasks, actions, LOCK, ActionResponse, slots, fence, proxy, servers, dashboard]
[zk: 127.0.0.1:2181(CONNECTED) 1] rmr /zk/codis/db_test/dashboard
[zk: 127.0.0.1:2181(CONNECTED) 4] quit 退出
2、zk:node does not exist
2016/03/10 13:05:44 server_group.go:182: [INFO] {offline 1 192.168.85.45:6379}
2016/03/10 13:21:52 dashboard_apis.go:464: [ERROR] set slot range [0,1023] failed
[error]: zk: node does not exist
2 /usr/local/codis/src/github.com/CodisLabs/codis/pkg/models/slot.go:85
github.com/CodisLabs/codis/pkg/models.GetSlot
1 /usr/local/codis/src/github.com/CodisLabs/codis/pkg/models/slot.go:146
github.com/CodisLabs/codis/pkg/models.SetSlotRange
0 /usr/local/codis/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard_apis.go:462
main.apiSlotRangeSet
... ...
[stack]:
0 /usr/local/codis/src/github.com/CodisLabs/codis/cmd/cconfig/dashboard_apis.go:464
main.apiSlotRangeSet
... ...
解决办法:
删除清空zk所有数据,重新开始(现网请慎重操作)
或者重新配置zk,这个原因与第一个类同
3、从Codis 2.x 升级至Codis 3.x
Codis 3.x 修改了 codis-dashboard 与 codis-proxy 之间的通信方式,因此 Codis 2.x 并不兼容。但是官方提供了手动升级方案。
注意1:升级时,需要保证所有 slot 都处在 online 状态。即没有任何数据迁移操作正在进行。
注意2:升级完成后,需要手动关闭 Codis 2.x 的所有 proxy 和 config 组件。
step 1. 导出配置文件
$ ./bin/codis-admin --config-dump --product=codis_v2.0 --zookeeper=127.0.0.1:2181 -1 | tee codis_v2.0.json
该命令会从 zookeeper 上拉取 /zk/codis/db_codis_v2.0 下全部的文件,并组织成 json 格式并输出。
选项 -1 表示配置文件是 Codis 1.x 版本,缺省是 Codis 3.x 版本。
step 2. 转换配置文件
$ ./bin/codis-admin --config-convert codis_v2.0.json | tee codis_v3.0.json
该命令会将 Codis 1.x 版本的配置文件中有效信息提取出来,并转成 Codis 3.x 版本的配置文件并输出。
step 3. 更新配置文件
注意:更新配置文件时,请确保 Codis 3.x 中该集群不存在,否则可能导致更新失败或者集群状态异常。
$ ./bin/codis-admin --config-restore=codis_v3.0.json --product=codis_v3.0 --zookeeper=127.0.0.1:2181 --confirm
该命令会将 Codis 3.x 版本的配置文件提交到 /codis3/codis_v3.0 目录下。
选项 --confirm 选项表示确认提交,缺省时该命令仅仅打印配置文件作为调试。
step 4. 启动 Codis 3.x dashboard 以及 proxy
过程参考之前章节。因为集群信息已经存在,所以可以安全启动 codis-dashboard,并逐一添加 codis-proxy 到集群中。
step 5. 关闭 Codis 2.x dashboard 以及 proxy
Codis 3.x 的组件兼容 Jodis 协议。
因为 Codis 2.x 与 Codis 3.x 在外部存储中的组织结构不同,所以可以安全的 kill 掉全部 Codis 2.x 组件。
注意:关闭过程请不要使用 kill -9,因为旧组件在退出时会自动清理部分注册信息。
4、参考地址
https://github.com/CodisLabs/codis
https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md
https://www.cenhq.com/2015/09/15/codis-cluster-structures/
源码下载地址:https://github.com/CodisLabs/codis/archive/3.0.2.tar.gz
评论