文章目录
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别,上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
环境准备
用到的软件清单:
- system:CentOS 6/7版本
- Jdk:1.8/1.7版本
- zookeeper : 3.4
- GO : go1.11.4.linux-amd64.tar.gz
- Codis : 3.0.3
机器端口一览
ps:zookeeper服务器这里直接使用已经搭建好的,没有具体的zookeeper搭建过程等
服务名称 | 服务器ip | 端口 |
---|---|---|
zookeeper | - | - |
zookeeper | - | - |
zookeeper | - | - |
proxy | 127.0.0.1 | 11080(admin)/19000 |
dashboard | 127.0.0.1 | 18080 |
redis (主) | 127.0.0.1 | 6501 |
redis (从) | 127.0.0.1 | 6502 |
fe | 127.0.0.1 | 8080 |
ha | 127.0.0.1 |
各个组件功能分析
-
Codis Server:基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改。
-
Codis Proxy:客户端连接的Redis代理服务, 实现了Redis协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的Redis没有区别(就像Twemproxy)。
- 对于同一个业务集群而言,可以同时部署多个codis-proxy实例;
- 不同codis-proxy之间由codis-dashboard保证状态同步。
-
Codis Dashboard:集群管理工具,支持codis-proxy、codis-serve的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy的状态的一致性。
- 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
- 所有对集群的修改都必须通过 codis-dashboard 完成。
-
Codis Admin:集群管理的命令行工具。
- 可用于控制codis-proxy、codis-dashboard状态以及访问外部存储。
-
Codis FE:集群管理界面。
- 多个集群实例共享可以共享同一个前端展示页面;
- 通过配置文件管理后端codis-dashboard列表,配置文件可自动更新。
-
Codis HA:为集群提供高可用。
- 依赖codis-dashboard实例,自动抓取集群各个组件的状态;
- 会根据当前集群状态自动生成主从切换策略,并在需要时通过codis-dashboard完成主从切换。
-
Storage:为集群状态提供外部存储。
- 提供Namespace概念,不同集群的会按照不同product name进行组织;
- 目前仅提供了Zookeeper和Etcd两种实现,但是提供了抽象的interface可自行扩展。
整体架构分析
- 服务端:codis-fe------codis-dashboard------codis-proxy------codis-group------codis-server
- 客户端:client------nginx-tcp------codis-proxy
- cdis-fe可以管理多个codis-dashboard
- 每个codis-dashboard代表一个产品线
- 每个codis-dashboard可以管理多个codis-proxy
- 每个codis-proxy可以管理多个codis-server
- group每个codis-server group至少由两个codis-server组成,最少1主1备
安装zookeeper
这里我是使用的现成的搭建好的zk集群,后面这里在进行信息补充
GO安装
因为Codis是go语言写的,所以这些机器需要安装go环境。
- 下载GO的软件包
cd /root/jiachang/go
wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
- 解压
tar xvf go1.11.4.linux-amd64.tar.gz -C /usr/local
- 解压完成后,GO就安装完了,下面设置一个GOPATH目录,其实就是go程序运行目录。
mkdir /usr/local/codis
设置GO的环境变量,编辑 /etc/profile文件
vim /etc/profile
##新增如下内容
export GOROOT=/usr/local/go
export GOPATH=/usr/local/codis
##在 PATH 变量后面增加如下内容
:$GOROOT/bin:$GOPATH/bin
应用环境变量
source /etc/profile
查看GO的版本
go version
go version go1.11.4 linux/amd64
godep安装
Codis编译的时候需要用到godep,不然会报错的。
$ mkdir -p $GOPATH/src/github.com/tools
$ cd $GOPATH/src/github.com/tools
$ go get -u github.com/tools/godep
$ cd godep
## 会将godep执行程序生成到$GOPATH/bin下
$ go install ./
然后将$GOPATH/bin加到/etc/profile.主要是引用godep命令
## 在PATH的最后追加
:$GOPATH/bin
应用环境变量
source /etc/profile
查看godep效果
[root@localhost bin]# godep version
godep v80 (linux/amd64/go1.11.4)
[root@localhost bin]# which godep
/usr/local/codis/bin/godep
下载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.0
编译Codis源码
直接通过 make 进行编译
$ cd $GOPATH/src/github.com/CodisLabs/codis
$ make
make -j -C extern/redis-2.8.21/
.........
这里噼里啪啦的有一堆东西输出
编译完成看下Codis产生的文件
在bin文件夹内生成codis-admin、codis-dashboard、codis-fe、codis-ha、codis-proxy、codis-server六个可执行文件。另外, bin/assets文件夹是codis-dashboard http服务需要的前端资源, 需要和codis-dashboard放置在同一文件夹下。
修改环境变量文件PATH变量的值,并生效。
## PATH 后面追加
:/usr/local/codis/src/github.com/CodisLabs/codis/bin/
## 应用生效
source /etc/profile
配置并启动Codis各组件之Redis
- 为Codis创建标准目录,用来存储Codis的脚本目录、配置文件目录、日志目录、PID目录、Redis配置目录等。
$ mkdir -p /data/codis/sh
$ mkdir -p /data/codis/conf
$ mkdir -p /data/codis/log
$ mkdir -p /data/codis/run
$ mkdir -p /data/codis/redis/bin
$ mkdir -p /data/codis/redis/redis-6501
$ mkdir -p /data/codis/redis/redis-6502
- 复制Codis自带的redis-2.8.21相关工具到标准目录中。
这里其实Codis基于Redis改造的,要把他源码的这些redis-server这些命令拷过来,等我们在控制台敲 redis-server 的时候,其实是用它改写过的脚本。
$ cd /usr/local/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src/
$ cp ./{redis-benchmark,redis-cli,redis-sentinel,redis-server} /data/codis/redis/bin/
- 添加环境变量并生效
## 在PATH后面追加
:/data/codis/redis/bin
source /etc/profile
- 编辑redis主从的配置文件并启动redis
vim /data/codis/redis/redis-6501/redis.conf
vim /data/codis/redis/redis-6502/redis.conf
使用codis-server 启动
$ codis-server /data/codis/redis/redis-6502/redis.conf
$ codis-server /data/codis/redis/redis-6501/redis.conf
配置并启动Codis各组件之Dashboard
- 首先生成默认的配置文件:
codis-dashboard --default-config | tee /data/codis/conf/dashboard.toml
- 修改配置文件
一般主要修改下zookeeper的地址即可,文件路径:/data/codis/conf/dashboard.toml
配置文件说明:
coordinator_name:外部存储类型,接受zookeeper/etcd,这里我们使用的zookeeper集群。
coordinator_addr:外部存储地址。
product_name:集群名称,满足正则\w[\w\.\-]*。
product_auth:集群密码,默认为空。
admin_addr:RESTful API端口。
- 启动dashboard
nohup codis-dashboard --ncpu=2 --config=/data/codis/conf/dashboard.toml --log=/data/codis/log/dashboard.log --log-level=WARN &
参数解释:
–ncpu=N:最大使用CPU个数。
-c CONF, –config=CONF:指定启动配置文件。
-l FILE, –log=FILE:设置log输出文件。
–log-level=LEVEL:设置log输出等级:INFO,WARN,DEBUG,ERROR,默认INFO,推荐WARN。
PS:dashboard只需要在一个节点启动即可,启动时会向zookeeper注册信息(topom),如果有其他节点也启动dashboard时,向zookeeper注册信息发现里面有信息时,就会无法启动的。
配置并启动Codis各组件之Proxy
- 生成默认的配置文件
$ codis-proxy --default-config | tee /data/codis/conf/proxy.toml
- 按照实际情况修改配置,这里主要修改下zk的地址
配置项说明
product_name:产品名称, 这个codis集群的名字, 可以认为是命名空间, 不同命名空间的codis没有交集。
product_auth:集群密码,默认为空。Codis 3.x支持AUTH,但是要求所有组件使用的AUTH必须完全相同。
admin_addr:RESTful API端口。
proto_type:Redis端口类型,接受tcp/tcp4/tcp6/unix/unixpacket。
proxy_addr:Proxy端口地址或者路径。
jodis_addr:Jodis注册zookeeper地址。
jodis_timeout:Jodis注册session timeout时间,单位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表示禁止。
- 启动Proxy
nohup codis-proxy --ncpu=2 --config=/data/codis/conf/proxy.toml --log=/data/codis/log/proxy.log --log-level=WARN &
启动命令说明:
–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。
codis-proxy启动后,处于waiting状态,监听proxy_addr地址,但是不会accept连接,添加到集群并完成集群状态的同步,才能改变状态为online。添加的方法有以下两种:
- 通过codis-fe添加,通过Add Proxy按钮,将admin_addr加入到集群中,如下图(具体操作要等到后面codis-fe启动后才可以):
- 通过codis-admin命令行工具添加,方法如下(添加3个proxy):
// 11080是proxy的admin_addr
codis-admin --dashboard=dashboard_ip:18080 --create-proxy -x proxy_ip:11080
其中–dashboard需要指定codis-dashboard的管理地址,–create-proxy指定为和codis-proxy的admin_addr地址,。添加过程中,codis-dashboard会完成如下一系列动作:
1)获取proxy信息,对集群name以及auth进行验证,并将其信息写入到外部存储中;
2)同步slots状态;
3)标记proxy状态为online,此后proxy开始accept连接并开始提供服务;
配置并启动Codis各组件之codis-fe
- 生成默认的配置文件,配置文件codis.json可以手动编辑,也可以通过codis-admin从外部存储(这里是zookeeper)中拉取,如下操作:
codis-admin --dashboard-list --zookeeper=xxxx:2181 | tee /data/codis/conf/codis.json
拉取的配置信息如下:
cat /data/codis/conf/codis.json
- 启动codis-fe
注意启动codis-fe的时候,必须要使用codis-fe的全路径进行启动,因为codis-fe需要找到前端静态文件,也就是要找到
/usr/local/codis/src/github.com/CodisLabs/codis/bin/assets
目录。
nohup `which codis-fe` --ncpu=2 --log=/data/codis/log/fe.log --log-level=WARN --dashboard-list=/data/codis/conf/codis.json \
--listen=0.0.0.0:8080 &
web端监控的是8080端口,浏览器访问 http://ip:8080
就能看的页面了!
配置并启动Codis各组件之Codis-ha
- 启动命令
codis-ha --log=/data/codis/log/ha.log --log-level=WARN --interval=3 --dashboard=127.0.0.1:18080 &
-
默认以5s(–interval是调整时间间隔的)为周期,codis-ha会从codis-dashboard中拉取集群状态,并进行主从切换;
-
codis-ha在以下状态下会退出:
-
从codis-dashboard获取集群状态失败时;
-
向codis-dashboard发送主从切换指令失败时
-
Codis管理实战
添加group
-
页面添加
-
命令添加
codis-admin --dashboard=172.16.150.xx:18080 --create-group --gid=1
添加Redis Server
- 页面添加
- 添加的server需要加入到某个group下,一般都是两个server在一个组下
- 填写groupId 和 redis server的ip和端口号,进行增加server
添加完成以后这里能看到server的主从关系等数据。
- 命令添加
# 先添加主server
codis-admin --dashboard=ip:18080 --group-add --gid=1 --addr=主server ip:从server port
# 添加从server
codis-admin --dashboard=ip:18080 --sync-action --create --addr=从server的ip:从server的port
# slave提升为master
codis-admin --dashboard=ip:18080 --promote-server --gid=1 --addr=从server的ip:从server的port
添加Proxy
- 页面添加
初始化slot
- 页面添加即可,给Server Group分配要管理哪些slot