运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现

一、关于Redis集群需知的点

1.1 Redis的集群方案

Redis目前的集群方案有以下几种:

1.RedisCluster:官方推荐,没有中心节点

2.Codis:中间件产品,存在中心节点

3.Twemproxy:中间件产品,存在中心节点

带中心节点的解决方案都存在中心节点挂掉后,Redis集群失效的问题。

因此这里将采用RedisCluster来实现。

 

1.2 RedisCluster的特点:

无中心节点,客户端与redis节点直连,不需要中间代理层。

数据可以被分片存储

管理方便,后续可自行增加或摘除节点。

 

1.3 Redis集群高可用要注意的点

  • Reids集群中应该包含奇数个Master(主),至少应该有3个Master。(因为Redis集群和PXC集群都有选举机制,当集群中超过一半以上的节点挂掉,剩余节点无法进行选举,组成新的集群)
  • Redis集群中每个Master都应该有Slave(从)

redis集群架构图:

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第1张图片

 

二、搭建Redis集群

2.1 创建多台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才可以加入到集群里。

搜索该配置文件,将如下这些配置项改为如下配置:

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第2张图片

 

在容器内启动redis服务:

cd /usr/redis/src                        # 进入redis启动程序所在目录

./redis-server ../redis.conf         # redis-server是redis的启动程序。指定配置文件启动redis。

 

redis的第一个节点已经正常启动,之后还需依次创建余下5个redis容器,如上面的架构图,一共需要6个redis节点:

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第3张图片

之后就是如r1内的配置reids和启动redis, 启动所有redis容器内的redis服务。

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第4张图片

 

2.2 搭建RedisCluster集群

Redis自带了创建集群的工具redis-trib,redis-trib是基于Ruby的Redis集群命令行工具,通过它可以创建出RedisCluster集群。

但是通过它创建需要很多指令,可以使用写好的脚本redis-trib.rb来创建。

 

在非官方的redis镜像yyyyttttwwww/redis中已经安装好了Ruby环境以及redis-trib.rb脚本。

按照以下指令,利用redis-trib.rb脚本来创建RedisCluster集群即可:

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第5张图片

 

2.3 进行测试

在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集群各个节点状态

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第6张图片

从上图可以看到172.19.0.4 这个master节点已经挂掉了。而原先的172.19.0.7对应的节点已经升级成为新的master。

再次尝试获取数据,发现果然已经由172.19.0.7对应的节点接替了原本的master做操作:

 

如果让r3恢复运行,这个节点是什么状态呢?

运维学习(四)Docker环境下搭建Redis集群——RedisCluster实现_第7张图片

可以发现r3这个节点已经变成了slave。

到这里通过RedisCluster搭建高可用的redis集群就完成了。

你可能感兴趣的:(运维)