zoukankan      html  css  js  c++  java
  • [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
    
    • 准备的镜像

    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

  • 相关阅读:
    2016 Multi-University Training Contest 1 solutions BY HIT
    Unicode 码表
    用 lambda 表达式 对 List 进行排序
    Linux的sed命令介绍
    Linux下的NTP服务搭建
    Linux网络配置(ip命令及配置文件)
    Linux的bash脚本编程(if语句和循环语句)
    Linux新手必须掌握的命令(2)
    Linux的文件查找
    bash中的变量
  • 原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11636120.html
Copyright © 2011-2022 走看看