您的位置:首页 > 其它

codis 3.0安装部署

2016-07-06 15:12 260 查看

1        前言

 

在安装codis之前,需要先将go安装好。Codis是使用go语言编译的。

 

2        概要

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

 

Codis3.x 由以下组件组成:

 Codis Server:基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。 

l  Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。 

对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;

不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

l  Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。 

对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;

所有对集群的修改都必须通过 codis-dashboard 完成。

l  Codis Admin:集群管理的命令行工具。 

可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。

l  Codis FE:集群管理界面。 

多个集群实例共享可以共享同一个前端展示页面;

通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。

l  Codis HA:为集群提供高可用。 

依赖 codis-dashboard 实例,自动抓取集群各个组件的状态;

会根据当前集群状态自动生成主从切换策略,并在需要时通过 codis-dashboard 完成主从切换。

Storage:为集群状态提供外部存储。 

提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;

目前仅提供了Zookeeper 和 Etcd 两种实现,但是提供了抽象的interface 可自行扩展。

 

3        Codis 安装

 

3.1      Github目录

在本地建立src目录,下载的代码放在这个目录下。

 

3.2      Codis代码下载

代码下载URL
https://github.com/CodisLabs/codis/tree/release3.0
下载的代码包为 codis-release3.0.zip

 

将代码按github的目录结构展开放在 src/github.com/CodisLabs/codis目录下

 

3.3      Codis依赖的软件包

 

3.3.1      godep

从github下载godep源码,下载release版本,

 

https://github.com/tools/godep

 

解压放在src/tools/godep目录下,然后使用go build命令编译godep。编译完成后,使用go install 安装godep。

 

3.3.2      BurntSushi/toml

从github下载toml源码,下载master版本,

 

https://github.com/BurntSushi/toml

 

解压放在src/BurntSushi/toml目录下,等待使用。

 

3.3.3      Codegangsta/inject

从github下载inject源码,下载master版本,

 

https://github.com/codegangsta/inject

 

解压放在src/codegangsta/inject目录下,等待使用。

 

3.3.4      Coreos/etcd

从github下载etcd源码,下载release-2.2版本,

 

https://github.com/coreos/etcd

 

解压放在src/coreos/etcd目录下,等待使用。

 

3.3.5      Docopt/docopt-go

从github下载etcd源码,下载master版本,

 

https://github.com/docopt/docopt-go

 

解压放在src/cocopt-go目录下,等待使用。

 

3.3.6      Garyburd/redigo

从github下载redigo源码,下载master版本,

 

https://github.com/garyburd/redigo

 

解压放在src/garyburd/redigo目录下,等待使用。

 

3.3.7      Go-martini/martini

从github下载martini源码,下载master版本,

 

https://github.com/codegangsta/inject

 

解压放在src/codegangsta/inject目录下,等待使用。

 

3.3.8      Martini-contrib/binding, gzip,render

从github下载binding, gzip, render源码,下载master版本,

 

https://github.com/martini-contrib/binding

https://github.com/martini-contrib/gzip

https://github.com/martini-contrib/render

 

解压放在src/martini-contrib/binding, gzip, render目录下,等待使用。

 

3.3.9      Oxtoacart/bpool

从github下载redigo源码,下载master版本,

 

https://github.com/oxtoacart/bpool

 

解压放在src/oxtoacart/bpool目录下,等待使用。

 

3.3.10 Samuel/go-zookeeper

从github下载go-zookeeper源码,下载master版本,

 

https://github.com/samuel/go-zookeeper

 

解压放在src/samuel/go-zookeeper目录下,等待使用。

 

3.3.11 Ugorgi/go

从github下载go源码,下载master版本,

 

https://github.com/ugorgi/go

 

解压放在src/ugorigi/go目录下,等待使用。

 

3.3.12 Golang.com/x/net

从github下载net源码,下载release-branch.go1.6版本,

 

https://github.com/golang.com/net

 

解压放在src/golang.com/x/net目录下,等待使用。

 

3.4      编译

进入src/github.com/codislabs/codis目录,创建Godeps/_workspace/src/github目录。将以上下载的,除了godep之外的软件包,复制到Godeps/_workspace/src/github目录下。然后就可以编译了。

 

编译过程中会出现下载 golang.com/x/net失败的提示,不用理睬。

 

编译完成后,会在bin目录下生成,

Codis-admin

Codis-dashboard

Codis-fe

Codis-ha

Codis-proxy

Codis-server

6个文件。

 

4        Codis部署

4.1      ZooKeeper

4.1.1      zooKeeper是什么

 

Zookeeper是一个多服务间的协调服务,角色类似于 RFS 系统的 Publisher或 TOSF 框架的 BB。

 

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

 

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

 

因此 Zookeeper 只需安装在一台特定的机器上即可(为了高可用,也可以做成集群)。

4.1.2      下载ZooKeeper

在用户目录下新建src目录,下载ZooKeeper安装包放到$HOME/src/目录下,解压。

 

mkdir -p $HOME/src/

cd $HOME/src/

tar -xjf zookeeper-3.4.6.tar.bz2

rm zookeeper-3.4.6.tar.bz2

4.1.3      配置ZooKeeper

进入解压后的目录,conf目录下有zoo_sample.cfg文件,可自行配置,ZooKeeper默认启动在2181端口

 

cd $HOME/src/zookeeper-3.4.6/conf

cp zoo_sample.cfg zoo.cfg

 

4.1.4      启动ZooKeeper

进入bin目录,启动ZooKeeper

 

cd $HOME/src/zookeeper-3.4.6/bin

./zkServer.sh start

 

4.1.5      验证ZooKeeper

ZooKeeper启动后,在本机监听一个端口,可以通过 nc 向此端口发指令进行验证,如果启动成果会返回imok。

 

echo ruok | nc [zookeeper_server_ip] [zookee
c1a3
per_server_port]

举例:

echo ruok | nc 192.168.0.5 2181

 

4.2      Codis Dashboard

Coddis3.0的dashboard与codis 2.0有所不同,作为集群管理工具,它支持 codis-proxy、codis-server的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。有以下两点注意事项:

l  对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;

l  所有对集群的修改都必须通过 codis-dashboard 完成。

4.2.1      配置dashboard

默认配置文件 dashboard.toml 可由 codis-dashboard 生成

 

./bin/codis-dashboard --default-config | tee dashboard.toml

 

生成dashboard.toml文件,可自行配置

# Set Coordinator, only accept"zookeeper"&"etcd"

coordinator_name = "zookeeper"

coordinator_addr = "127.0.0.1:2181"

 

# Set Codis Product {Name/Auth}.

product_name = "codis-demo"

product_auth = ""

 

# Set bind address for admin(rpc), tcp only.

admin_addr = "0.0.0.0:18080"

 

coordinator_name              外部存储类型,接受 zookeeper/etcd

coordinator_addr                外部存储地址

product_name                    集群名称,满足正则 \w[\w\.\-]*

product_auth                                                                                       集群密码,默认为空

admin_addr                       RESTful API 端口

4.2.2      启动dashboard

4.2.2.1 启动指令

$ nohup ./bin/codis-dashboard --ncpu=4 --config=dashboard.toml--log=dashboard.log --log-level=WARN &

4.2.2.2 参数说明

$ ./bin/codis-dashboard -h

Usage:

    codis-dashboard [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR]

    codis-dashboard  --default-config

    codis-dashboard  --version

 

Options:

    --ncpu=N                    最大使用 CPU 个数

    -c CONF, --config=CONF      指定启动配置文件

    -l FILE, --log=FILE         设置 log 输出文件

--log-level=LEVEL           设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

4.3      Codis Proxy

 

客户端连接的 Redis 代理服务, 实现了 Redis 协议。除部分命令不支持以外(不支持的命令列表),表现的和原生的
Redis 没有区别(就像 Twemproxy)。有以下两点注意事项:

 

l  对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;

l  不同 codis-proxy 之间由 codis-dashboard 保证状态同步。

4.3.1      配置proxy

 

默认配置文件 proxy.toml 可由 codis-proxy 生成。

$ ./bin/codis-proxy --default-config | tee proxy.toml

生成proxy.toml,可自行配置

# Set Codis Product {Name/Auth}.

product_name = "codis-demo"

product_auth = ""

 

# Set bind address for admin(rpc), tcp only.

admin_addr = "0.0.0.0:11080"

 

# Set bind address for proxy, proto_type can be "tcp","tcp4", "tcp6", "unix" or "unixpacket".

proto_type = "tcp4"

proxy_addr = "0.0.0.0:19000"

 

# Set jodis address & session timeout.

jodis_addr = ""

