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架构

3.  Codis部署

安装centos服务器3台:192.168.92.136,192.168.92.138,192.168.92.138

3.1.部署架构

codis redis版本 codis redis 区别_codis redis版本

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:7000、192.168.92.137:7001(主、从)

192.168.92.138:7000、192.168.92.138:7001(主、从)

3.3.部署

3.3.1.  关闭防火墙和selinux(略)

3.3.2.  安装jdk(略)

codis redis版本 codis redis 区别_redis_02

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/

codis redis版本 codis redis 区别_zookeeper_03

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

mv zoo_sample.cfg zoo.cfg

codis redis版本 codis redis 区别_codis redis版本_04

  • 编辑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

codis redis版本 codis redis 区别_zookeeper_05

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

codis redis版本 codis redis 区别_redis_06

3.3.3.4.     启动zookeeper

执行:./bin/zkServer.sh start

codis redis版本 codis redis 区别_Redis_07

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/


codis redis版本 codis redis 区别_Redis_08

3.4.3.  添加go环境变量

vi /etc/profile,添加如下

GOROOT=/usr/local/go

GOPATH=/usr/local/go/work

codis redis版本 codis redis 区别_codis redis版本_09

source /etc/profile

codis redis版本 codis redis 区别_redis_10

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


codis redis版本 codis redis 区别_redis_11

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

./bootstrap.sh

codis redis版本 codis redis 区别_codis redis版本_12




make gotest



codis redis版本 codis redis 区别_zookeeper_13

3.6.2.  编辑config.ini文件

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

codis redis版本 codis redis 区别_Redis_14


codis redis版本 codis redis 区别_Redis_15


codis redis版本 codis redis 区别_Redis_16


每个proxy的proxy_id必须不同

3.6.3.  启动dashboard

mkdir log

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

codis redis版本 codis redis 区别_Redis_17

3.6.4.  初始化solts

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

codis redis版本 codis redis 区别_Redis_18

3.6.5.  启动codis-server

  • 启动master:mkdir 7000

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

修改port、bind、maxmemory:vi 7000/redis.conf

codis redis版本 codis redis 区别_Redis_19

codis redis版本 codis redis 区别_codis redis版本_20

codis redis版本 codis redis 区别_zookeeper_21


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

codis redis版本 codis redis 区别_zookeeper_22

  • 启动slave:

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

修改port、bind、maxmemory:vi 7001/redis.conf

codis redis版本 codis redis 区别_codis redis版本_23

codis redis版本 codis redis 区别_codis redis版本_20

codis redis版本 codis redis 区别_zookeeper_21

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

codis redis版本 codis redis 区别_codis redis版本_26

3.6.6.  添加redis server group

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

codis redis版本 codis redis 区别_Redis_27

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

codis redis版本 codis redis 区别_Redis_28

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

codis redis版本 codis redis 区别_Redis_29

3.6.8.  启动

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 &

codis redis版本 codis redis 区别_zookeeper_30

3.6.9.  浏览器访问

http://192.168.92.136:18087/admin/


codis redis版本 codis redis 区别_zookeeper_31

codis redis版本 codis redis 区别_zookeeper_32

4.  数据迁移

将group_1的solt:599,600迁移到group_2

codis redis版本 codis redis 区别_codis redis版本_33

4.1.命令行迁移方式



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



4.2.Dashboard迁移方式

codis redis版本 codis redis 区别_Redis_34

codis redis版本 codis redis 区别_Redis_35


5.  Auto Rebalance

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

要求:

  • 所有的codis-server都必须设置了maxmemory参数
  • 所有的 slots 都应该处于 online 状态, 即没有迁移任务正在执行
  • 所有 server     group 都必须有 Master

5.1.命令行方式:

$ bin/codis-config slot rebalance

5.2.Dashboard方式

codis redis版本 codis redis 区别_zookeeper_36

6.  HA

当一个group的master挂掉的时候,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 &

codis redis版本 codis redis 区别_Redis_37

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 &


codis redis版本 codis redis 区别_zookeeper_38


codis redis版本 codis redis 区别_zookeeper_39