1.  Codis简介

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.

Codis 由四部分组成:

  • Codis Proxy     (codis-proxy)

  • Codis Manager     (codis-config)

  • Codis Redis     (codis-server)

  • ZooKeeper

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 分支, 基于 2.8.21 开发, 加入了 slot的支持和原子的数据迁移指令. Codis 上层的codis-proxy 和 codis-config 只能和这个版本的 Redis 交互才能正常运行.

Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.

Codis 支持按照Namespace 区分不同的产品, 拥有不同的product name 的产品, 各项配置都不会冲突.

2.  Codis架构

architecture.png

3.  Codis部署

安装centos服务器3台:192.168.92.136192.168.92.138192.168.92.138

3.1.部署架构

wKioL1X72weDG4vAAANSQ07yvC4837.jpg

3.2.部署角色

3.2.1.  Zookeeper集群

192.168.92.136:2181

192.168.92.137:2181

192.168.92.138:2181

3.2.2.  Codis-config

192.168.92.136:18078

3.2.3.  Codis-proxy

192.168.92.137:19000

192.168.92.138:19000

3.2.4.  Codis-server

192.168.92.137:7000192.168.92.137:7001(主、从)

192.168.92.138:7000192.168.92.138:7001(主、从)

3.3.部署

3.3.1.  关闭防火墙和selinux()

3.3.2.  安装jdk()

wKiom1X72PKCqE6cAADG4PFBrjk662.jpg

3.3.3.  安装zookeeper

3.3.3.1.     下载zookeeper

下载地址:http://zookeeper.apache.org/releases.html

3.3.3.2.     解压zookeeper

tar xf zookeeper-3.4.6.tar.gz  -C /usr/local/

wKioL1X7212C9FZWAABRIBDYteI893.jpg

3.3.3.3.     编辑zookeeper文件

  • 配置文件存放在$ZOOKEEPER_HOME/conf/目录下,将zoo_sample.cfg文件名称改为zoo.cfg

mv zoo_sample.cfg zoo.cfg

wKioL1X723Cj87JkAADMU2OQB8M277.jpg

  • 编辑zoo.cfg: vizoo.cfg,添加节点

server.1=192.168.92.136:2888:3888

server.2=192.168.92.137:2888:3888

server.3=192.168.92.138:2888:3888


  • 修改data路径:dataDir=/var/lib/zookeeper

wKioL1X72_7Dl4mZAAAw7yyyOOs733.jpg

  • data路径下添加myid文件,内容存放pid,与server.x一致

wKiom1X72d2SVHRXAAA_hTAwZKc690.jpg

3.3.3.4.     启动zookeeper

执行:./bin/zkServer.sh start

wKioL1X73CTw8c4vAACpLbdBXpg505.jpg

3.4.安装go

3.4.1.  下载go

地址:http://golangtc.com/static/go/go1.4.2.linux-amd64.tar.gz

3.4.2.  解压go

tar xf go1.4.2.linux-amd64.tar.gz -C/usr/local/


wKioL1X73N6zU8AAAABtO7hnqk0041.jpg

3.4.3.  添加go环境变量

vi /etc/profile,添加如下

GOROOT=/usr/local/go

GOPATH=/usr/local/go/work

wKiom1X72lySLbunAAE6YL1Pb7I784.jpg

source /etc/profile

wKioL1X73JWyUn-IAABDRkfmggA185.jpg

3.5.安装Development Tool,git

yum install -y “Development Tool

yum install –y git

3.6.安装codis

3.6.1.  下载编译codis

    go get -u-d github.com/wandoulabs/codis

wKioL1X73JbhWjNnAAEZ2EBDY_0585.jpg

cd $GOPATH/src/github.com/wandoulabs/codis

./bootstrap.sh

wKiom1X72lyBGSl2AAM8zeFVZmM911.jpg


make gotest

wKioL1X73JaTANkAAAJufD9OAR8174.jpg

3.6.2.  编辑config.ini文件

修改zookeeper地址和dashboard地址:vi config.ini

wKioL1X73dehW3QnAAGhfUdXR-4388.jpg


wKiom1X7256jillkAABBbbAVCPA053.jpg


wKioL1X73drDArVMAAA6lboN8-0138.jpg


每个proxyproxy_id必须不同

3.6.3.  启动dashboard

mkdir log

./bin/codis-config-c config.ini -L ./log/dashboard.log dashboard &

wKioL1X73gTDLXB8AACkhwEBgRA199.jpg

3.6.4.  初始化solts

./bin/codis-config -c config.ini slot init –f

wKiom1X729zgUC-3AACkV0_i33Y004.jpg

3.6.5.  启动codis-server

  • 启动mastermkdir 7000

cp extern/redis-2.8.21/redis.conf 7000/

修改portbindmaxmemoryvi 7000/redis.conf

wKioL1X73kLxMAPUAAASLbt13o4618.jpg

wKiom1X73Amx1rS2AAAj5edBwD4231.jpg

wKiom1X73AnhRJsNAAAjmGzV868849.jpg


启动:./bin/codis-server 7000/redis.conf

wKiom1X73CHB3Kd3AAEQWTBbAO8511.jpg

  • 启动slave mkdir 7001

cp extern/redis-2.8.21/redis.conf 7001/

修改portbindmaxmemoryvi 7001/redis.conf

wKioL1X73n-jx1ffAAARevVpVMA641.jpg

wKiom1X73Amx1rS2AAAj5edBwD4231.jpg

