上一篇文章中介绍了Windows下使用cygwin搭建redis单节点,这一篇文件将在上一篇文章的基础上搭建redis集群。
1. 在安装redis的目录的同级目录下新建6个文件夹,7000,70001,7002,7003,7004,7005
将./redis-stable/src/目录下面redis-server redis.conf两个文件复制到./7000/文件夹中,当前目录下使用命令:cp ./redis-stable/src/redis-server ./redis-stable/redis.conf ./7000,然后,修改redis.conf文件中内容,将下列值改为如下:
port 7000 #设置端口
cluster-enabled yes #打开集群支持
cluster-config-file nodes.conf #节点配置文件名
cluster-node-timeout 5000 #节点超时时间
appendonly yes #设置redis数据操作方式
daemonize yes #设置redis默认以后台程序方式运行
注意:由于文件行数较多,可以在命令模式下使用 /要搜索的内容 来找到指定行,再使用命令 “ : number” 来跳转到指定行。如果要显示行号,可以修改 /etc/vimrc文件,在最后添加一行 : set nu
2. 在redis的src目录下执行创建集群命令创建集群
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
2.1执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:/usr/bin/env: ruby: No such file or directory,
需要安装ruby的环境。这里双击cygwin.exe文件,安装ruby。可以参考上一篇文章中cygwin中安装gcc、make
2.2安装完成ruby后,再执行第6步的创建集群命令,还会报错,提示缺少rubygems组件。使用cygwin进行安装。
2.3再次执行第6步的命令,还会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装。在redis的src目录下执行命令 gem install redis
2.4 再次执行集群创建命令
输入yes,使用默认的设置
redis集群到这里就搭建完成了。另开一个窗口,输入 redis-cli -p 7000,然后输入 cluster nodes,就可以看到集群的节点信息。这里可以看到, 端口为7001、7002、7003的是master,其它的是slave
新建maven项目,添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.johnfnash.learn</groupId>
<artifactId>redis-cluster-first</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>redis-cluster-first</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
编写junit测试代码
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.util.JedisClusterCRC16;
public class RedisClusterTest {
@Test
public void test() {
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//只需要添加一个实例,jedis会自动发现集群中其它节点
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
String key = "1417";
jc.setnx(key, "bar");
String value = jc.get(key);
System.out.println("key-" + key + " slot-" + JedisClusterCRC16.getSlot(key)
+ " value-" + value);
String key2 = "288";
jc.setnx(key2, "bar2");
String value2 = jc.get(key2);
System.out.println("key-" + key2 + " slot-" + JedisClusterCRC16.getSlot(key2)
+ " value-" + value2);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(null != jc) {
jc.close();
}
}
}
}
运行junit测试用例,结果如下:
接下来用redis客户端看看这两个key=1417 、key=288的值存到哪个节点下
看回最初的配置
key=288算出来的 CRC16校验和是 4258,根据配置 应该存在 7003这台机上
key=1417 算出来的 CRC16校验和是 13096,根据配置 应该存在 7002 这台机上
用redis 客户端查看数据存到哪台机器上
从redis客户端看到的结果与配置一致