一、简介
Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面客户端来说是透明的,可以简单的认为后边连接是一个内存无限大的Redis服务。
Codis架构图:
以上我们可以看到codis-proxy是单个节点的
现在需要三台虚拟机
server1 codis-proxy
server2 redis-master
server3 redis-slave
下载地址
https://github.com/CodisLabs/codis/archive/release3.2.zip
https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
http://gw.086o2i.cn:8080/201704/tools/jdk-linux-x64.rpm
wget https://storage.googleapis.com/golang/go1.7.3.linux-amd64.tar.gz
tar zxf go1.7.3.linux-amd64.tar.gz -C /usr/local
[root@server1 bin]# /usr/local/go/bin/go version
go version go1.7.3 linux/amd64
yum install jdk-linux-x64.rpm -y
[root@server1 ~]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
vim /etc/profile
export PATH=$PATH:/usr/local/mysql-proxy/bin
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis
export PATH=$PATH:/usr/local/go/bin
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13/
export PATH=$PATH:/usr/local/go/bin:$ZOOKEEPER_HOME/bin
source /etc/profile
unzip codis-release3.2.zip
mkdir -p $GOPATH/src/github.com/CodisLabs
mv codis-release3.2 $GOPATH/src/github.com/CodisLabs/codis
cd $GOPATH/src/github.com/CodisLabs/codis
yum install -y gcc git autoconf
make MALLOC=libc
tar zxf zookeeper-3.4.13.tar.gz -C /usr/local/
cp /usr/local/zookeeper-3.4.13/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.13/conf/zoo.cfg
mkdir -p /data/zookeeper/data
echo "1" > /data/zookeeper/data/myid
设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机
vim /usr/local/zookeeper-3.4.13/conf/zoo.cfg
dataDir=/data/zookeeper/data
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
[root@server1 ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@server1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: standalone
在哪个目录下启动,就在哪个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。由于单个zookeeper,所以这里指示Mode: standalone,如果有多个zk节点,就只有一个Mode: leader的状态,别的都是Mode: follower状态。
vim /usr/local/codis/config.ini
zk=localhost:2181
product=test
proxy_id=proxy_1
net_timeout=5
dashboard_addr=localhost:18087
coordinator=zookeeper
####################################################
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
#####################################################
启动顺序
zkServer.sh start
cd $GOPATH/src/github.com/CodisLabs/codis
./admin/codis-dashboard-admin.sh start
tail -4 ./log/codis-dashboard.log.2019-03-01
tail ./log/codis-dashboard.log.2019-03-05
./admin/codis-proxy-admin.sh start
tail ./log/codis-proxy.log.2019-03-01
2019/03/01 18:01:09 proxy_api.go:44: [WARN] [0xc4200e1b80] API call /api/proxy/sentinels/3c611de019c5744ad2ff569d8452bbfe from 172.25.11.1:38818 []
2019/03/01 18:01:09 proxy.go:293: [WARN] [0xc4200e1b80] set sentinels = []
2019/03/01 18:01:09 main.go:343: [WARN] rpc online proxy seems OK
2019/03/01 18:01:10 main.go:233: [WARN] [0xc4200e1b80] proxy is working ...
./admin/codis-server-admin.sh start
[root@server1 codis]# tail /tmp/redis_6379.log
5749:M 01 Mar 18:02:36.279 * Increased maximum number of open files to 10032 (it was originally set to 1024).
5749:M 01 Mar 18:02:36.279 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use
[root@server1 codis]# ./admin/codis-fe-admin.sh start
[root@server1 codis]# tail ./log/codis-fe.log.2019-03-01
2019/03/01 18:04:39 main.go:120: [WARN] set assets = /usr/local/codis/src/github.com/CodisLabs/codis/bin/assets
2019/03/01 18:04:39 main.go:162: [WARN] set --filesystem = /tmp/codis
2019/03/01 18:04:39 main.go:216: [WARN] option --pidfile = /usr/local/codis/src/github.com/CodisLabs/codis/bin/codis-fe.pid
server 2 3安装主从redis 见博客内redis主从复制
通过web浏览器访问集群管理页面(fe地址:127.0.0.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
按钮即可,如下图所示
172.25.11.1:9090
添加两个redis
172.25.11.2 6379
172.25.11.3 6379
之前还能出现添加组页面,后来重启出现问题组页面无法出现
解决办法
[root@server1 codis]# echo vm.overcommit_memory = 1 >> /etc/sysctl.conf
[root@server1 codis]# sysctl vm.overcommit_memory=1
reboot
rm -fr /tmp/codis/data/codis3/codis-demo/topom
rm -fr /tmp/codis/data.lck
参考文档
https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md