codis

  • [ ] ### 1,关于豌豆荚开源的Codis {#1关于豌豆荚开源的codis}

Codis是豌豆荚使用GoC语言开发、以代理的方式实现的一个Redis分布式集群解决方案,且完全兼容Twemproxy。Twemproxy对于上一层的应用来说, 连接Codis Proxy(Redis代理服务)和连接原生的Redis服务器没有明显的区别,上一层应用能够像使用单机的 Redis一样对待。Codis底层会处理请求的转发、不停机的数据迁移等工作, 所有底层的一切处理, 对于客户端来说是透明的。总之,可以简单的认为后台连接的是一个内存无限大的Redis服务。Codis遵循MIT开源协议发布,更多关于Codis的信息请登录其在GitHub的主页查看。

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

Codis 由四部分组成:

Codis Proxy (codis-proxy)
Codis Manager (codis-config)
Codis Redis (codis-server)
ZooKeeper

架构图:

项目地址:
https://github.com/wandoulabs/codis
中文说明文档:
https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md
Redis 开源集群方案:
http://www.infoq.com/cn/news/2014/11/open-source-redis-cache
Redis 3.0 rc4已经发布了,也是一种方案可以研究下,线上系统不建议使用。

2,安装Codis&配置

参考文档:
https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md#build-codis-proxy–codis-config
首先按照golang,下载地址:https://golang.org/dl/,最新的1.4.2版本。
如果被墙使用golang中国下载http://golangtc.com/download

cd /usr/loca/
wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
tar -zxvf go1.4.2.linux-amd64.tar.gz

设置环境变量,vi /etc/profile

[root@vm root]$ vim /etc/profile
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/home/user/go

[root@vm root]$ source /etc/profile
[root@vm root]$ go version

下载codis

Codis 源代码需要下载到 $GOPATH/src/github.com/CodisLabs/codis:

$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2

4. 编译 Codis 源代码

直接通过 make 进行编译,会看到如下输出:

$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
问题7:缺少autoconf
make all PLAT=linux SKYNET_LIBS="-lpthread -lm -ldl -lrt" SHARED="-fPIC --shared" EXPORT="-Wl,-E" MALLOC_STATICLIB="3rd/jemalloc/lib/libjemalloc_pic.a" SKYNET_DEFINES=""
make[1]: Entering directory `/data/skynet'
cd 3rd/jemalloc && ./autogen.sh --with-jemalloc-prefix=je_ --disable-valgrind
autoconf
./autogen.sh: line 5: autoconf: command not found
Error 0 in autoconf
make[1]: *** [3rd/jemalloc/Makefile] Error 1
make[1]: Leaving directory `/data/skynet'
make: *** [linux] Error 2
解决:
yum -y install autoconf
└─(root@host-192-168-1-17)$ ls bin/
assets  codis-admin  codis-dashboard  codis-fe  codis-proxy  codis-server  redis-benchmark  redis-cli  version1. 快速启动

2分钟快速构建一个单机版测试 codis 集群,无任何外部组件依赖.

源码中 admin 文件夹提供了一系列脚本以便快速启动、停止各个组件,提高运维效率。

启动codis-dashboard

使用codis-dashboard-admin.sh脚本启动 dashboard,并查看 dashboard 日志确认启动是否有异常。

./admin/codis-dashboard-admin.sh start
 tail -100 ./log/codis-dashboard.log.2017-04-08
2017/04/08 15:16:57 fsclient.go:197: [INFO] fsclient - create /codis3/codis-demo/topom OK
2017/04/08 15:16:57 main.go:140: [WARN] [0xc42025f7a0] dashboard is working ...
2017/04/08 15:16:57 topom.go:424: [WARN] admin start service on [::]:18080

快速启动集群元数据存储使用filesystem,默认数据路径保存在/tmp/codis,若启动失败,请检查当前用户是否对该路径拥有读写权限。

启动codis-proxy

使用codis-proxy-admin.sh脚本启动 codis-proxy,并查看 proxy 日志确认启动是否有异常。

