首页 > 技术文章 > [Redis] 使用redis-cli命令搭建标准6节点Redis集群(docker)

slowbirdoflsh 原文

准备

镜像和脚本(弃用)

# 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
  • 准备的镜像

image-ls

配置文件模板

# 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镜像

redis-trib-build

搭建

网络

# 创建docker内部网络
docker network create redis-cluster-net
  • 内部网络配置

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
  • 生成目录树

dir-tree

运行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实例

run-redis-node

组装节点参数

# 组装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
  • 获取的节点参数
    match-node-args

使用redis-cli命令创建集群

# 创建docker-cluster
docker exec -it redis-master-7000 redis-cli -p 7000 --cluster create $matches --cluster-replicas 1
  • 创建结果

new-way
new-way2

  • 集群信息

cluster-info

测试

redis-cli

  • 使用redis命令行工具测试集群

redis-cli-test
redis-cli-test2

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"));
    }
}

jedis-cluster

遭遇问题

使用脚本创建集群无效

# 创建docker-cluster
docker run -it --rm --net redis-cluster-net redis-trib ruby redis-trib.rb create --replicas 1 $matches
  • 运行脚本结果

rb-invalid

  • Redis 5.0以后不推荐使用 redis-trib 脚本创建集群

参考资料

使用"redis-trib.rb"搭建redis5.0集群“redis-trib.rb is not longer available!”问题

参考资料

docker redis 集群(cluster)搭建
官方文档-Redis cluster tutorial

推荐阅读