基于codis的redis集群方案实践

一、codis简述

1.1、codis简介

Codis 是一个由豌豆荚开源分布式 Redis 解决方案。 通过Codis-Proxy 和代理多个Codis-Server,Codis-Server是基于Redis-Server的基础上开发的,除了部分命令不支持原生Redis-Server (不支持的命令列表),其它操作和Redis-Server没有区别。客户端通过访问Codis-Proxy,Codis 底层会处理请求,进而转发到代理的Codis-Server, 对于客户端来说好像和访问单机Redis一样,可以简单的认为后边连接的是一个内存无限大的 Redis 服务。

 1.2、codis优劣

codis主要有如下好处:

  • 动态伸缩,无需重启:支持redis节点的动态增加或剔除,无需要重启服务,无需提前预估大小内存问题。
  • 水平伸缩,自动负载:扩容可以直接界面的 "Auto Rebalance" 按钮,缩容只需要将要下线的实例的slot迁移到其它实例,然后在界面上删除下线的group即可
  • 可视化操作:启动后,大部分操作都可以在可视化完成操作,维护便捷
  • 兼容性强:支持使用twemproxy和单机redis实例迁移到codis,通过codis的redis-port工具, 可以实时的同步 twemproxy 底下的 redis 数据到新的的 codis 集群上。
  • 较高的读写性能:保持着仅次于原生redis的读写操作,官方也给出了关于codis的性能报告https://github.com/CodisLabs/codis/blob/release3.2/doc/benchmark.md

codis也有些可能的不足:

  • 依赖外部存储:提供 Namespace 概念,不同集群的会按照不同 product name 进行组织,目前支持Zookeeper、Etcd、Fs 三种实现存储,这意味着单纯对于redis集群来说需要额外的机器搭存储。
  • 部分redis命令不支持:对于原生redis迁移时候,不支持的redis操作,需要改代码。不支持的redis命令https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md

二、codis的安装

codis有两种安装方式

  • 一种是直接下载官方的release binary,无须另行编译
  • 另一种便是下载源码,编译安装

2.1、Binary安装

1、下载release binary,如codis3.2.2-go1.8.5-linux.tar.gz

2、解压 tar -zxvf  codis3.2.2-go1.8.5-linux.tar.gz

解压后目录有以下文件,只有二进制文件,配置文件需要自己运行codis相关命令生成。为了不乱,最好创建一些常用目录,mkdir bin目录, 存放二进制文件;mkdir conf目录,存放将要生成的配置文件;mkdir logs存放启动日志。

3、生成配置文件

(1)生成dashboard.toml默认配置

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

(2)生成proxy.toml默认配置

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

2.2、源码安装

codis是用go语言开发的,所以要有go环境来编译源码。这里安装的codis3.2还依赖glibc2.14和glibc2.17,CentOS6自带的glibc一般版本比较低,yum源也比较低,所以编译安装,去网上查询即可

1、下载环境

https://golang.google.cn/dl/适合自己系统的源码

2、解压

如go1.12.linux-amd64.tar.gz

tar -C /usr/local -xzvf go1.12.linux-386.tar.gz

将解压后目录移动到/usr/loca/路径下 

3、配置环境变量

添加环境变量$ vim /etc/profile

GOPATH=/usr/local/go
export PATH=$PATH:$GOPATH/bin

使配置生效$ source /etc/profile

4、测试go环境安装

查看版本$ go version,出现以下版本信息,表示安装正确
go version go1.12 linux/386

5、Zookeeper搭建

zookeeper安装比较简单,可自行查询,也可以参考之前之前的文章https://blog.csdn.net/lzxlfly/article/details/80672284#t5

6、下载codis源码

创建路径,$ mkdir -p $GOPATH/src/github.com/CodisLabs
克隆源码,$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2

7、编译codis源码

进入目录下 $ cd $GOPATH/src/github.com/CodisLabs/codis
编译源码 $ make

 三、codis的配置

3.1、配置dashboard.toml 

# Set Coordinator, only accept "zookeeper" & "etcd"
coordinator_name = "zookeeper"
coordinator_addr = "node01:2181,node02:2181,node03:2181" #zk地址
#coordinator_auth = ""
# Set Codis Product Name/Auth.
product_name = "codis-redis-uws" #集群名字
product_auth = "codis-auth"  #集群密码

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

3.2、配置proxy.toml

# Set Codis Product Name/Auth.
product_name = "codis-redis-uws"
product_auth = ""

session_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" #codis-proxy客户端连接地址

jodis_name = "zookeeper"
jodis_addr = "node01:2181,node02:2181,node03:2181" #Jodis 注册 zookeeper 地址
jodis_auth = ""
jodis_timeout = "20s"
jodis_compatible = true
.................................

3.3、配置 redis.conf

同redis的redis.conf配置一样

四、codis的启动

4.1、启动 Codis-Dashboard

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

4.2、启动Codis-Proxy

$ nohup ./codis-proxy --ncpu=4 --config=conf/proxy.toml \
    --log=logs/proxy.log --log-level=WARN &

4.3、启动Codis-Server

codis-server和redis启动方式一样,如 $ ./bin/codis-server  ./conf/redis.conf

4.4、启动Codis-Fe

$ nohup ./codis-fe --ncpu=4 --log=logs/fe.log --log-level=WARN \
    --zookeeper=node01:2181,node02:2181,node03:2181 --listen=127.0.0.1:8000 &

五、配置redis集群

5.1、登录codis-fe的web地址

如地址:http://192.168.17x.xxx:8000,点击下边配置文件中设置过的集群名字

基于codis的redis集群方案实践_第1张图片

 刚进来没有配置集群时显示如下

基于codis的redis集群方案实践_第2张图片

5.2、通过fe添加group

先NEW GROUP添加组,后再添加 Codis Server。可以有添加多个组,一组内可添加多个server。另外要说的是添加Server之前,每个节点都要启动codis-server的。如下图

基于codis的redis集群方案实践_第3张图片

5.3、通过fe初始化slot

新增的集群 slot 状态是 offline,因此我们需要对它进行初始化(将 1024 个 slot 分配到各个 group),而最快的方法是通过 fe 提供的 rebalance all slots 按钮来做,如下图

基于codis的redis集群方案实践_第4张图片

5.4、改变集群状态

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

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

基于codis的redis集群方案实践_第5张图片

(2)通过 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 地址; 

 六、客户端访问

客户端通过Codis-proxy地址,如192.168.100.110:19000,就可以操作redis中数据了,就好像访问一个单机版的redis一样

如通过$ ./redis-cli -h 127.0.0.1 -p 19000 进入redis-cli,存取数据,如下图

至此,我们就完成了一个redis集群的搭建

 

参考:https://github.com/CodisLabs/codis

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

你可能感兴趣的:(Redis)