Redis分布式解决方案之Codis搭建

一、基本介绍及相关环境安装

1.1 codis简介

由于日渐增长的并发量,传统的单机Redis已经越来越不能满足如今的网络请求量了,在这个背景下,Redis分布式解决方法之一的Codis应运而生。
Codis对于客户端来说基本透明,除了一些不支持的命令外,其他操作基本上与Redis无异。但是Codis重新实现了Redis协议,新增了一些操作slot(槽点)的命令,最多支持1024个槽点。举个栗子,如果你的主机足够的多,也可以1个主机作为1个槽点,则最多可搭建一个包含1024个主机的超大型分布式Redis集群。

1.2 主要组成部分

Codis主要由以下部分组成:

  • codis-proxy:客户端连接的Redis代理服务,实现了Redis协议,除了部分不支持的命令外,其他基本跟原生Redis无区别。对于同一个业务群来说,可部署多个proxy代理,不同的proxy代理之间由codis-dashboard保证状态同步。
  • codis-server:可理解为redis-server,但是新增了一些对于槽点(slot)操作的命令。
  • codis-dashboard:集群管理工具,支持codis-proxy、codis-server的添加、删除以及数据迁移等操作。在集群状态发生改变时,codis-dashboard维护集群下所有codis-proxy的状态同步。
  • codis-fe:集群管理界面。如果你部署成功了一个codis集群,可以通过127.0.0.1:9090去访问这个界面,也可以配置多个集群实例共享一个前端界面;通过配置文件管理后端codis,配置文件自动更新。
  • codis-ha:用于保证codis集群高可用的工具。即,codis发现某个Group的Master出现异常,将会提升该组中的某个slave为master,标记出现异常的节点为offline。
  • codis-admin:集群管理的命令行工具,可用于控制codis-proxy、codis-dashboard状态以及访问外部存储。
  • redis-benchmark:codis官方自带的redis性能测试工具。
  • reids-cli:codis的redis客户端,不能直接启动原生redis-cli,因为原生redis-cli可能不识别部分codis命令。
  • redis-sentinel:哨兵。
  • 存储:codis默认的存储是filesystem,当你需要部署分布式集群的时候,则需要选择zookeeper或者etcd。

1.3 需要的环境及相关安装包

如果要搭建一个可用的codis集群,还是需要不好外部依赖环境的,具体如下:

  • java:因为zookeeper是java编写的,其运行要依赖于java环境,具体安装比较简单,不再赘述。
  • go:以为codis是go编写的,所以也得下载go。

1.3.1 安装go环境

命令行或者手动到官网下载(可能需要翻qiang):

$ wget  https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz 
$ tar -zxvf go1.13.5.linux-amd64.tar.gz 

解压之后:
Redis分布式解决方案之Codis搭建_第1张图片
配置环境变量:

$ vi /etc/profile 
...编辑保存之后
$ go version # 查看go的版本,显示类似如下内容则表示安装成功,显示:go version go1.13.5 linux/amd64

在这里插入图片描述
这里说明下,因为我们接下来下载的codis安装包将要安装到…/codis3.2.2 这个目录下,先定义$GOPATH=目录路径,是因为官方安装包里面也是根据这个变量进行操作的,所以目录地址可以自定义,但是变量名称最好不要有所改动,就叫$GOPATH。

1.3.2 安装codis

注意,Codis需要下载到:$GOPATH/src/github.com/CodisLabs/codis。
codis依赖于go环境,$GOPATH是第三方库go项目所在目录,Codis只是其中之一。

$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && wget https://github.com/CodisLabs/codis/archive/3.2.2.tar.gz #下载的是最新的3.2.2版本,具体根据实际需要
$ mkdir codis && tar -zxvf 3.2.2.tar.gz -C ./codis
$ make # 编译

Redis分布式解决方案之Codis搭建_第2张图片
解压并且执行编译如果出现如下,则表示codis安装成功:
Redis分布式解决方案之Codis搭建_第3张图片

二、快速启动一个单机codis

单机部署机器:192.168.206.101。
如果一切正常的话,则codis的目录应该如下:
Redis分布式解决方案之Codis搭建_第4张图片
在 ./admin 目录下有一系列用于启动各种的服务的shell脚本:
Redis分布式解决方案之Codis搭建_第5张图片
codis的环境说明:

机器 服务 端口 说明 依赖
192.168.206.100/101/102(centos7) Codis 6379 codis-server:redis服务端口 go
18080 codis-dashboard:管理端口
11080 codis-proxy:redis代理端口
9090 codis-fe:codis管理web服务端口
zookeeper 2181 zk客户端监听端口 JDK
2888 zookeeper内部通信端口
3888 zookeeper选举端口
注:为了避免麻烦,我们分别在3台机器上把以上涉及到的端口都打开或者直接关闭防火墙也可以 ^ ^