jodis_timeout = 10

 

# Proxy will ping-pong backend redis periodly to keep-alive

backend_ping_period = 5

 

# If there is no request from client for a long time, the connectionwill be droped. Set 0 to disable.

session_max_timeout = 1800

 

# Buffer size for each client connection.

session_max_bufsize = 131072

 

# Number of buffered requests for each client connection.

# Make sure this is higher than the max number of requests for eachpipeline request, or your client may be blocked.

session_max_pipeline = 1024

 

# Set period between keep alives. Set 0 to disable.

session_keepalive_period = 60

 

product_name                                 集群名称,参考 dashboard 参数说明

product_auth                                   集群密码,默认为空

admin_addr                                     RESTfulAPI 端口

proto_type                                       Redis 端口类型,接受 tcp/tcp4/tcp6/unix/unixpacket

proxy_addr                                      Redis 端口地址或者路径

jodis_addr                                       Jodis 注册 zookeeper 地址

jodis_timeout                                  Jodis 注册 sessiontimeout 时间,单位 second

backend_ping_period                     与 codis-server 探活周期,单位 second,0 表示禁止

session_max_timeout                    与 client 连接最大读超时,单位 second,0 表示禁止

session_max_bufsize                     与 client 连接读写缓冲区大小,单位 byte

session_max_pipeline                    与 client 连接最大的 pipeline 大小

session_keepalive_period              与 client 的 tcp keepalive 周期,仅 tcp 有效,0 表示禁止

 

4.3.2      启动proxy

4.3.2.1 启动指令

$ nohup ./bin/codis-proxy --ncpu=4 --config=proxy.toml \

--log=proxy.log --log-level=WARN &

codis-proxy启动后,处于 waiting 状态,监听proxy_addr 地址,但是不会 accept 连接,添加到集群并完成集群状态的同步,才能改变状态为 online。添加的方法有以下两种:

 

l  通过 codis-fe 添加:通过 Add Proxy 按钮,将 admin_addr 加入到集群中;

l  通过 codis-admin 命令行工具添加,方法如下:

 

$ ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x127.0.0.1:11080

 

其中 127.0.0.1:18080 以及 127.0.0.1:11080 分别为 dashboard 和 proxy 的 admin_addr 地址;

 

添加过程中,dashboard 会完成如下一系列动作:

 

① 获取 proxy 信息,对集群 name 以及 auth 进行验证,并将其信息写入到外部存储中;

② 同步 slots 状态;

③ 标记 proxy 状态为 online,此后 proxy 开始 accept 连接并开始提供服务;

 

4.3.2.2 参数说明

$ ./bin/codis-proxy -h

Usage:

    codis-proxy [--ncpu=N][--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR][--host-proxy=ADDR] [--ulimit=NLIMIT]

    codis-proxy  --default-config

    codis-proxy  --version

 

Options:

    --ncpu=N                    最大使用 CPU 个数

    -c CONF, --config=CONF      指定启动配置文件

    -l FILE, --log=FILE         设置 log 输出文件

    --log-level=LEVEL           设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

    --ulimit=NLIMIT             检查 ulimit -n 的结果,确保运行时最大文件描述不少于 NLIMIT

 

4.4      Codis Server

基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档redis的修改

启动./bin/codis-server与启动普通redis的方法一致,启动完成后,可以通过codis-fe提供的界面或者codis-admin命令行工具添加到集群中。

4.5      Codis FE(可选 组件)

4.5.1      集群管理界面

l  多个集群实例共享可以共享同一个前端展示页面;

l  通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。

4.5.2      配置codis-fe

配置文件 codis.json 可以手动编辑,也可以通过 codis-admin 从外部存储中拉取

$ ./bin/codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee codis.json

[

    {

"name": "codis-demo",

"dashboard": "127.0.0.1:18080"

    },

    {

"name": "codis-demo2",

"dashboard": "127.0.0.1:28080"

    }

]

4.5.2.1 启动codis-fe

$ nohup ./bin/codis-fe --ncpu=4 --log=fe.log --log-level=WARN \

    --dashboard-list=codis.json--listen=127.0.0.1:8080 &

4.5.2.2 参数说明

$ ./bin/codis-fe -h

Usage:

    codis-fe [--ncpu=N][--log=FILE] [--log-level=LEVEL] --dashboard-list=LIST --listen=ADDR

    codis-fe  --version

 