./admin/codis-proxy-admin.sh start
tail -100 ./log/codis-proxy.log.2017-04-08
2017/04/08 15:39:37 proxy.go:293: [WARN] [0xc4200df760] set sentinels = []
2017/04/08 15:39:37 main.go:320: [WARN] rpc online proxy seems OK
2017/04/08 15:39:38 main.go:210: [WARN] [0xc4200df760] proxy is working ...

启动codis-server

使用codis-server-admin.sh脚本启动 codis-server,并查看 redis 日志确认启动是否有异常。

./admin/codis-server-admin.sh start
tail -100 /tmp/redis_6379.log
5706:M 08 Apr 16:04:11.748 * DB loaded from disk: 0.000 seconds
5706:M 08 Apr 16:04:11.748 * The server is now ready to accept connections on port 6379

redis.conf 配置中 pidfile、logfile 默认保存在/tmp目录,若启动失败,请检查当前用户是否有该目录的读写权限。

启动codis-fe

使用codis-fe-admin.sh脚本启动 codis-fe,并查看 fe 日志确认启动是否有异常。

./admin/codis-fe-admin.sh start
tail -100 ./log/codis-fe.log.2017-04-08
2017/04/08 16:12:13 main.go:100: [WARN] set ncpu = 1
2017/04/08 16:12:13 main.go:103: [WARN] set listen = 0.0.0.0:9090
2017/04/08 16:12:13 main.go:115: [WARN] set assets = /home/codis/go/src/github.com/CodisLabs/codis/admin/../bin/assets
2017/04/08 16:12:13 main.go:153: [WARN] set --filesystem = /tmp/codis

通过fe添加group

通过web浏览器访问集群管理页面(fe地址:127.0.0.1:9090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加NEW GROUPNEW GROUP行输入 1,再点击NEW GROUP即可 添加 Codis Server,Add Server行输入我们刚刚启动的 codis-server 地址,添加到我们刚新建的 Group,然后再点击Add Server按钮即可,如下图所示

https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md


2. 启动及参数

注意:请按照顺序逐步完成操作。生产环境建议修改dashboard coordinator_name配置,使用zookeeperetctd作为外部存储。

注意:Codis 3.x 支持 AUTH,但是要求所有组件使用的 AUTH 必须完全相同。

2.1 Codis Dashboard

2.1.1 详细说明:
  • 启动参数说明:
$ ./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

参数--host-admin请参见与 Docker 有关章节。

默认配置文件:

$ ./bin/codis-dashboard --default-config | tee dashboard.toml
##################################################
#                                                #
#                  Codis-Dashboard               #
#                                                #
##################################################

# 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 端口

生成配置文件(仅需执行修改一次):

./bin/codis-dashboard --default-config | tee ./conf/dashboard.toml(就是dashboard.conf)
生成dashboard.toml文件,可自行配置。(默认配置文件dashboard.toml可由 codis-dashboard 生成。)

vi config/dashboard.toml

# 参数说明:
# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
coordinator_name = "zookeeper"  #外部存储类型,接受 zookeeper/etcd
#zookeeper是集群的话就写多个ip和端口用逗号隔开
coordinator_addr = "192.168.1.6:2181,192.168.1.10:2181,192.168.1.11:2181" #外部存储地址

# Set Codis Product Name/Auth.
product_name = "codis-server" #集群名称,满足正则 \w[\w\.\-]*
product_auth = ""  #集群密码,默认为空

# Set bind address for admin(rpc), tcp only.
admin_addr = "0.0.0.0:18080"#RESTful API 端口

# Set configs for redis sentinel.
sentinel_quorum = 2
sentinel_parallel_syncs = 1
sentinel_down_after = "30s"
sentinel_failover_timeout = "5m"
sentinel_notification_script = ""
sentinel_client_reconfig_script = ""

启动Codis Dashboard

3)启动

cd /root/upload/go/src/github.com/CodisLabs/codis
./bin/codis-dashboard --ncpu=4 --config=./config/dashboard.toml
./bin/codis-dashboard --ncpu=4 --config=./conf/dashboard.toml --log=./logs/dashboard.log --log-level=WARN

