编写脚本

#!/bin/bash
for port in $(seq 7001 7006); \
do \
	mkdir -p /mydata/redis/node-${port}/conf
 	touch /mydata/redis/node-${port}/conf/redis.conf
	cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.37.129
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF

docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d redis:5.0.7 redis-server /etc/redis/redis.conf; \
done

给脚本增加执行权限,然后运行。
进入其中一个节点,建立集群关系。

docker exec -it redis-7001 bash
redis-cli --cluster create 192.168.37.129:7001 192.168.37.129:7002 192.168.37.129:7003 192.168.37.129:7004 192.168.37.129:7005 192.168.37.129:7006 --cluster-replicas 1

搭建redis集群主从_搭建redis集群主从
从上面的日志,也可以知道主从的关系如下:
搭建redis集群主从_搭建redis集群主从_02

我们实验一把,根据槽,动态分布,我们需要带上-c参数表示操作集群,但不是同一个槽,将会转发到其他槽。
搭建redis集群主从_搭建redis集群主从_03
我们在7001设置的一个key,发现转向到了7002,由于7002跟7005是主从,所以我们连接7005,同意能获取的这个key。
搭建redis集群主从_搭建redis集群主从_04
我们也可以模拟redis主节点宕机,比如停止主节点7002,停止之前,我们看一下集群状态和节点状态。
搭建redis集群主从_搭建redis集群主从_05
搭建redis集群主从_搭建redis集群主从_06
我们停止7002
搭建redis集群主从_搭建redis集群主从_07
再次查看集群状态,我们随便登录一个节点进行查看。
7002由于宕机,显示fail,同时7005变成了master节点。
搭建redis集群主从_搭建redis集群主从_08
我们让7002恢复,再次查看
搭建redis集群主从_搭建redis集群主从_09
搭建redis集群主从_搭建redis集群主从_10
可以看到7002成为了7005的slave,即由于宕机恢复,主从关系进行交换了(原M:7002 S:7005,现在M:7005 S:7002)

java 操作redis集群

引入jedis

<dependencies>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.yugabyte/jedis -->
        <dependency>
            <groupId>com.yugabyte</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0-yb-16</version>
        </dependency>
        
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.26</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
package com.hbk;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

public class RedisTest {
    public static void main(String[] args) {
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        nodes.add(new HostAndPort("192.168.37.129", 7001));
        nodes.add(new HostAndPort("192.168.37.129", 7002));
        nodes.add(new HostAndPort("192.168.37.129", 7003));
        nodes.add(new HostAndPort("192.168.37.129", 7004));
        nodes.add(new HostAndPort("192.168.37.129", 7005));
        nodes.add(new HostAndPort("192.168.37.129", 7006));
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(100);// 最大连接数, 默认8个
        jedisPoolConfig.setMaxIdle(20);// 最大空闲连接数, 默认8个
        jedisPoolConfig.setMaxWaitMillis(-1);
        jedisPoolConfig.setTestOnBorrow(true);
        JedisCluster jedisCluster = new JedisCluster(nodes, 6000, 100, jedisPoolConfig);
        String k = "author";
        String v = jedisCluster.get(k);
        System.err.println(v);
        jedisCluster.set("author", "zhanglulu");
        System.out.println(jedisCluster.get("author"));
        jedisCluster.close();
    }
}