Codis是豌豆荚使用Go和C语言开发、以代理的方式实现的一个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已经发布了,也是一种方案可以研究下,线上系统不建议使用。
参考文档:
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
直接通过 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-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-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-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-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
通过web浏览器访问集群管理页面(fe地址:127.0.0.1:9090) 选择我们刚搭建的集群 codis-demo,在 Proxy 栏可看到我们已经启动的 Proxy, 但是 Group 栏为空,因为我们启动的 codis-server 并未加入到集群 添加NEW GROUP
,NEW 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
注意:请按照顺序逐步完成操作。生产环境建议修改dashboard coordinator_name配置,使用zookeeper
或etctd
作为外部存储。
注意:Codis 3.x 支持 AUTH,但是要求所有组件使用的 AUTH 必须完全相同。
$ ./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日志
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日志
$ ./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 有关章节。
/jodis/{PRODUCT_NAME}
下,这点与 Codis2 不太兼容,所以为了兼容性,可以考虑将jodis_compatible
设置成true
。
$ 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的方法有以下两种(选其中任意一种即可):
Add Proxy
按钮,将admin_addr
加入到集群中;$ ./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操作
/root/upload/go/src/github.com/CodisLabs/codis ./bin/codis-server ./config/redis.conf
./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。
启动参数说明:
$ ./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" } ]
注意:使用 codis-admin 是十分危险的。
当 codis-dashboard 启动时,会在外部存储上存放一条数据,用于存储 dashboard 信息,同时作为 LOCK 存在。当 codis-dashboard 安全退出时,会主动删除该数据。当 codis-dashboard 异常退出时,由于之前 LOCK 未安全删除,重启往往会失败。因此 codis-admin 提供了强制删除工具:
$ ./bin/codis-admin --remove-lock --product=codis-server --zookeeper=192.168.1.6:2181
通常 codis-proxy 都是通过 codis-dashboard 进行移除,移除过程中 codis-dashboard 为了安全会向 codis-proxy 发送offline
指令,成功后才会将 proxy 信息从外部存储中移除。如果 codis-proxy 异常退出,该操作会失败。此时可以使用 codis-admin 工具进行移除:
$ ./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