这里指定dashboard.toml也可以

nohup ./codis-dashboard --ncpu=4 --config=dashboard.toml --log=dashboard.log --log-level=INFO &

4)验证

ps -ef| grep codis查看dashboard-log.XXXX.XX.XX日志

2.2 Codis Proxy

1)初始化生成配置文件prxoy.toml

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

配置proxy,生成代理配置文件

./bin/codis-proxy --default-config | tee ./conf/proxy.conf(proxy.toml)

默认配置文件:

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

# Set Codis Product {Name/Auth}.
product_name = "codis-server"
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
jodis_compatible = false

# 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 connection will 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 each pipeline request, or your client may be blocked.
session_max_pipeline = 1024

# Set period between keep alives. Set 0 to disable.
session_keepalive_period = 60

2)修改参数

product_name和product_auth与上面一致

admin_addr:本地ip:11080 restful api地址

proxy_addr: 对外暴露ip:19000 redisClietn连接地址

jodis_name: ‘zookeeper’

jodis_addr:  ‘xxxx:2181’

jodis_compatible:fasle (3.0以上必须为false,true为兼容2.0)

例如下配置:vi config/proxy.toml

# Set Codis Product Name/Auth.

product_name = "codis-server"

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, only accept "zookeeper" & "etcd".

jodis_name = "zookeeper"

jodis_addr = "192.168.1.6:2181,192.168.1.10:2181,192.168.1.11:2181"

jodis_timeout = "20s"

jodis_compatible = false

生成的proxy.conf可自行配置:

3)启动codis-proxy

cd /root/upload/go/src/github.com/CodisLabs/codis
./bin/codis-proxy --ncpu=4 --config=./config/proxy.toml
nohup ./bin/codis-proxy --ncpu=4 --config=./conf/proxy.conf --log=./logs/proxy.log --log-level=WARN &

4)验证

ps -ef| grep codis

查看proxy-log.XXXX.XX.XX日志

2.2.1 详细说明:
  • 启动参数说明:
$ ./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

参数--host-proxy以及--host-admin请参见与 Docker 有关章节。

  • 注:Codis3 会将 jodis 节点注册在/jodis/{PRODUCT_NAME}下,这点与 Codis2 不太兼容,所以为了兼容性,可以考虑将jodis_compatible设置成true
2.2.2 启动命令:
$ nohup ./bin/codis-proxy --ncpu=4 --config=proxy.toml \
    --log=proxy.log --log-level=WARN &

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

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


添加proxy的方法有以下两种(选其中任意一种即可):

  • 通过 codis-fe 添加:通过Add Proxy按钮,将admin_addr加入到集群中;
  • 通过 codis-admin 命令行工具添加,方法如下:
$ ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 127.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 连接并开始提供服务;

/opt/codis/bin/codis-admin --proxy=127.0.0.1:11080 --auth="" --shutdown

正常关闭proxy操作

2.3 Codis Server

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

2.4 Codis FE(可选组件)

2.4.1 启动命令:
./bin/codis-fe --ncpu=4 --zookeeper=192.168.1.6:2181,192.168.1.10:2181,192.168.1.11:2181 --listen=0.0.0.0:8080

$ nohup ./bin/codis-fe --ncpu=4 --log=fe.log --log-level=WARN \
    --zookeeper=127.0.0.1:2181 --listen=127.0.0.1:8080 &
打开浏览器,在地址栏里输入http://127.0.0.1:8080,通过管理界面操作Codis。
2.4.2 详细说明:

启动参数说明:

$ ./bin/codis-fe -h
Usage:
    codis-fe [--ncpu=N] [--log=FILE] [--log-level=LEVEL] [--assets-dir=PATH] (--dashboard-list=FILE|--zookeeper=ADDR|--etcd=ADDR|--filesystem=ROOT) --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 服务端口

配置文件 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"
    }
]

2.5 Codis Admin(命令行工具)

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

