codis是一个分布式redis集群解决方案,对于上层的应用来说, 连接到codis-proxy和连接原生的redis-server没有明显的区别。
上层应用可以像使用单机的redis一样使用,codis底层会处理请求的转发,不停机的数据迁移等工作。所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的redis服务。
codis由四部分组成:
codis proxy(codis-proxy) codis dashboard(codis-config)
codis redis(codis-server) zookeeper/etcd
codis-proxy是客户端连接的redis代理服务,codis-proxy本身实现 了redis协议,表现得和一个原生的redis没什么区别(就像twemproxy),对于一个业务来说,可以部署多个codis- proxy,codis-proxy本身是无状态的。
codis-config是codis的管理工具,支持包括:添加/删除redis节点,添加/删除proxy节点,发起数据迁移等操作。
codis-config本身还自带了一个http-server,会启动一个dashboard,用户可以直接在浏览器上观察codis集群的运行状态。
codis-server是codis项目维护的一个redis分支,基于redis2.8.21开发,加入了slot的支持和原子的数据迁移指令。codis上层的codis-proxy和codis-config只能和这个版本的redis交互才能正常运行。
codis依赖zookeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过zookeeper同步到各个存活的codis-proxy。
codis支持按照namespace区分不同的产品,拥有不同的product name的产品,各项配置都不会冲突。
codis架构图如下:
Codis Proxy 提供 Redis 集群的接入口,Dashboard 是 Codis的管理工具,下层提供 Redis 服务。也可以对 Codis Proxy 实现高可用,使得集群更加完善。
codis集群的搭建,需要zookeeper集群。除了zookeeper集群之外,我们还需要安装go语言环境,因为codis是基于go语言开发的。
实验环境(rhel6.5):
172.25.45.2 Codis-redis-master server2
172.25.45.3 codis-proxy - server3
172.25.45.4 Codis-redis-slave server4
1. 安装go环境(所有节点均须安装,在server3上做演示,其他节点相同)
tar -zxf go1.8.linux-amd64.tar.gz -C /usr/local/
vim /etc/profile
##最后面添加以下几行
export GOPATH=/usr/local/codis
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
go version ##显示go版本
2、设置编译环境
在$GOPATH 目录里建立 codis 编译目录,将 codis 下载后解压到此目录
mkdir -p $GOPATH/src/github.com/CodisLabs
unzip codis-release3.2.zip
mv codis-release3.2 $GOPATH/src/github.com/CodisLabs/codis
cd $GOPATH/src/github.com/CodisLabs/codis
3、编译 Codis 源码
在编译之前需要安装依赖包
yum install -y gcc git autoconf
make MALLOC=libc
当看到如下内容,编译成功。
3.配置集群
Codis 源 码 编 译 完 成 后 , 组 件 的 启 动 脚 本 在$GOPATH/src/github.com/CodisLabs/codis/admin目录下。配置文件在
GOPATH/src/github.com/CodisLabs/codis/config 目录下。日志在$GOPATH/src/github.com/CodisLabs/codis/log 目录下。
1).进行集群配置
codis-proxy 配置
yum install -y jdk-8u121-linux-x64.rpm
java -version
tar -xzf zookeeper-3.4.6.tar.gz -C /usr/local/
vim /etc/profile
source /etc/profile
cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.6/conf/zoo.cfg
vim /usr/local/zookeeper-3.4.6/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
clientPort=2181
#server.1=codis-1:2888:3888
#server.2=codis-2:2888:3888
#server.2=codis-3:2888:3888
mkdir -p /data/zookeeper/data
echo "1" > /data/zookeeper/data/myid
设置myid:
设置myid在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件配置的srver.X中的X为什么数字,则myid文件就输入这个数字,我只有一台zk,所以配置文件里可以不配置server.X,但还是要配置myid的,echo一个数字1进去即可。如果有多台zk,则分别在zk服务器上echo对应的数字进对应的myid文件
启动zookeeper
因为环境变量里已经添加了路径,直接执行命令即可,执行zkServer.sh start后,要等一会再执行zkServer status:
zkServer.sh start
zkServer.sh status
在那个目录下启动,就在那个目录下产生一个启动的日志zookeeper.out,查看这个日志可以查看是否正常启动了。由于单个zookeeper,所以这里指示Mode: standalone,如果有多个zk节点,就只有一个Mode: leader的状态,别的都是Mode: follower状态。
cat zookeeper.out
vim /usr/local/codis/config.ini
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
2).启动顺序
start zookeeper ##启动zookeeper服务
change config items in config.ini ##修改codis配置文件
./start_dashboard.sh ##启动 dashboard
./start_redis.sh ##启动redis实例
./add_group.sh ##添加redis组,一个redis组只能有一个master
./initslot.sh ##初始化槽
./start_proxy.sh ##启动proxy
./set_proxy_online.sh ##上线proxy项目
open browser to http://localhost:18087/admin ##访问web
3).启动各个组件
zkServer.sh start ##启动zookeeper
zkServer.sh status
cd $GOPATH/src/github.com/CodisLabs/codis
./admin/codis-dashboard-admin.sh start ##启 动CodisDashboard组 件 , 查 看 日 志 文 件codis/dashboard.log.2018-10-27 是否启动成功。
cat log/codis-dashboard.log.2018-10-27
./admin/codis-proxy-admin.sh start ##启动CodisProxy组件,查看日志codis-proxy.log.2018-20-27 是否启动成功
tail log/codis-proxy.log.2018-10-27
./admin/codis-server-admin.sh start ##启动 Codis Server 组件,查看日志/tmp/redis_6379.log 文件是否启动成功。
tail /tmp/redis_6379.log
./admin/codis-fe-admin.sh start ##启动 Codis Fe 组件,查看日志 codis-fe.log.2018-10-27 文件是否
tail log/codis-fe.log.2018-10-27
4).安装redis(redis-master):在server2上
tar -zxf redis-4.0.1.tar.gz
cd redis-4.0.1
yum install gcc -y
make && make install
mkdir -p /data/cluster/7000
cp redis.conf /data/cluster/7000/
vim /data/cluster/7000/redis.conf
redis-server /data/cluster/7000/redis.conf
ps -ef |grep 7000
redis-master已经启动成功了
5).安装配置redis-slave(server4)操作同上
6).web 界面
1.在浏览器中输入http://172.25.45.3:9090可以进入 web 管理页面,如下所示:
其中可以看到 proxy 的状态已经开启。