使用cachecloud和codis搭建redis环境
简单的介绍:
CacheCloud
:
CacheCloud
是由souhutv
开源一套Redis
的管理系统,可以帮助我们自动化的搭建和运维Redis
,Cachecloud
可以自动部署和管理3种形式的Redis
方案,包括单实例Redis
,Redis+Sentinel
以及Redis的原生集群方案Redis Cluster
Codis
:
Codis
是由豌豆荚
开源的一套Redis
集群方案,是通过proxy
路由到不同分片来实现的redis集群
Codis安装:
1. 安装Go环境
在Go语言的下载页面选择一个你要使用的安装包下载。我选择的是1.9.2版本。1
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
修改/etc/profile
文件1
2export GOROOT=/data/go/
export PATH=$PATH:/$GOROOT/bin
重新加载/etc/profile
1
source /etc/profile
查看Go是否安装成功1
2 go version
go version go1.9.2 linux/amd64
2. 安装Codis
首先我们需要知道GOPATH
的路径1
2 go env GOPATH
/root/go
Go安装成功后,GOPATH会在~/go
目录下,我这值我们也可以进行修改,比如,修改为/data/gopath
1
export GOPATH=/data/gopath
然后我们需要将codis的代码clone
到指定的目录下1
2
3 mkdir -p $GOPATH/src/github.com/CodisLabs
cd $GOPATH/src/github.com/CodisLabs
git clone https://github.com/CodisLabs/codis.git -b release3.2
获取到源码后,我们只需要make
一下就可以了1
2
3
4
5
6 cd codis
make
make -j4 -C extern/redis-3.2.11/
make[1]: 进入目录“/data/gopath/src/github.com/CodisLabs/codis/extern/redis-3.2.11”
cd src && make all
...
在这个过程中你可能需要安装一些工具,比如1
yum groupinstall "Development Tools"
在安装过程中可能会遇到如下的错误
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
这是因为没有找到jemalloc
内存管理器的缘故,
我们可以在编译的时候指定其他的内存管理1
make MALLOC=libc
但是相比jemalloc
,其他的内存管理器可能会造成更多的内存碎片(mem_fragmentation_ratio
)
当然,为了更好的性能,我们自然会选择jemalloc
,那么我们就需要安装jemalloc
了,但是如果我们现在使用yum
安装,可以依然会编译codis报错,因为jemalloc
没有被安装到指定的目录,而在redis的安装包里redis自己就为我们提供一个deps
目录,里面就有jemalloc
和其他一些依赖的安装包。
但是codis的目录下为我们提供了多个版本的redis,我们需要使用那个呢?
刚才我们在make
的时候,第一行输出是1
make -j4 -C extern/redis-3.2.11/
这里我们就可以进入该目录,直接编译deps
下的所有依赖1
2cd extern/redis-3.2.11/deps
make hiredis jemalloc linenoise lua geohash-int
再次回到原目录,编译成功
启动Codis:
启动Codis
会用到zk或者etctd,这里我使用的是zk
安装JDK和ZOOKEEPER
JDK
可以直接使用yum
安装1
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
安装完JDK
记得要配置环境变量,不然可能会导致一些程序不可用vim /etc/profile
1
2
3
4
5 set java environment
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el6_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME CLASSPATH PATH
加载一下配置文件source /etc/profile
ZOOKEEPER需要从官网下载安装包,我部署的是单节点的,解压后直接启动就可以1
2
3
4
5
6wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
tar -zxf zookeeper-3.4.11.tar.gz
cd zookeeper-3.4.11/conf
cp zoo_sample.cfg zoo.cfg
cd zookeeper-3.4.11/bin
./zkServer.sh start
配置与启动
如上图,Codis集群架构可以分为几个部分
最核心的是codis-dashboard
和codis-proxy
codis-dashboard
是codis
的集群管理工具,可以管理codis-proxy
、codis-server
和Redis-sentinel
codis-proxy
负责codis
集群中的代理工作,负责将redis
命令路由到不同的分片codis-fe
是codis-dashboard
的web
管理界面,可以更方便、更形象的管理集群codis-serer
是在redis-server
基础上增加了codis
相关命令而形成的另一个分支
现在我们要启动Codis
我们先进入codis
的配置文件目录/data/gopath/src/github.com/CodisLabs/codis/config
修改codis-dashboard
的配置文件,codis-dashboard
默认使用filesystem
作为外部存储,我们将其修改为zookeeper
。
然后将product_name
修改为该我们的codis集群
的名字,这里我们改成codis-test
1 | Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem". |
现在启动codis-dashboard
1 | nohup ./bin/codis-dashboard --ncpu=4 --config=config/dashboard.toml --log=logs/dashboard.log --log-level=WARN & |
这里我新建了一个logs
目录来存放日志
codis-proxy
也有相应的配置文件,这里我只是简单的修改了一下product_name
,然后启动相关的服务
1 | 启动 codis-proxy |
现在我们已经可以访问管理页面了
进入管理界面中,我们先添加一个proxy
接下来我们就可以添加codis-server
和sentinel
了,但是在那之前,我们先安装一下CacheCloud
安装CacheCloud:
我们先从gayhub github上 的获取源码
1 | cd /opt |
由于程序需要用到maven
,我们需要先安装maven
1 | wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo |
现在我们需要修改一下配置文件,配置一下使用的mysql
和监听的端口
1 | vim /opt/cachecloud/cachecloud-open-web/src/main/swap/online.properties |
启动cachecloud
1 | 进入cachecloud的根目录 |
如果你发现启动脚本运行的时间很长,可能是已经报错了,tail
一下日志
如果报Unrecognized VM option 'UnlockCommercialFeatures'
的错误,在启动脚本中将-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
去掉即可
使用CacheCloud和配置Redis:
在cachecloud
的script
目录下有一个初始化脚本cachecloud-init.sh
这个脚本有3个作用:
- 创建
cachecloud
项目的用户 - 创建
cachecloud
项目的相关目录 - 安装
redis
将这个脚本拷贝到需要管理的机器上,然后执行
1 | ./cachecloud-init.sh username |
此处的username
是你用于创建管理redis
的用户名
执行后,你需要输入两次密码
使用管理员账号进入web
管理页面,在管理后台
>机器管理
中添加我们初始化后的机器
接着,我们可以使用任意账号在应用申请
界面申请redis
服务
cachecloud
提供3种redis
服务
- 单节点
redis
Redis-Sentinel
- 原生的
Redis-Cluster
集群
申请了我们需要的redis
服务之后,管理员就可以在管理后台
>流程审批
界面分配redis
服务了
使用CacheCloud配置Codis集群
为codis添加redis-server
值得注意的是,Codis
集群不能直接使用Redis-Server
,我们需要使用codis
安装目录下的codis-server
替换掉PATH
路径下的redis-server
1 | cp codis-server /usr/bin/redis-server |
这样我们使用CacheCloud
创建的就是codis-server
了
现在我们在CacheCloud
中创建两个单节点redis
,然后在管理后台
>流程审批
>应用运维
中为两个redis
分别配置slave
现在我们得到了两对redis
主从,然后我们进入Codis
的管理界面,在Group
中将这两对主从添加为两组Group
,再在Slots
中点击Reblance All Slots
至此Codis
集群就搭建完成了
现在我们为Codis
集群添加Sentinel
为什么要手动启动sentinel
需要说明的一点是,我们可以在CacheCloud
中可以直接配置Redis-Sentinel
集群,似乎我们直接在CacheCloud
中配置好Redis-Sentinel
集群,然后将配置好的redis
和sentinel
添加到codis
中,这样更简单。但是这样做是不可行的。
正常情况下,添加了sentinel
的codis
集群在redis-server主节点
宕机后,codis-proxy
会自动failover
到redis-server从节点
。
但是,但是如果codis
添加的是通过cachecloud
生成的sentinel
,则由于cachecloud
和codis
都对sentinel
进行了配置,导致sentinel
对同一套主从侦测了两次,在redis-server主节点
宕机后,sentinel
的cachecloud
配置生效,而codis
配置不生效,所以codis-proxy
无法正常failover
。
所以在cachecloud
和codis
联合使用时,不要在codis
中配置cachecloud
生成的sentinel
。
而为codis
单独配置sentinel
也很简单。
添加sentinel
首先创建一个简单的配置文件
1 | vim sentinel.conf |
然后启动sentinel
1 | redis-server sentinel.conf --sentinel & |
然后我们添加sentinel
的地址添加到codis
配置页面的sentinels
配置项中即可。