Options:

    --ncpu=N                        最大使用 CPU 个数

    -d LIST,--dashboard-list=LIST  配置文件,能够自动刷新

    -l FILE, --log=FILE             设置 log 输出文件

    --log-level=LEVEL               设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

--listen=ADDR                   HTTP 服务端口

4.6      Codis HA(可选组件)

4.6.1      工作原理

 

注意:Codis HA 工具仅仅是 Codis 集群 HA 的一部分,单独工作能力有限。

 

l  默认以 5s 为周期,codis-ha 会从 codis-dashboard 中拉取集群状态,并进行主从切换;

 

l  codis-ha 在以下状态下会退出:

 

i.从 codis-dashboard 获取集群状态失败时;

ii.向 codis-dashboard 发送主从切换指令失败时;

 

l  codis-ha 在以下状态下不会进行主从切换:

 

i.存在 proxy 状态异常:

n  因为提升主从需要得到所有 proxy 的确认,因此必须确保操作时所有 proxy 都能正常响应操作指令;

ii.网络原因造成的 master 异常:

n  若存在 slave 满足 slave.master_link_status == up,通常可以认为master 并没有真的退出,而是由于网络原因或者响应延迟造成的 master 状态获取失败,此时 codis-ha 不会对该 group 进行操作;

n  没有满足条件的 slave 时:

n  提升过程会选择满足 slave.master_link_status == down,并且 slave.master_link_down_since_seconds 最小的进行操作。这就要求被选择的 slave 至少在过去一段时间内与 master 是成功同步状态,这个时间间隔是 2d+5,其中 d 是 codis-ha 检查周期默认 5秒。

 

注意:因此,应用 codis-ha 时还需要结合对 codis-proxy 和 codis-server 的可用性监控,否则 codis-ha 无法保证可靠性。

 

需要注意:codis将其中一个slave升级为master时,该组内其他slave实例是不会自动改变状态的,这些slave仍将试图从旧的master上同步数据,因而会导致组内新的master和其他slave之间的数据不一致。因为redis的slaveof命令切换master时会丢弃slave上的全部数据,从新master完整同步,会消耗资源。因此,当出现主从切换时,需要管理员手动创建新的sync
action来完成新master与slave之间的数据同步。Codis-ha不会自动刷新其他slave的状态。

 

 

4.6.2      启动codis-ha

4.6.2.1 启动指令

$ nohup ./bin/codis-ha --log=ha.log --log-level=WARN--dashboard=127.0.0.1:18080 &

4.6.2.2 参数说明

$ ./bin/codis-ha -h

Usage:

    codis-ha [--log=FILE][--log-level=LEVEL] --dashboard=ADDR

    codis-ha  --version

 

Options:

    -l FILE, --log=FILE         设置 log 输出文件

--log-level=LEVEL           设置 log 输出等级:INFO,WARN,DEBUG,ERROR;默认INFO,推荐WARN

 

4.7      Codis Admin(命令行工具)

注意:使用 codis-admin 是十分危险的。

4.7.1      codis-dashboard 异常退出的修复

当 codis-dashboard 启动时,会在外部存储上存放一条数据,用于存储 dashboard 信息,同时作为 LOCK 存在。当 codis-dashboard 安全退出时,会主动删除该数据。当 codis-dashboard 异常退出时,由于之前 LOCK 未安全删除,重启往往会失败。因此 codis-admin 提供了强制删除工具:

 

1.确认 codis-dashboard 进程已经退出(很重要);

2.运行 codis-admin 删除 LOCK:

$ ./bin/codis-admin --remove-lock --product=codis-demo--zookeeper=127.0.0.1:2181

 

4.7.2      codis-proxy 异常退出的修复

通常 codis-proxy 都是通过 codis-dashboard 进行移除,移除过程中 codis-dashboard 为了安全会向 codis-proxy 发送 offline 指令,成功后才会将 proxy 信息从外部存储中移除。如果 codis-proxy 异常退出,该操作会失败。此时可以使用 codis-admin 工具进行移除:

 

1.确认 codis-proxy 进程已经退出(很重要);

2.运行 codis-admin 删除 proxy:

$ ./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy--addr=127.0.0.1:11080 --force

选项 --force 表示,无论 offline 操作是否成功,都从外部存储中将该节点删除。所以操作前,一定要确认该 codis-proxy 进程已经退出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codis3.0 安装