Redis集群方案之Codis 3集群搭建

文章目录

    • 环境准备
    • 机器端口一览
    • 各个组件功能分析
    • 整体架构分析
    • 安装zookeeper
    • GO安装
    • godep安装
    • 下载Codis源码
    • 编译Codis源码
    • 配置并启动Codis各组件之Redis
    • 配置并启动Codis各组件之Dashboard
    • 配置并启动Codis各组件之Proxy
    • 配置并启动Codis各组件之codis-fe
    • 配置并启动Codis各组件之Codis-ha
    • Codis管理实战
      • 添加group
      • 添加Redis Server
      • 添加Proxy
      • 初始化slot

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可自行扩展。

整体架构分析

Redis集群方案之Codis 3集群搭建_第1张图片

Redis集群方案之Codis 3集群搭建_第2张图片

  • 服务端: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环境。

  1. 下载GO的软件包
cd /root/jiachang/go
wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
  1. 解压
tar xvf go1.11.4.linux-amd64.tar.gz -C /usr/local
  1. 解压完成后,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产生的文件
Redis集群方案之Codis 3集群搭建_第3张图片
在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

  1. 为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
  1. 复制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/
  1. 添加环境变量并生效
## 在PATH后面追加
:/data/codis/redis/bin

source /etc/profile
  1. 编辑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

  1. 首先生成默认的配置文件:
codis-dashboard --default-config | tee /data/codis/conf/dashboard.toml
  1. 修改配置文件
    一般主要修改下zookeeper的地址即可,文件路径:/data/codis/conf/dashboard.toml

配置文件说明:

coordinator_name:外部存储类型,接受zookeeper/etcd,这里我们使用的zookeeper集群。
coordinator_addr:外部存储地址。
product_name:集群名称,满足正则\w[\w\.\-]*。
product_auth:集群密码,默认为空。
admin_addr:RESTful API端口。
  1. 启动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

  1. 生成默认的配置文件
$ codis-proxy --default-config | tee /data/codis/conf/proxy.toml
  1. 按照实际情况修改配置,这里主要修改下zk的地址
    Redis集群方案之Codis 3集群搭建_第4张图片

配置项说明

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表示禁止。
  1. 启动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

  1. 生成默认的配置文件,配置文件codis.json可以手动编辑,也可以通过codis-admin从外部存储(这里是zookeeper)中拉取,如下操作:
codis-admin --dashboard-list --zookeeper=xxxx:2181 | tee /data/codis/conf/codis.json

拉取的配置信息如下:

cat /data/codis/conf/codis.json

Redis集群方案之Codis 3集群搭建_第5张图片

  1. 启动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就能看的页面了!
Redis集群方案之Codis 3集群搭建_第6张图片

配置并启动Codis各组件之Codis-ha

  1. 启动命令
codis-ha --log=/data/codis/log/ha.log --log-level=WARN --interval=3 --dashboard=127.0.0.1:18080 &
  1. 默认以5s(–interval是调整时间间隔的)为周期,codis-ha会从codis-dashboard中拉取集群状态,并进行主从切换;

  2. 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

  • 页面添加
    Redis集群方案之Codis 3集群搭建_第7张图片

初始化slot

  • 页面添加即可,给Server Group分配要管理哪些slot

你可能感兴趣的:(Redis)