Redis目前的集群方案有以下几种:
1.RedisCluster:官方推荐,没有中心节点
2.Codis:中间件产品,存在中心节点
3.Twemproxy:中间件产品,存在中心节点
带中心节点的解决方案都存在中心节点挂掉后,Redis集群失效的问题。
因此这里将采用RedisCluster来实现。
无中心节点,客户端与redis节点直连,不需要中间代理层。
数据可以被分片存储
管理方便,后续可自行增加或摘除节点。
redis集群架构图:
拉取redis镜像:
docker pull yyyyttttwwww/redis
这个镜像是已经封装了ruby环境供搭建集群使用的,如果下载纯净版的redis镜像需自行安装环境。
对镜像进行重命名:
docker tag yyyyttttwwww/redis redis
docker创建网段net2供Redis集群使用:
docker network create --subnet=172.19.0.0/16 net2
创建redis容器r1:
docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 redis bash
进入该容器:
docker exec -it r1 bash
有了redis容器还需要去修改reids的配置文件/usr/redis/redis.conf,因为Redis是默认关闭RedisCluster这样集群的功能的,
只有修改了配置文件,redis才可以加入到集群里。
搜索该配置文件,将如下这些配置项改为如下配置:
在容器内启动redis服务:
cd /usr/redis/src # 进入redis启动程序所在目录
./redis-server ../redis.conf # redis-server是redis的启动程序。指定配置文件启动redis。
redis的第一个节点已经正常启动,之后还需依次创建余下5个redis容器,如上面的架构图,一共需要6个redis节点:
之后就是如r1内的配置reids和启动redis, 启动所有redis容器内的redis服务。
Redis自带了创建集群的工具redis-trib,redis-trib是基于Ruby的Redis集群命令行工具,通过它可以创建出RedisCluster集群。
但是通过它创建需要很多指令,可以使用写好的脚本redis-trib.rb来创建。
在非官方的redis镜像yyyyttttwwww/redis中已经安装好了Ruby环境以及redis-trib.rb脚本。
按照以下指令,利用redis-trib.rb脚本来创建RedisCluster集群即可:
在r1容器中启动redis的客户端进行测试
/usr/redis/src/redis-cli -c 启动redis客户端
可以看到,在经过内部计算后,将a-10的键值对存到172.19.0.4这个r3节点中了,也就是架构图中的第三台Master。
那么如果r3停掉了,应该由其slave节点接替master工作,是否是这样呢?
执行指令:
docker pause r3 停止r3容器
docker exec -it r1 bash 进入r1容器内
/usr/redis/src/redis-cli -c 启动redis客户端
cluster nodes 查看redis集群各个节点状态
从上图可以看到172.19.0.4 这个master节点已经挂掉了。而原先的172.19.0.7对应的节点已经升级成为新的master。
再次尝试获取数据,发现果然已经由172.19.0.7对应的节点接替了原本的master做操作:
如果让r3恢复运行,这个节点是什么状态呢?
可以发现r3这个节点已经变成了slave。
到这里通过RedisCluster搭建高可用的redis集群就完成了。