Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
codis的话我也是绕了不少的坑,终于在研究了一周以后就搭出来了,
https://github.com/wandoulabs/codis
下面是github上面的源代码,但是介绍相对简单了点
https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md
我细细说吧
Codis 由四部分组成:
Codis Proxy (codis-proxy)//是客户端连接的 Redis 代理服务,客户端访问proxy结构,它在根据相应的均衡算法在redis里进行存储
Codis Manager (codis-config)//一些dashborad等配置
Codis Redis (codis-server)//redis服务器
ZooKeeper或者etcd//它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
安装的话非常简单,按照他的步骤
go get -d github.com/wandoulabs/codis cd $GOPATH/src/github.com/wandoulabs/codis ./bootstrap.sh make gotest
基本上没有太大的问题,如果 github.com/wandoulabs/codis 下载有问题的话,也可以直接放在$GOPATH/src目录下
接着就是运行,运行的话建议运行sample里面现成的shell文件,注意在此之前要运行zookeeper或者etcd
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 即可 dashboard_addr=localhost:18087 <- dashboard 服务的地址,CLI 的所有命令都依赖于 dashboard 的 RESTful API,所以必须启动 coordinator=zookeeper <- 如果用etcd,则将zookeeper替换为etcd
这里要注意下,zk中etcd和zookeeper的区别
然后可以直接启动 startall.sh,不过这里建议还是分别启动,因为有些可能和实际情况不同./
./start_dashboard.sh
可以查看代码,addr是端口号,http-log是存放端口的位置,config.ini就是之前的配置文件
启动start_redis.sh,如果存在主从,或者需要修改端口的话还需要在里面修改,
#!/bin/sh for i in 638{0..3}; do nohup ../bin/codis-server ./redis_conf/${i}.conf &> ./log/redis_${i}.log & done echo "sleep 3s" sleep 3 tail -n 30 ./log/redis_*.log
然后启动add_group.sh
let group=0 for port in 638{0..3}; do let group="1+group" echo "add group $group with a master(localhost:$port), Notice: do not use localhost when in produciton" ../bin/codis-config -c config.ini -L ./log/cconfig.log server add $group localhost:$port master done
这里就是添加 Redis Server Group , 每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, group id 仅支持大于等于1的整数,
值得注意的是在 官方的操作里面:
添加 Redis Server Group是在初始化slots后面但是,在sample里面则是在initslots前面,这里需要指出的是,
add_group.sh应该在initslots前面,不然slots可能会报无法init的错误
然后./initslot.sh
#!/bin/sh echo "slots initializing..." ../bin/codis-config -c config.ini slot init -f echo "done"
之后的内容可以省略,在图形化界面里也可以配置而且更加直观
最后./start_proxy.sh
#!/bin/sh echo "shut down proxy_1..." ../bin/codis-config -c config.ini proxy offline proxy_1 echo "done" echo "start new proxy..." nohup ../bin/codis-proxy --log-level info -c config.ini -L ./log/proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 & echo "done" echo "sleep 3s" sleep 3 tail -n 30 ./log/proxy.log
这里19000是客户端的访问端口,11000则是http上进行测试的端口
进行以上操作后打开
127.0.0.1:18087
就可以看到界面了
Ps:遇到dashboard无法开启,说进程被占用的情况,然后缺没有实际的进程,这种情况下在etcd,或者zookeeper下找到dashboard目录,貌似是在很多级的子目录下面。把目录删除即可