wKiom1X73AnhRJsNAAAjmGzV868849.jpg

启动:./bin/codis-server 7001/redis.conf

wKiom1X73FvRKsdRAAEQWTBbAO8718.jpg

3.6.6.  添加redis server group

./bin/codis-config -cconfig.ini server add 1 192.168.92.137:7000 master

wKioL1X73rrhJ6mPAACfCHmLWQU813.jpg

./bin/codis-config -c config.ini server add1 192.168.92.137:7001 slave

wKiom1X73KXB79k5AACLPZUSQGU947.jpg

192.168.92.138节点启动redis如上

3.6.7.   设置server group 服务的 slot范围

./bin/codis-config -c config.ini slotrange-set 0 600 1 online

./bin/codis-config -c config.ini slotrange-set 601 1023 2 online

wKiom1X73MaiodXZAAD4B0kNL6Y057.jpg

3.6.8.  启动 codis-proxy

bin/codis-proxy -c config.ini -L ./log/proxy.log  --cpu=1 --addr=0.0.0.0:19000--http-addr=0.0.0.0:11000 &

wKioL1X73yDzdlbDAADxq9L8_sg880.jpg

3.6.9.  浏览器访问

http://192.168.92.136:18087/admin/


wKioL1X730bhT95nAAHjz4fU2d8294.jpg

wKiom1X73Q2jftZfAAJBjCDht5I308.jpg

4.  数据迁移

group_1solt599600迁移到group_2

wKiom1X73S6ynCNPAADmKc3xtwo364.jpg

4.1.命令行迁移方式

执行:bin/codis-config -c config.ini slot migrate 599 600 2 --delay=10

4.2.Dashboard迁移方式

wKiom1X73VKB0H3UAABYydOdvwI708.jpg

wKioL1X734ygjx-YAAC63A-ap48581.jpg


5.  Auto Rebalance

Codis 支持动态的根据实例内存, 自动对slot进行迁移, 以均衡数据分布.

要求:

  • 所有的codis-server都必须设置了maxmemory参数

  • 所有的 slots 都应该处于 online 状态, 即没有迁移任务正在执行

  • 所有 server     group 都必须有 Master

5.1.命令行方式:

$ bin/codis-config slot rebalance

5.2.Dashboard方式

wKiom1X73XLSUhJsAABX2U1ffiQ395.jpg

6.  HA

当一个groupmaster挂掉的时候,codis不会自动的将某个slave升级成master

该工具会在检测到master挂掉的时候将其下线并选择其中一个slave提升为master继续提供服务

go get github.com/ngaut/codis-ha

cd /usr/local/go/work/src/github.com/ngaut/codis-ha

go build

./codis-ha--codis-config=192.168.92.136:18087 --productName=test &

wKioL1X738LhXQ8NAABkWFcUjE0637.jpg

7.  Jodis客户端

使用循环调度策略方式多个proxy

<dependency>
    <
groupId>com.wandoulabs.jodis</groupId>
    <
artifactId>jodis</artifactId>
    <
version>0.1.2</version>
</
dependency>

 

JedisResourcePool jedisPool = new RoundRobinJedisPool("192.168.92.137:2181", 30000, "/zk/codis/db_test/proxy", new JedisPoolConfig());
try (Jedis jedis = jedisPool.getResource()) {
    jedis.set(
"key11", "bar");
    String value = jedis.get(
"key11");
    System.
out.println(value);
}

 

8.  Codis不支持的命令

Command Type

Command Name

Keys

KEYS


MIGRATE


MOVE


OBJECT


RANDOMKEY


RENAME


RENAMENX


SCAN



Strings

BITOP


MSETNX



Lists

BLPOP


BRPOP


BRPOPLPUSH



Pub/Sub

PSUBSCRIBE


PUBLISH


PUNSUBSCRIBE


SUBSCRIBE


UNSUBSCRIBE



Transactions

DISCARD


EXEC


MULTI


UNWATCH


WATCH



Scripting

SCRIPT



Server

BGREWRITEAOF


BGSAVE


CLIENT


CONFIG


DBSIZE


DEBUG


FLUSHALL


FLUSHDB


LASTSAVE


MONITOR


RESTORE


SAVE


SHUTDOWN


SLAVEOF


SLOWLOG


SYNC


TIME



Codis Slot

SLOTSCHECK


SLOTSDEL


SLOTSINFO


SLOTSMGRTONE


SLOTSMGRTSLOT


SLOTSMGRTTAGONE


SLOTSMGRTTAGSLOT

 

9.  Codis半支持的命令

需要将以下key放入同一slot才能支持,方式采用{},如key“bar{zap}”,则只会对zap进行hash

Command Type

Command Name

Lists

RPOPLPUSH

Sets

SDIFF


SINTER


SINTERSTORE


SMOVE


SUNION


SUNIONSTORE

Sorted Sets

ZINTERSTORE


ZUNIONSTORE

HyperLogLog

PFMERGE

Scripting

EVAL


EVALSHA

10.  附录

10.1.修改dashboard端口号

 1.修改config文件

dashboard_addr=192.168.92.136:19001

 2.启动命令变更为:

./bin/codis-config -cconfig.ini -L ./log/dashboard.log dashboard --addr=192.168.92.136:19001 &

wKiom1bG5kCxdkFTAAA93QWN0aU463.png

wKiom1bG5mvB5pVPAAD6tG9t6fE412.jpg