最近想用docker容器制作一个redis集群的镜像,以免每次都要重新配置搭建。正好在github上发现一个已有的制作docker-redis-cluster的项目,感觉挺好用的,这里推荐给大家:https://github.com/eloycoto/docker-redis-cluster

制作生成的docker-redis-cluster容器里面有8个redis实例,其中6个实例构成3主3从的redis集群(构成redis集群至少需要3个主),使用的端口为7000至7005;另外两个实例则是与redis集群没有关系的独立运行的,以供非集群模式的使用需求,使用的端口是7006和7007。

redis单实例的配置这里就不多做说明,下面只对redis集群的配置做下说明。

1 构成redis集群的实例配置

以7000端口的实例配置进行说明:

#指定端口
port 7000
#设置集群可用
cluster-enabled yes
#指定集群生成的配置文件名。注意,这个配置文件不是人为编辑的,是集群在运行中自动生成的,记录着集群中其他节点、状态信息、变量等配置信息,以便在启动的时候能重读到
cluster-config-file nodes.conf
#设置节点最大不可达时间,单位为毫秒。当主节点不可达时间超过这个设置时间,其对应的从节点将替换成为主节点;当一个节点在这个设置时间内不能访问到大多数主节点,将停止接收请求
cluster-node-timeout 5000
#设置为aop模式
appendonly yes
#设置根目录。即上面cluster-config-file参数指定的配置文件将放在这个目录下
dir /redis-data/7000
#设置槽是否需要全覆盖。默认yes情况下,只要16384个槽没有被全覆盖,整个集群就停止服务。设置no之后,只要还有部分key都继续提供查询处理
cluster-require-full-coverage no

将上面7000端口实例的配置再拷贝5份,并修改端口为7001到7005就完成了构成集群的6个节点实例的配置。

2 redis集群的启动

1) 通常redis集群的启动方法 首先,将构成集群需要的各redis实例启动起来:

#实例启动命令如下
redis-server /redis-conf/7000/redis.conf

此时,redis实例之间还并没有构成集群。

然后,使用redis-trib集群管理工具(此工具依赖Ruby和RubyGems,以及redis扩展)来创建redis集群:

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

这里使用的是create命令,选项–replicas 1的意思是对每个主节点生成一个副本,再后面跟的一串参数是构成集群各实例的ip和端口。这个命令执行之后,redis-trib会出现一个集群配置的提示信息,输入yes后才继续向下执行。这个过程中,节点之间会相互通信,集群会被配置组建,并在节点之间分配槽位。当配置完成之后,会出现下面的信息:

[OK] All 16384 slots covered

2) docker-redis-cluster容器中redis集群的启动方法 容器中使用的是supervisord来配置启动各redis实例的,详细可参考supervisord.conf

redis集群的创建和使用,可以在start.sh脚本中看到。由于redis-trib在创建集群过程中会提示需要输入的交互界面,所以这里使用echo命令通过管道将yes传给redis-trib:

echo "yes" | ruby /redis/src/redis-trib.rb create --replicas 1 ${IP}:7000 ${IP}:7001 ${IP}:7002 ${IP}:7003 ${IP}:7004 ${IP}:7005

最后说一下容器的使用方法,可以使用类似如下命令运行:

docker run -d -p 7000:7000 -p 7001:7001 -p 7002:7002 -p 7003:7003 -p 7004:7004 -p 7005:7005 -p 7006:7006 -p 7007:7007 docker-redis-cluster