Codis-分布式安装和部署

作者 Gavin 日期 2016-02-25
Codis-分布式安装和部署

最近在做的一个广告系统涉及到zk和Codis的应用,其中zk扮演了分布式配置管理以及集群管理者的角色,Codis还是分布式缓存的角色。对于zk,有时间的时候再输出一篇文章介绍下它的原理和在分布式集群管理中应用。

对于Codis,相信大家应该不陌生了,它是豌豆荚孵化的一个分布式 Redis 解决方案。Github地址:Codis

详细介绍:Codis简介

官方介绍里对于新版的Codis没有详细的安装步骤,因此踩了一些坑…

由于Codis是依赖Go的,所以安装Codis之前,首先得配置好Go环境

  • Step 1:安装Golang
    可以到Golang中国下载Go包,或者翻墙到 Golang.org
    注意的地方是环境变量里GOPATH的设置:假定安装路径为:/data/app/go

    1
    2
    3
    4
    5
    #设置GOPATH
    #Add For Go
    export GOROOT=/data/app/go
    export GOPATH=/data/www/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

由于Codis的配置是保存在zk中的,我们还需要安装zk

  • Step 2:安装zk

  • Step 3:安装Codis

    1. 执行go get -u -d github.com/CodisLabs/codis下载codis代码

    2. 切换到$GOPATH/src/github.com/CodisLabs/codis目录执行make命令编译代码,并执行make gotest来跑测试
      (如果你也有强迫症,可以把make完后的codis文件夹放到 /data/app 下~)

  • Step 4:修改config.ini

    1. zk=127.0.0.1:2181 #zk addr
    2. dashboard_addr=127.0.0.1:18087 #dashboard访问addr&port
  • Step 5:启动Codis

    1. 启动dashboard

      1
      2
      cd /data/app/codis/
      nohup bin/codis-config dashboard > /dev/null &
    2. 启动codis-server

      1
      2
      3
      4
      nohup bin/codis-server --port 6379 > /dev/null &
      nohup bin/codis-server --port 6380 > /dev/null &
      nohup bin/codis-server --port 6381 > /dev/null &
      nohup bin/codis-server --port 6382 > /dev/null &

      这里我启动了4个codis-server实例,做两个group,每个group包含一主一从

    3. 添加group & master、slave

      1
      2
      3
      4
      bin/codis-config server add 1 127.0.0.1:6379 master
      bin/codis-config server add 1 127.0.0.1:6380 slave
      bin/codis-config server add 2 127.0.0.1:6381 master
      bin/codis-config server add 2 127.0.0.1:6382 slave

      添加完毕后,可在zk中看到数据:/zk/codis/db_test/servers/group_1, /zk/codis/db_test/servers/group_1

    4. 设置分片

      1
      2
      3
      4
      bin/codis-config slot init
      #设置分片范围
      bin/codis-config slot range-set 0 511 1 online
      bin/codis-config slot range-set 512 1024 2 online
    5. 启动proxy

      1
      nohup bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=1 --addr=127.0.0.1:19000 --http-addr=127.0.0.1:11000 > /dev/null &

备注:在启动proxy的时候应该把所有的slot都分配到group中,否则会一直启动到online状态失败

到这Codis一个测服的环境已经搭建好了~

Q & A:

  • [error]: dashboard already exists: {"addr": "127.0.0.1:18087", "pid": 2927}
    zk中dashboard节点已存在,请删除codis在zk的dashboard的节点数据:delete /zk/codis/db_test/dashboard

  • [error]: http status code 500, dial tcp localhost:6380: getsockopt: connection refused
    请把localhost替换成127.0.0.1或者修改下hosts

  • [error]: http status code 500, dial tcp 127.0.0.1:6380: getsockopt: connection refused
    请先把codis-server 6380启动起来再添加group

  • [error]: http status code 500, slot {
    “product_name”: “test”,
    “id”: 804,
    “group_id”: -1,
    “state”: {
    “status”: “offline”,
    “migrate_status”: {

    "from": -1,
    "to": -1
    

    },
    “last_op_ts”: “0”
    }
    } is not online or migrate 启动proxy或者设置状态为online时容易出现该错误
    一般是因为有slot迁移任务导致,查看数据迁移任务是否是需要的,如果不需要,则在zk里对应删除:delete /zk/codis/db_test/migrate_tasks/0000000000

  • [error]: slot {
    “product_name”: “test”,
    “id”: 1023,
    “group_id”: -1,
    “state”: {
    “status”: “offline”,
    “migrate_status”: {

    "from": -1,
    "to": -1
    

    },
    “last_op_ts”: “0”
    }
    } is not online or migrate 启动proxy时报错
    表明1023节点的slot还是off状态,将它分配到group里之后就OK了