前言:

 

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 可自行扩展。

 

 

架构拓扑图

spacer.gif

wKioL1cWHQGSSjOPAAIV_mtlI-I772.png

 

测试机器信息:

 

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目录下生成如下执行文件:

spacer.gif

wKiom1cWHGXCFmFlAABJo-ldfUA971.png

只需一台机器上编译,其余节点复制编译好的执行文件即可。

 

 

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

spacer.gif

wKiom1cWHICTgIvdAABONyIK_K8782.png

 

编写自定义启动脚本

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

可查看到如下日志信息:

spacer.gif

wKioL1cWHVfQxlz7AACNuF7ls24764.png

 

检查进程和端口

ps -ef |grep -v gerp |grep codis

netstat -ntpl 

spacer.gif

wKiom1cWHKvwzTg-AABM8rT5xkA247.png

 

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

spacer.gif

wKioL1cWHYGyaOgoAABfkN-NHQU237.png

tail -200f proxy.log.2016-04-19

spacer.gif

wKioL1cWHZOgcw-7AACGLU0nSLQ297.png

 

 

 

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 root@192.168.223.209:/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

 

 检查服务状态:

spacer.gif

wKioL1cWHanAoTYqAABdaYnnpV4469.png

 

 

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

 

检查状态:

spacer.gif

wKiom1cWHQCwOW0RAABO5z0fvlM575.png

打开浏览器访问:(推荐使用火狐浏览器)

http://192.168.223.207:8080

可以看到如下界面:

spacer.gif

wKiom1cWHRHTmH5EAAGuSsGhDwc722.png

 

 

8.5 通过管理界面添加组和实例主从。

打开http://192.168.223.207  输入组编号进行新建,如下:

wKioL1cWHe3S3Kr8AAA5Qi9a7VI822.png

spacer.gif

这里共添加3个组:最终如下所示:

wKioL1cWHgDRkhFUAABJLVNUdEw093.png

spacer.gif

接下来,添加组里面的实例。

wKiom1cWHVfj0VhhAABl3Rdm0xM970.png

spacer.gif

首先输入组编号,在输入实例IP和端口在添加即可。

spacer.gif

wKiom1cWHXDhEw2hAAB2iZHANAE753.png

接下来添加slave实例:

wKioL1cWHkHTz5oSAACm7Av6Uzs219.png

spacer.gif

最后设置主从状态,点击图标即可。

wKioL1cWHliivujKAACzfh_lblw829.png

spacer.gif

最终效果如下:

spacer.gif

wKiom1cWHaqDxo-tAACxo_doeKI658.png

 

8.6   分配Slots 槽到组里面

 

操作如下:

spacer.gif

wKioL1cWHn7jvX9zAABUSHac7Wc977.png

可以看到日志 tail -f dashboard.log.2016-04-19

spacer.gif

wKioL1cWHo_ih3PTAAB-XHydUqs380.png

接着分配最后一段范围给第二组,选择OK,然后查看dashboard.log日志,速度非常快,在迁移。

spacer.gif

wKioL1cWHqLjuyfMAAF5cxuFX_c919.png

最终效果如下:

spacer.gif

wKioL1cWHq7hYLwgAABGOMIyip4515.png

这里我只分配两组,剩下的一组用来做迁移测试。

 

 

 

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

 

检查状态:

spacer.gif

spacer.gif

wKiom1cWHgaDXAgUAAArjPIjPKM672.png

wKiom1cWHhfiI-MiAABlCHxbpU8236.png

 

部署到这里,恭喜你已经完成群集部署,接下来可以进行相应的测试。

 

 

 

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

 

查看管理界面如下:

spacer.gif

spacer.gif

 wKiom1cWHmKweHjwAAF2DFJ0j3s229.png

 

 wKiom1cWHoiA1OwKAAGDwoy7MTU120.png

 

二、使用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 一个主进程 ,如下:

spacer.gif

 wKioL1cWH2PSPDuEAABXXZlXGOM348.png

然后查看codis-ha日志,如下:

spacer.gif

wKiom1cWHrGwub3wAACVZKXNpQE507.png

管理界面会自动剔除连接不上的主实例,如下:

spacer.gif

 wKioL1cWH4CAkMzCAAC1nOyAoIw919.png

主实例服务再次起来,需要手动在管理界面重新添加,并需要点击帮手小图标进行同步。恢复后如下:

spacer.gif

 wKiom1cWHs3zqfW2AADEl94ExNI807.png

 

 

 

参考链接:

https://github.com/golang/net

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