2.1 启动codis-dashboard

 $ ./admin/codis-dashboard-admin.sh start
 $ tail -100 ./log/codis-dashboard.log.2019-12-20 #查看日志,确认dashboard是否启动成功

Redis分布式解决方案之Codis搭建_第6张图片
默认情况下codis集群使用的是 filesystem 存储数据,存储路径为 /tmp/codis,若启动失败,请检测当前用户是否对该目录有读写权限。

2.2 启动codis-proxy

 $ ./admin/codis-proxy-admin.sh start
 $ tail -100 ./log/codis-proxy.log.2019-12-20 #查看日志,确认codis-proxy是否启动成功

Redis分布式解决方案之Codis搭建_第7张图片
如上图则说明启动成功。

2.3 启动codis-server

 $ ./admin/codis-server-admin.sh start
 $ tail -100 /tmp/redis_6379.log #这个是redis.conf里面默认的日志路径,查看日志确认是否启动成功

Redis分布式解决方案之Codis搭建_第8张图片
如上图则说明启动成功了。

2.4 启动codis-fe

 $ ./admin/codis-server-fe.sh start
 $ tail -100 ./log/codis-fe.log.2019-12-20 #查看日志,确认codis-proxy是否启动成功

Redis分布式解决方案之Codis搭建_第9张图片
如上,说明启动成功。

2.5 访问管理界面

通过浏览器访问集群管理页面(fe地址:127.0.0.1:9090),选择刚刚搭建的 codis-demo ,在proxy栏可看到已经启动的proxy,但是Group栏为空,因为启动的codis-server并未加入到集群中。点击 NEW GROUP 行输入1,在点击 NEW GROUP 即可添加Codis Server, Add Server 行输入启动的codis-server的ip:port添加到新加的Group 1。
如果redis的版本在3.2以上,可能会报如下错误,拒绝连接。因为redis3.2之后添加了保护模式(即,连接redis要么设置密码,要么在redis.conf中绑定ip),为了测试方便,需要到redis.conf中注释掉 bind 127.0.0.1 和关闭保护模式 protected-mode no ,然后重启codis-server即可。
Redis分布式解决方案之Codis搭建_第10张图片
解决办法:注释绑定ip、关闭保护模式,然后重新codis-server。
Redis分布式解决方案之Codis搭建_第11张图片
重启后:
Redis分布式解决方案之Codis搭建_第12张图片
通过fe初始化槽点(slot):
新增的集群 slot 状态是 offline ,因此需要对它进行初始化(将1024个slot分配到各个Group),而初始化最快的方式可通过 fe 提供 rebalance all slots 按钮实现。
Redis分布式解决方案之Codis搭建_第13张图片

2.6 脚本连接测试

这里使用php脚本连接测试,如下连接了codis-proxy,并且写入了2个key,一个有过期时间,一个没有,fe都可以监控到。
Redis分布式解决方案之Codis搭建_第14张图片
至此,单机版codis搭建完成!

三、codis集群搭建

在以上的操作中,只是搭建了一个单机版的codis,在实际的生产环境中,单机codis连接无法满足高并发需求,codis就是为了解决高并发、分布式存储的,如果只搭建一个单机版的codis,那毫无意义。

3台机器IP:

  • 192.168.206.100
  • 192.168.206.101
  • 192.168.206.102

3.1 安装zookeeper

zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、分布式应用配置项管理等。简单来说,zookeeper = 文件系统 + 监听通知机制。
codis集群各个节点之间的通讯是通过zookeeper完成的,要搭建codis集群,首先第一步就是要下载zookeeper。

下载地址: http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/

Redis分布式解决方案之Codis搭建_第15张图片
记得下这个带“bin”的版本,下面那个是没有编译的源码安装包。

参数配置说明:

  • tickTime:单位为毫秒(ms),用于检测服务器接节点之间心跳时间间隔。
  • initLimit:整数,tickTime的倍数,服务器节点之间进行初始化连接的最大时长。
  • syncLimit:整数,tickTime的倍数,服务器节点之间同步状态应答的最大时长。
  • dataDir:保存zookeeper数据的目录。
  • dataLogDir:日志文件的存储目录。
  • clientPort:监听客户端连接的端口,zookeeper会监听这个端口并接受客户端请求。
  • server.A=B:C:D,其中A是一个数字,可以自定义(1~255),服务器的代号;B代表这个服务器节点的ip地址;C是服务器集群节点之间相互通信的端口;D是选举集群Leader的端口,zookeeper启动之后会产生1个Leader + N个Follower,为了防止这个Leader挂了,需要一个端口来重新选举一个新的Leader,这个端口就是用来选举时服务器节点之间相互通信的。

下载完zookeeper安装包之后,假设zookeeper安装在 /home/my_softs/zookeeper-3.5.5 目录下,则在 /home/my_softs/zookeeper-3.5.5/conf会有一个 zoo_sample.cfg 文件,复制一份并改名为:zoo.cfg,因为默认zookeeper的启动文件是 zoo.cfg ,当然你也可以自定义并且执行对应的配置文件启动zookeeper,配置如下:
Redis分布式解决方案之Codis搭建_第16张图片
如上,是我当前的配置,根据上述配置文件,需要在对应的文件下新建2个文件夹: /home/my_softs/zookeeper-3.5.5/log 和 /home/my_softs/zookeeper-3.5.5/data ,需要在./data 目录下建立一个 myid 文件,内容编辑为上述配置 server.x=ip:port:port 中的对应x的值,如:100。然后分别在另外2台服务器上进行相同的配置,注意修改 myid 文件中对应的机器id:

  • 192.168.206.100 => ./data/myid 内容为:100。
  • 192.168.206.101 => ./data/myid 内容为:101。
  • 192.168.206.102 => ./data/myid 内容为:102。

按照如上配置分别在三台服务器上配置zookeeper并且启动:
Redis分布式解决方案之Codis搭建_第17张图片
Redis分布式解决方案之Codis搭建_第18张图片
Redis分布式解决方案之Codis搭建_第19张图片
至此,zookeeper安装并启动完成!

3.2 重新配置codis-dashboard(192.168.206.100)

由于希望在 192.168.206.100 这台服务器上集中管理3台codis集群,所以集群配置以这个太服务器为主。

重新配置192.168.206.100机器上的 codis-dashboard:
Redis分布式解决方案之Codis搭建_第20张图片
重启:

$ ./admin/codis-dashboard-admin.sh restart
$ tail -n 100 ./log/codis-dashboard.log.2019-12-20 #跟之前一样,查看日志,看看启动是否正常

3.3 重新配置codis-fe的启动shell脚本(192.168.206.100)

修改 ./admin/codis-fe-admin.sh脚本:
Redis分布式解决方案之Codis搭建_第21张图片

$ vi ./admin/codis-fe-admin.sh
...
$ ./admin/codis-fe-admin.sh restart
$ netstat -nltp | grep 9090 #查看fe的监听端口是否运行

刷新web页面如下:
Redis分布式解决方案之Codis搭建_第22张图片

3.4 将100 / 101 / 102加入到集群

首先在3台机器上都启动 codis-server 服务,然后在fe的web页面上分别新建3个Group:100、101、102。分别将对应的服务器加入到每个组中,如下:
Redis分布式解决方案之Codis搭建_第23张图片

3.5 使用fe自动分配槽点

Redis分布式解决方案之Codis搭建_第24张图片

3.6 重新配置codis-proxy并重启

配置机器:100、101、102。

需要修改每个服务器的如下配置:

  • ./config/proxy. toml
  • ./admin/codis-proxy-admin.sh

proxy.toml的修改如下:
Redis分布式解决方案之Codis搭建_第25张图片
proxy.toml的修改如下:
Redis分布式解决方案之Codis搭建_第26张图片
当每台机器都配置完成并启动proxy服务之后,刷新fe的web页面如下:
Redis分布式解决方案之Codis搭建_第27张图片
至此,一个3代理3存储的codis集群搭建完毕。随意访问任意一个代理,都能取到相同的数据,脚本测试如下:
Redis分布式解决方案之Codis搭建_第28张图片
当然,如果你想实现高可用,也可以配置并启动codis-ha,但是目前版本的codis-ha有个很不友好的问题:当codis-ha发现某个Group的master挂掉之后,确实可以提升这个master的从节点为master,但是当想再次启动这个挂掉的老master节点就不行了,除非你关了codis-ha,然后还要重新去fe里面去进行配置,略坑~~~
一般的话,如下想实现高可用,可以配置redis sentinel去代替codis-ha,在fe页面也可以手动添加sentinel(最下面)。

最后总结一下,codis实现了对于redis的高可用、动态扩展、对业务层透明、性能测试以及业务监控等一些很棒的功能,但是它是依赖了很多第三方环境的,搭建起来还是有点麻烦。不过,一旦搭建完成,对于客户端使用以及动态扩容还是非常方便的,也可以实时监控每台机器的存储情况、性能情况等等,总体来说,是利大于弊的。

你可能感兴趣的:(redis相关)