codis 的整个安装还是比较简单,详细的步骤参考官方说明:
https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md
$ wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz $ tar -zxvf go1.4.1.linux-amd64.tar.gz -C /usr/local/
配置go境变量
export GOROOT=/usr/local/go export GOPATH=/usr/local/codis PATH=$PATH:$GOROOT/bin:$GOPATH/bin
$ tar -zxvf zookeeper-3.4.6.tar.gz
配置环境变量
ZOOKEEPER_HOME=/usr/local/zookeeper PATH=$PATH:$ZOOKEEPER_HOME/bin
启动 zookeeper 服务
$ ./bin/zkServer.sh start
执行go get下载codis代码
$ go get -u -d github.com/CodisLabs/codis
提示 git 未安装,安装 git
$ yum install git
代码下载完成之后,切换到$GOPATH/src/github.com/CodisLabs/codis目录执行make命令编译代码,并执行make gotest来跑测试
$ make
提示 gcc 未安装
/bin/sh: cc: command not found
$ yum install gcc
codis安装成功之后,会在 bin 文件夹内生成 codis-config、codis-proxy、codis-server三个可执行文件。另外, bin/assets 文件夹是 codis-config 的 dashboard http 服务需要的前端资源, 需要和 codis-config 放置在同一文件夹下
执行 bin/codis-config dashboard, 该命令会启动 dashboard
$ cd /usr/local/codis/src/github.com/CodisLabs/codis $ ./bin/codis-config -c ./config.ini dashboard &
有时kill方式停止codis时,再次启动会出现下面的错误提示,因为zookeeper中的相关配置没有删除,连接上zookeeper删除相关文件夹
[root@bogon codis]# ./bin/codis-config -c ./config.ini dashboard & 2016/05/02 06:58:45 dashboard.go:160: [INFO] dashboard listening on addr: :18087 2016/05/02 06:58:46 dashboard.go:234: [PANIC] create zk node failed [error]: dashboard already exists: {"addr": "192.168.1.161:18087", "pid": 6231}
解决办法:
[root@bogon codis]# cd /usr/local/zookeeper/ [root@bogon zookeeper]# ./bin/zkCli.sh -server 127.0.0.1:2181 … [zk: 127.0.0.1:2181(CONNECTED) 1] ls /zk/codis/db_test [fence, slots, servers, proxy, migrate_tasks, dashboard, LOCK, actions, ActionResponse] [zk: 127.0.0.1:2181(CONNECTED) 2] rmr /zk/codis/db_test/dashboard
重新启动即可
执行 bin/codis-config slot init,该命令会在zookeeper上创建slot相关信息
$ ./bin/codis-config -c ./config.ini slot init
Codis redis 在extern目录下可以找到,具体的配置和启动过程和官方的reids启动一样
注:因为 codis 采用的 redis 服务时基于 redis 的2.x版本的分支,所以这里不能使用官方下载的 redis 来作为 redis service
本次实验启动4个redis服务,两组主从
192.186.1.161 6379 (master) -- > 192.168.1.161 6380 (slave)
192.168.1.161 6479 (master) -- > 192.168.1.161 6480 (slave)
每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, group id 仅支持大于等于1的整数,例如:
添加一个group,group的id为1, 并添加一个redis master到该group
$ bin/codis-config server add 1 192.168.1.161:6379 master
添加一个redis slave到该group
$ bin/codis-config server add 1 192.168.1.161:6380 slave
类似的,再添加group,group的id为2
$ bin/codis-config server add 2 192.168.1.161:6479 master $ bin/codis-config server add 2 192.168.1.161:6480 slave
Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.
例如:
设置编号为[0, 511]的 slot 由 server group 1 提供服务, 编号 [512, 1023] 的 slot 由 server group 2 提供服务
$ bin/codis-config slot range-set 0 511 1 online $ bin/codis-config slot range-set 512 1023 2 online
$ bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=4 --addr=192.168.1.161:19000 --http-addr=192.168.1.161:11000
--addr理绑定的ip和端口
--cpu理使用的cpu数,虚拟机的配置有关,一般跟数相同
--http-addr用于测试的地址
-L 指定理的日志文件
刚启动的 codis-proxy 默认是处于 offline状态的, 然后设置 proxy 为 online 状态, 只有处于 online 状态的 proxy 才会对外提供服务
$ bin/codis-config -c config.ini proxy online <proxy_name> <---- proxy的id, 如 proxy_1
Codis-ha 用来做codis的高可用及故障自动转移功能,但是codis-ha不是codis的官方功能插件,默认如果codis group 如果配置了主从,当该 group 中的主宕机后,从不会自动切换
Codis-ha github 官方地址:https://github.com/ngaut/codis-ha
$ go get github.com/ngaut/codis-ha $ cd codis-ha // /usr/local/codis/src/github.com/ngaut/codis-ha $ go build $ ./codis-ha --codis-config=192.168.1.161:18087 --productName=test
启动之后,查看
redis-cli -h 192.168.1.161 -p 19000
注:前提需要安装并启动 codis-ha
测试将 group1 下面的 6379 服务停止后,6380 是否可以自动升级为主
6379 在停止服务之前为 group_1 的 mster
kill掉6379服务后,看到 codis-ha 的日志输出
6380 成功升级为 group_1 的新主
再次重启 6379 的 redis 服务,验证启动后的 6379 会作为 6380 的从节点
6380 还是 master,6379作为了 6380 的 slave 加入了 group_1
codis 启动之后,可以通过浏览器中访问: http://192.168.1.161:18087/admin/
Server Groups 可以添加新的 group 和 添加 redis 服务
Slot Control可以给 group 分配槽位
Migrate Status 可以用来槽位迁移
Proxy status 用来监控 proxy 的状态
Codis可以完美的解决Redis集群问题,在目前Redis 3.0版本还不是很稳定的情况下,是非常不错的解决方案。支持数据扩展。 但是并不是所有的redis命令都支持。
如果你使用以下命令:
KEYS, MOVE, OBJECT, RENAME, RENAMENX, SORT, SCAN, BITOP,MSETNX, BLPOP, BRPOP, BRPOPLPUSH, PSUBSCRIBE,PUBLISH, PUNSUBSCRIBE, SUBSCRIBE, UNSUBSCRIBE, DISCARD, EXEC, MULTI, UNWATCH, WATCH, SCRIPT EXISTS, SCRIPT FLUSH, SCRIPT KILL, SCRIPT LOAD, AUTH, ECHO, SELECT, BGREWRITEAOF, BGSAVE, CLIENT KILL, CLIENT LIST, CONFIG GET, CONFIG SET, CONFIG RESETSTAT, DBSIZE, DEBUG OBJECT, DEBUG SEGFAULT, FLUSHALL, FLUSHDB, INFO, LASTSAVE, MONITOR, SAVE, SHUTDOWN, SLAVEOF, SLOWLOG, SYNC, TIME
是无法直接迁移到 Codis 上的. 你需要修改你的代码, 用其他的方式实现.