[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM