[Redis] 使用redis-cli命令搭建标准6节点Redis集群(docker)
准备
镜像和脚本(弃用)
# redis 5.0.4
# -- 注意:5.0以上 推荐使用redis-cli命令搭建集群
# 3.0/4.0 可以使用脚本搭建
docker pull redis
# ruby 2.6.5(弃用)
docker pull ruby
# redis-trib.rb 脚本(弃用)
wget http://download.redis.io/redis-stable/src/redis-trib.rb
- 准备的镜像
配置文件模板
# bind 127.0.0.1
protected-mode no
port ${PORT}
daemonize no
dir /data/redis
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
redis-trib镜像(弃用)
利用ruby镜像构建一个redis-trib镜像
FROM ruby:2.6.5
MAINTAINER lingsh<770833105@qq.com>
RUN gem install redis
RUN mkdir /redis
WORKDIR /redis
ADD ./redis-trib.rb /redis/redis-trib.rb
- 构建redis-trib镜像
搭建
网络
# 创建docker内部网络
docker network create redis-cluster-net
- 内部网络配置
创建目录和定制各节点配置文件
创建 master 和 slave 目录并生成配置文件,用于存放配置文件redis.conf以及redis数据
# 创建 master 和 slave 文件夹
# port 表示节点对应端口
# ms 表示节点对应身份
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
mkdir -p ./$ms/$port/data \
&& PORT=$port envsubst < ./redis-cluster.tmpl > ./$ms/$port/redis.conf;
done
- 生成目录树
运行redis实例
# 运行docker redis 的 master 和 slave 实例
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
docker run -d -p $port:$port -p 1$port:1$port \
-v $PWD/$ms/$port/redis.conf:/data/redis.conf \
-v $PWD/$ms/$port/data:/data/redis \
--restart always --name redis-$ms-$port --net redis-cluster-net \
redis redis-server /data/redis.conf;
done
- 运行redis实例
组装节点参数
# 组装masters : slaves 节点参数
matches=""
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
matches=$matches$(docker inspect --format '{{(index .NetworkSettings.Networks "redis-cluster-net").IPAddress}}' "redis-$ms-${port}"):${port}" ";
done
- 获取的节点参数
使用redis-cli命令创建集群
# 创建docker-cluster
docker exec -it redis-master-7000 redis-cli -p 7000 --cluster create $matches --cluster-replicas 1
- 创建结果
- 集群信息
测试
redis-cli
- 使用redis命令行工具测试集群
Java
public class TestRedisConnect {
@Test
public void connectCluster() {
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7000));
nodes.add(new HostAndPort("127.0.0.1", 7001));
nodes.add(new HostAndPort("127.0.0.1", 7002));
nodes.add(new HostAndPort("127.0.0.1", 7003));
nodes.add(new HostAndPort("127.0.0.1", 7004));
nodes.add(new HostAndPort("127.0.0.1", 7005));
JedisCluster cluster = new JedisCluster(nodes, 5000);
System.out.println(cluster.get("hello"));
cluster.set("test2", "6739");
System.out.println(cluster.get("test2"));
Map<String, String> inviteePhone = new HashMap<>(5);
inviteePhone.put("inviterID", "1001");
inviteePhone.put("status", "0");
// hash表 批处理
cluster.hmset("inviteePhone", inviteePhone);
System.out.println(cluster.hget("inviteePhone", "inviterID"));
System.out.println(cluster.hget("inviteePhone", "status"));
}
}
遭遇问题
使用脚本创建集群无效
# 创建docker-cluster
docker run -it --rm --net redis-cluster-net redis-trib ruby redis-trib.rb create --replicas 1 $matches
- 运行脚本结果
- Redis 5.0以后不推荐使用 redis-trib 脚本创建集群
参考资料
使用"redis-trib.rb"搭建redis5.0集群“redis-trib.rb is not longer available!”问题