2.5.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-server --zookeeper=192.168.1.6:2181
2.5.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=192.168.1.18:18080 --remove-proxy --addr=192.168.1.22:11080 --force
$ ./bin/codis-admin --dashboard=192.168.1.18:18080 --remove-proxy --addr=192.168.1.18:11080 --force

http://www.linuxidc.com/Linux/2017-03/141643p2.htm

一般启动命令如下:

通过命令增加代理:

./bin/codis-admin --dashboard=192.168.1.18:18080 --create-proxy -x 192.168.1.18:11080

./bin/codis-admin --dashboard=192.168.1.18:18080 --create-proxy -x 192.168.1.22:11080

启动bashboard

nohup bin/codis-dashboard --ncpu=4 --config=config/dashboard.toml --log=/tmp/dashboard.log --log-level=INFO &

启动proxy

nohup bin/codis-proxy --ncpu=4 --config=config/proxy.toml --log=/tmp/proxy.log --log-level=INFO &

启动fe

nohup bin/codis-fe --ncpu=4 --log=/tmp/fe.log --log-level=WARN --dashboard-list=config/codis.json --listen=192.168.46.151:8087 &

启动ha

nohup bin/codis-ha --log=/tmp/ha.log --log-level=WARN --dashboard=192.168.46.151:18080 &

报错:

└─(root@host-192-168-1-18)$ ./bin/codis-admin --dashboard=127.0.0.1:18080 --create-proxy -x 192.168.1.17:11080
2017/06/07 14:46:20 dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 127.0.0.1:18080 failed
[error]: [Remote Error] proxy-[79a1c51efbc08128f89fbb5f4b0a3124] already exists
    2   /root/upload/go/src/github.com/CodisLabs/codis/pkg/topom/topom_proxy.go:32
            github.com/CodisLabs/codis/pkg/topom.(*Topom).CreateProxy
    1   /root/upload/go/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go:244
            github.com/CodisLabs/codis/pkg/topom.(*apiServer).CreateProxy
    0   /root/upload/go/src/github.com/CodisLabs/codis/pkg/topom/topom_api.go:81
            github.com/CodisLabs/codis/pkg/topom.(*apiServer).CreateProxy-fm
[zk: 192.168.1.6:2181(CONNECTED) 0] ls /
[jodis, cluster, controller_epoch, controller, brokers, zookeeper, kafka-manager, admin, isr_change_notification, consumers, codis3, config]
[zk: 192.168.1.6:2181(CONNECTED) 1] ls /jodis
[codis-server]
[zk: 192.168.1.6:2181(CONNECTED) 2] ls /jodis/codis-server
[proxy-23e26cf412ad0b31e6c1b6ceb81bf498, proxy-79a1c51efbc08128f89fbb5f4b0a3124]
[zk: 192.168.1.6:2181(CONNECTED) 3] rmr /jodis/codis-server/proxy-79a1c51efbc08128f189fbb5f4b0a3124
Node does not exist: /jodis/codis-server/proxy-79a1c51efbc08128f189fbb5f4b0a3124
[zk: 192.168.1.6:2181(CONNECTED) 4] ls /jodis/codis-server                                         
[proxy-23e26cf412ad0b31e6c1b6ceb81bf498, proxy-79a1c51efbc08128f89fbb5f4b0a3124]
[zk: 192.168.1.6:2181(CONNECTED) 5] rmr /jodis/codis-server/proxy-79a1c51efbc08128f89fbb5f4b0a3124
[zk: 192.168.1.6:2181(CONNECTED) 6] rmr /jodis/codis-server

http://www.cnblogs.com/atomicbomb/p/6875327.html

报错:

(error) READONLY You can't write against a read only slave.

重置:

slaveof no one

./bin/codis-admin --reset-stats --proxy=192.168.1.18:11080

./bin/codis-admin --reset-stats --proxy=192.168.1.22:11080

https://github.com/CodisLabs/codis/blob/release3.1/doc/tutorial\_zh.md

results for ""

    No results matching ""