##1.先安装go
访问[https://golang.org/doc/install](http://https://golang.org/doc/install)
下载`go`包
```bash
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
#修改`/etc/profile`
vi /etc/profile
export PATH=$PATH:/usr/local/go/bin
#设置gopath
mkdir /opt/gopath
export GOPATH=/opt/gopath
#修改完后 运行以下命令是配置立即生效
source /etc/profile
```
##2.安装`zookeeper`
启动`codis`之前需要安装并启动`zookeeper`
下载地址:http://zookeeper.apache.org/releases.html#download
安装目录`/opt/zookeeper`
```bash
mkdir /opt/zookeeper/logs
vi /opt/zookeeper/conf/zoo.cfg
#配置文件
tickTime=2000
clientPort=2181
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
#启动zookeeper
sh /opt/zookeeper/bin/zkServer.sh start
```
##3.配置codis
```bash
go get -u -d github.com/wandoulabs/codis
cd $GOPATH/src/github.com/wandoulabs/codis
./bootstrap.sh
make gotest
```
修改`codis`目录下`config.ini`文件中ip为本机ip
###3.1 流程
0. **启动 `dashboard`**, 执行 `bin/codis-config dashboard`, 该命令会启动 `dashboard`
1. **初始化 slots** , 执行 bin/codis-config slot init,该命令会在zookeeper上创建slot相关信息
2. **启动 Codis Redis** , 和官方的Redis Server参数一样
3. **添加 Redis Server Group** , 每一个 Server Group 作为一个 Redis 服务器组存在, 只允许有一个 master, 可以有多个 slave, ***group id 仅支持大于等于1的整数***
```bash
$ bin/codis-config server -h usage:
codis-config server list
codis-config server add <group_id> <redis_addr> <role>
codis-config server remove <group_id> <redis_addr>
codis-config server promote <group_id> <redis_addr>
codis-config server add-group <group_id>
codis-config server remove-group <group_id>
```
如: 添加两个 server group, 每个 group 有两个 redis 实例,group的id分别为1和2, redis实例为一主一从。
添加一个group,group的id为1, 并添加一个redis master到该group
```bash
$ bin/codis-config server add 1 138.128.205.216:6379 master
```
添加一个redis slave到该group
```bash
$ bin/codis-config server add 1 138.128.205.216:6380 slave
```
类似的,再添加group,group的id为2
```bash
$ bin/codis-config server add 2 138.128.205.216:6479 master
$ bin/codis-config server add 2 138.128.205.216:6480 slave
```
4. **设置 server group 服务的 slot 范围** Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.
```bash
$ bin/codis-config slot -h
usage:
codis-config slot init
codis-config slot info <slot_id>
codis-config slot set <slot_id> <group_id> <status>
codis-config slot range-set <slot_from> <slot_to> <group_id> <status>
codis-config slot migrate <slot_from> <slot_to> <group_id> [--delay=<delay_time_in_ms>]
```
如:
设置编号为[0, 511]的 slot 由 server group 1 提供服务, 编号 [512, 1023] 的 slot 由 server group 2 提供服务
```bash
$ bin/codis-config slot range-set 0 511 1 online
$ bin/codis-config slot range-set 512 1023 2 online
```
**5. 启动 codis-proxy**
```bash
bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000
```
刚启动的 codis-proxy 默认是处于 offline状态的, 然后设置 proxy 为 online 状态, 只有处于 online 状态的 proxy 才会对外提供服务
```bash
bin/codis-config -c config.ini proxy online <proxy_name> <---- proxy的id, 如 proxy_1
```
**6. 打开浏览器 `http://localhost:18087/admin`**
现在可以在浏览器里面完成各种操作了, 玩得开心
##4.重新启动`codis`
每次启动`codis`都需要启动`zookepper`
有时候开始开启好了,把进程kill后还再执行
```bash
.../bin/codis-config dashboard
2015/07/03 11:41:17 dashboard.go:170: [info] dashboard listening on addr: :8086
2015/07/03 11:41:17 dashboard.go:244: [fatal] dashboard already exists: {"addr": "localhost:18087", "pid": 29013}
```
提示已经启动,但是没有进程没有端口,奇怪了,既然在本机上面没有到`zk`上面看看有没有呢
```bash
.../bin/zkCli.sh -server 138.128.205.216:2181
[zk: 138.128.205.216:2181(CONNECTED) 0] ls /zk/codis/db_test
[migrate_tasks, dashboard, actions, slots, ActionResponse]
[zk: 138.128.205.216:2181(CONNECTED) 1] rmr /zk/codis/db_test/dashboard
#删除后再启动就能启动了
```
##参考
[1] https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md
[2]
http://blog.csdn.net/dc_726/article/details/47052607
Codis搭建