前言:
Codis 3.x 由以下组件组成:
- Codis Server:基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
- Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
- 对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;
- 不同 codis-proxy 之间由 codis-dashboard 保证状态同步。
- Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
- 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
- 所有对集群的修改都必须通过 codis-dashboard 完成。
- Codis Admin:集群管理的命令行工具。
- 可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
- Codis FE:集群管理界面。
- 多个集群实例共享可以共享同一个前端展示页面;
- 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
- Codis HA:为集群提供高可用。
- 依赖 codis-dashboard 实例,自动抓取集群各个组件的状态;
- 会根据当前集群状态自动生成主从切换策略,并在需要时通过 codis-dashboard 完成主从切换。
- Storage:为集群状态提供外部存储。
- 提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;
- 目前仅提供了 Zookeeper 和 Etcd 两种实现,但是提供了抽象的 interface 可自行扩展。
架构拓扑图:
测试机器信息:
192.168.223.207 codis-proxy-1 codis-fe codis-server-7001 codis_server-7002
192.168.223.208 codis-proxy-2 codis-ha codis-server-7001 codis-server-7002
192.168.223.209 codis-proxy-3 codis-dashboard codis-server-7001 codis-server-7002
软件下载目录:
/data/packages
1. 安装ZooKeeper群集
Codis 技术交流群: QQ 240361424 已写有一篇zk群集部署文档,此处省略。
2. 安装go环境
cd /data/packages
wget http://golangtc.com/static/go/1.5.2/go1.5.2.linux-amd64.tar.gz
tar zxvf go1.5.2.linux-amd64.tar.gz -C /usr/local/
配置环境变量
vim /etc/profile
JAVA_HOME=/usr/local/java
JRE_HOME=$JAVA_HOME/jre
ZOOKEEPER_HOME=/usr/local/zookeeper
JAVA_FONTS=/usr/local/java/jre/lib/fonts
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
GOROOT=/usr/local/go
GOPATH=/usr/local/codis/
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ZOOKEEPER_HOME/bin:$GOROOT/bin:$GOPATH/bin
export JAVA_HOME PATH CLASSPATH JRE_HOME ZOOKEEPER_HOME GOROOT GOPATH
环境变量生效
source /etc/profile
检查go版本
go version
go version go1.5.2 linux/amd64
3. 编译安装codis
go env GOPATH
/usr/local/codis/
go get -u github.com/tools/godep && which godep
/usr/local/codis/bin/godep
4. 下载codis源码,编译安装
cd /data/packages
wget https://codeload.github.com/CodisLabs/codis/zip/release3.0
mv release3.0 codis-3.0.zip
unzip codis-3.0.zip
mkdir -p /usr/local/codis/src/github.com/CodisLabs/
mv codis-release3.0 codis
mv codis /usr/local/codis/src/github.com/CodisLabs/
cd /usr/local/codis/src/github.com/CodisLabs/codis
make
5. 提示出现golang.org/x/net 下载错误,下载源码 net-master 拷贝到对应文件夹
cd /data/packages/
wget https://codeload.github.com/golang/net/zip/master
mv master net-master.zip
unzip net-master.zip
mkdir -p /usr/local/codis/src/github.com/CodisLabs/codis/Godeps/_workspace/src/golang.org/x/net
cd /usr/local/codis/src/github.com/CodisLabs/codis/Godeps/_workspace/src/golang.org/x/net
cp -raf /data/packages/net-master/* .
6. 重新编译安装codis源码
cd /usr/local/codis/src/github.com/CodisLabs/codis
make
编译完成后bin目录下生成如下执行文件:
只需一台机器上编译,其余节点复制编译好的执行文件即可。
7. 复制编译后的执行文件到自定义文件夹 (所有节点机器)
cd /usr/local/codis/bin
cp -raf /usr/local/codis/src/github.com/CodisLabs/codis/bin/* .
8. 启动群集服务,创建自定义启动脚本 (所有节点机器)
创建自定义文件夹
mkdir /usr/local/codis/{etc,logs,scripts,data}
8.1 配置 Codis-dashboard ( 192.168.223.209机器配置 )
配置codis-dashboard 需要首先启动好zookeeper群集,并确定zk群集运行正常。
生成默认配置文件,修改相应配置参数
/usr/local/codis/bin/codis-dashboard --default-config | tee /usr/local/codis/etc/dashboard.toml
cat /usr/local/codis/etc/dashboard.toml
编写自定义启动脚本
cd /usr/local/codis/scripts
vim start_codis_dashboard.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
nohup $CODIS_HOME/bin/codis-dashboard --ncpu=4 --config=$CODIS_HOME/etc/dashboard.toml --log=$CODIS_HOME/logs/dashboard.log --log-level=WARN &
启动codis-dashboard服务
sh start_codis_dashboard.sh
可查看到如下日志信息:
检查进程和端口
ps -ef |grep -v gerp |grep codis
netstat -ntpl
8.2 配置 Codis Proxy (所有节点机器上配置)
生成默认配置文件,修改相应配置参数
/usr/local/codis/bin/codis-proxy --default-config | tee /usr/local/codis/etc/proxy.toml
只需修改如下参数:
# Set Codis Product {Name/Auth}.
product_name = "codis-3.0-release-demo"
product_auth = "test123456"
编写自定义启动脚本
cat /usr/local/codis/scripts/start_codis_proxy.sh ( 192.168.223.207 节点机器上 )
#!/bin/sh
CODIS_HOME=/usr/local/codis
# start codis-proxy
nohup $CODIS_HOME/bin/codis-proxy --ncpu=4 --config=$CODIS_HOME/etc/proxy.toml --log=$CODIS_HOME/logs/proxy.log --log-level=WARN &
sleep 3s
# set codis-proxy online
$CODIS_HOME/bin/codis-admin --dashboard=192.168.223.209:18080 --create-proxy -x 192.168.223.207:11080
================================================
cat /usr/local/codis/scripts/start_codis_proxy.sh ( 192.168.223.208 节点机器上 )
#!/bin/sh
CODIS_HOME=/usr/local/codis
# start codis-proxy
nohup $CODIS_HOME/bin/codis-proxy --ncpu=4 --config=$CODIS_HOME/etc/proxy.toml --log=$CODIS_HOME/logs/proxy.log --log-level=WARN &
sleep 3s
# set codis-proxy online
$CODIS_HOME/bin/codis-admin --dashboard=192.168.223.209:18080 --create-proxy -x 192.168.223.208:11080
====================================================
cat /usr/local/codis/scripts/start_codis_proxy.sh ( 192.168.223.209 节点机器上 )
#!/bin/sh
CODIS_HOME=/usr/local/codis
# start codis-proxy
nohup $CODIS_HOME/bin/codis-proxy --ncpu=4 --config=$CODIS_HOME/etc/proxy.toml --log=$CODIS_HOME/logs/proxy.log --log-level=WARN &
sleep 3s
# set codis-proxy online
$CODIS_HOME/bin/codis-admin --dashboard=192.168.223.209:18080 --create-proxy -x 192.168.223.209:11080
启动服务并设置在线状态
sh /usr/local/codis/scripts/start_codis_proxy.sh
检测状态日志如下:
tail -200f dashboard.log.2016-04-19
tail -200f proxy.log.2016-04-19
8.3 配置 Codis Server (所有节点机器上配置)
编辑codis-server 实例配置文件:( 以下配置仅供参考,生产环境请慎用。)
vim /usr/local/codis/etc/codis-server-7001.conf
daemonize yes
pidfile /var/run/redis_7001.pid
port 7001
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/codis/logs/codis-server-7001.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-7001.rdb
dir /usr/local/codis/data
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
requirepass test123456
maxmemory 2G
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
配置多个实例配置文件:
cp codis-server-7001.conf codis-server-7002.conf
sed -i ‘s/7001/7002/g‘ codis-server-7002.conf
复制两组实例配置到所有节点上。
cd /usr/local/codis/etc
scp [email protected]:/usr/local/codis/etc/*.conf .
编写自定义启动脚本
cat /usr/local/codis/scripts/start_codis_server.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
$CODIS_HOME/bin/codis-server $CODIS_HOME/etc/7001.conf
$CODIS_HOME/bin/codis-server $CODIS_HOME/etc/7002.conf
启动codis-server 服务
sh /usr/local/codis/scripts/start_codis_server.sh
检查服务状态:
8.4 配置 Codis FE ( 192.168.223.207 机器上配置 )
生成默认配置文件:
/usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=192.168.223.209:2181 | tee /usr/local/codis/etc/codis.json
cat /usr/local/codis/etc/codis.json
[
{
"name": "codis-3.0-release-demo",
"dashboard": "192.168.223.209:18080"
}
]
编写自定义启动脚本
vim /usr/local/codis/scripts/start_codis_fe.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
nohup $CODIS_HOME/bin/codis-fe --ncpu=4 --log=$CODIS_HOME/logs/fe.log --log-level=WARN --dashboard-list=$CODIS_HOME/etc/codis.json --listen=0.0.0.0:8080 &
启动codis-fe服务
sh /usr/local/codis/scripts/start_codis_fe.sh
检查状态:
打开浏览器访问:(推荐使用火狐浏览器)
http://192.168.223.207:8080
可以看到如下界面:
8.5 通过管理界面添加组和实例主从。
打开http://192.168.223.207 输入组编号进行新建,如下:
这里共添加3个组:最终如下所示:
接下来,添加组里面的实例。
首先输入组编号,在输入实例IP和端口在添加即可。
接下来添加slave实例:
最后设置主从状态,点击图标即可。
最终效果如下:
8.6 分配Slots 槽到组里面
操作如下:
可以看到日志 tail -f dashboard.log.2016-04-19
接着分配最后一段范围给第二组,选择OK,然后查看dashboard.log日志,速度非常快,在迁移。
最终效果如下:
这里我只分配两组,剩下的一组用来做迁移测试。
8.7 配置 Codis HA ( 192.168.223.208 机器上配置,目前3.0版本codis-ha正式支持密码验证)
cat /usr/local/codis/scripts/start_codis_ha.sh
#!/bin/sh
CODIS_HOME=/usr/local/codis
nohup $CODIS_HOME/bin/codis-ha --log=$CODIS_HOME/logs/ha.log --log-level=WARN --dashboard=192.168.223.209:18080 &
启动codis-ha 服务
sh /usr/local/codis/scripts/start_codis_ha.sh
检查状态:
部署到这里,恭喜你已经完成群集部署,接下来可以进行相应的测试。
10. 测试
一、 提供个简单的批量写入shell脚本:
vim redis-key.sh
#!/bin/bash
REDISCLI="/usr/local/packages/redis-2.8.13/src/redis-cli -h 192.168.223.209 -p 19000 -a test123456 -n 0 SET"
ID=1
while [ $ID -le 50000 ]
do
INSTANCE_NAME="i-2-$ID-VM"
UUID=`cat /proc/sys/kernel/random/uuid`
CREATED=`date "+%Y-%m-%d %H:%M:%S"`
$REDISCLI vm_instance:$ID:instance_name "$INSTANCE_NAME"
$REDISCLI vm_instance:$ID:uuid "$UUID"
$REDISCLI vm_instance:$ID:created "$CREATED"
$REDISCLI vm_instance:$INSTANCE_NAME:id "$ID"
ID=`expr $ID + 1`
done
运行脚本 sh redis-key.sh
查看管理界面如下:
二、使用redis自带压力测试工具redis-benchmark
测试命令事例:
1、/usr/local/packages/redis-2.8.13/src/redis-benchmark -h 192.168.223.207 -p 19000 -c 100 -n 100000
100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能
2、/usr/local/packages/redis-2.8.13/src/redis-benchmark -h 192.168.223.207 -p 19000 -q -d 100
测试存取大小为100字节的数据包的性能
3、/usr/local/packages/redis-2.8.13/src/redis-benchmark -h 192.168.223.207 -p 19000 -t set,lpush -n 100000 -q
只测试某些操作的性能
4、/usr/local/packages/redis-2.8.13/src/redis-benchmark -h 192.168.223.207 -p 19000 -n 100000 -q script load "redis.call(‘set‘,‘foo‘,‘bar‘)"
只测试某些数值存取的性能
三、测试codis-ha
首先kill 一个主进程 ,如下:
然后查看codis-ha日志,如下:
管理界面会自动剔除连接不上的主实例,如下:
主实例服务再次起来,需要手动在管理界面重新添加,并需要点击帮手小图标进行同步。恢复后如下:
参考链接:
https://github.com/CodisLabs/codis/tree/release3.0
https://github.com/CodisLabs/codis/blob/release3.0/doc/tutorial_zh.md
总结:
codis3.0 总体来说改进很大, 部署也越简单化。web管理界面更加完善,各个服务功能清楚明了,并且codis-ha也支持密码验证,但是还是需要外部存储提供群集使用。
由于本人使用虚拟机部署,对性能和稳定性相关测试少,请喜爱codis3.0的童鞋。一起测试。
编写者:广州-Mike
博客地址:http://liweizhong.blog.51cto.com/
Codis 交流QQ群: 240361424
Q Q : 543302969
寄 语 : 献给正在努力奋斗的 Codis 爱好者。
时 间 : 2016.04.19