准備
鏡像和腳本(棄用)
# 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!”問題