由于日渐增长的并发量,传统的单机Redis已经越来越不能满足如今的网络请求量了,在这个背景下,Redis分布式解决方法之一的Codis应运而生。
Codis对于客户端来说基本透明,除了一些不支持的命令外,其他操作基本上与Redis无异。但是Codis重新实现了Redis协议,新增了一些操作slot(槽点)的命令,最多支持1024个槽点。举个栗子,如果你的主机足够的多,也可以1个主机作为1个槽点,则最多可搭建一个包含1024个主机的超大型分布式Redis集群。
Codis主要由以下部分组成:
如果要搭建一个可用的codis集群,还是需要不好外部依赖环境的,具体如下:
命令行或者手动到官网下载(可能需要翻qiang):
$ wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
$ tar -zxvf go1.13.5.linux-amd64.tar.gz
$ vi /etc/profile
...编辑保存之后
$ go version # 查看go的版本,显示类似如下内容则表示安装成功,显示:go version go1.13.5 linux/amd64
这里说明下,因为我们接下来下载的codis安装包将要安装到…/codis3.2.2 这个目录下,先定义$GOPATH=目录路径,是因为官方安装包里面也是根据这个变量进行操作的,所以目录地址可以自定义,但是变量名称最好不要有所改动,就叫$GOPATH。
注意,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 # 编译
单机部署机器:192.168.206.101。
如果一切正常的话,则codis的目录应该如下:
在 ./admin 目录下有一系列用于启动各种的服务的shell脚本:
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台机器上把以上涉及到的端口都打开或者直接关闭防火墙也可以 ^ ^ |
$ ./admin/codis-dashboard-admin.sh start
$ tail -100 ./log/codis-dashboard.log.2019-12-20 #查看日志,确认dashboard是否启动成功
默认情况下codis集群使用的是 filesystem 存储数据,存储路径为 /tmp/codis,若启动失败,请检测当前用户是否对该目录有读写权限。
$ ./admin/codis-proxy-admin.sh start
$ tail -100 ./log/codis-proxy.log.2019-12-20 #查看日志,确认codis-proxy是否启动成功
$ ./admin/codis-server-admin.sh start
$ tail -100 /tmp/redis_6379.log #这个是redis.conf里面默认的日志路径,查看日志确认是否启动成功
$ ./admin/codis-server-fe.sh start
$ tail -100 ./log/codis-fe.log.2019-12-20 #查看日志,确认codis-proxy是否启动成功
通过浏览器访问集群管理页面(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即可。
解决办法:注释绑定ip、关闭保护模式,然后重新codis-server。
重启后:
通过fe初始化槽点(slot):
新增的集群 slot 状态是 offline ,因此需要对它进行初始化(将1024个slot分配到各个Group),而初始化最快的方式可通过 fe 提供 rebalance all slots 按钮实现。
这里使用php脚本连接测试,如下连接了codis-proxy,并且写入了2个key,一个有过期时间,一个没有,fe都可以监控到。
至此,单机版codis搭建完成!
在以上的操作中,只是搭建了一个单机版的codis,在实际的生产环境中,单机codis连接无法满足高并发需求,codis就是为了解决高并发、分布式存储的,如果只搭建一个单机版的codis,那毫无意义。
3台机器IP:
zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、分布式应用配置项管理等。简单来说,zookeeper = 文件系统 + 监听通知机制。
codis集群各个节点之间的通讯是通过zookeeper完成的,要搭建codis集群,首先第一步就是要下载zookeeper。
下载地址: http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/
记得下这个带“bin”的版本,下面那个是没有编译的源码安装包。
参数配置说明:
下载完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,配置如下:
如上,是我当前的配置,根据上述配置文件,需要在对应的文件下新建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:
按照如上配置分别在三台服务器上配置zookeeper并且启动:
至此,zookeeper安装并启动完成!
由于希望在 192.168.206.100 这台服务器上集中管理3台codis集群,所以集群配置以这个太服务器为主。
重新配置192.168.206.100机器上的 codis-dashboard:
重启:
$ ./admin/codis-dashboard-admin.sh restart
$ tail -n 100 ./log/codis-dashboard.log.2019-12-20 #跟之前一样,查看日志,看看启动是否正常
修改 ./admin/codis-fe-admin.sh脚本:
$ vi ./admin/codis-fe-admin.sh
...
$ ./admin/codis-fe-admin.sh restart
$ netstat -nltp | grep 9090 #查看fe的监听端口是否运行
首先在3台机器上都启动 codis-server 服务,然后在fe的web页面上分别新建3个Group:100、101、102。分别将对应的服务器加入到每个组中,如下:
配置机器:100、101、102。
需要修改每个服务器的如下配置:
proxy.toml的修改如下:
proxy.toml的修改如下:
当每台机器都配置完成并启动proxy服务之后,刷新fe的web页面如下:
至此,一个3代理3存储的codis集群搭建完毕。随意访问任意一个代理,都能取到相同的数据,脚本测试如下:
当然,如果你想实现高可用,也可以配置并启动codis-ha,但是目前版本的codis-ha有个很不友好的问题:当codis-ha发现某个Group的master挂掉之后,确实可以提升这个master的从节点为master,但是当想再次启动这个挂掉的老master节点就不行了,除非你关了codis-ha,然后还要重新去fe里面去进行配置,略坑~~~
一般的话,如下想实现高可用,可以配置redis sentinel去代替codis-ha,在fe页面也可以手动添加sentinel(最下面)。
最后总结一下,codis实现了对于redis的高可用、动态扩展、对业务层透明、性能测试以及业务监控等一些很棒的功能,但是它是依赖了很多第三方环境的,搭建起来还是有点麻烦。不过,一旦搭建完成,对于客户端使用以及动态扩容还是非常方便的,也可以实时监控每台机器的存储情况、性能情况等等,总体来说,是利大于弊的。