上节课我们一起学习了怎样搭建一个六台设备的Redis集群,这节我们一起学习下如何测试集群。
首先启动Redis集群使用命令
/usr/local/redis/bin/redis-trib.rb create --replicas 1 192.168.117.101:6379 192.168.117.102:6379 192.168.117.103:6379 192.168.117.104:6379 192.168.117.105:6379 192.168.117.106:6379
进行启动,如下所示。可以看到192.168.117.101 、192.168.117.102、192.168.117.103
这三个节点是主节点,另外三个节点是从节点。槽号为0-5460的卡槽被分配到了192.168.117.101 上,5461-10922被分配到了192.168.117.102上,10923-16383被分配到了192.168.117.103上。
[root@itcast02 bin]# ./redis-trib.rb create --replicas 1 192.168.117.101:6379 192.168.117.102:6379 192.168.117.103:6379 192.168.117.104:6379 192.168.117.105:6379 192.168.117.106:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.117.101:6379
192.168.117.102:6379
192.168.117.103:6379
Adding replica 192.168.117.105:6379 to 192.168.117.101:6379
Adding replica 192.168.117.106:6379 to 192.168.117.102:6379
Adding replica 192.168.117.104:6379 to 192.168.117.103:6379
M: fc107841c17adfb02fbcaf3a90b079e7ce291349 192.168.117.101:6379
slots:0-5460 (5461 slots) master
M: 63075ca167daae59e728c570ca69abeee6bf9c13 192.168.117.102:6379
slots:5461-10922 (5462 slots) master
M: 315113656cbca3b2ea155fae230764f88e038a5e 192.168.117.103:6379
slots:10923-16383 (5461 slots) master
S: 82fbbf7ead1257183d7788fd151195296de3759c 192.168.117.104:6379
replicates 315113656cbca3b2ea155fae230764f88e038a5e
S: 7fe6f43f9041f52b9cda6f570640f5ff3e9087fd 192.168.117.105:6379
replicates fc107841c17adfb02fbcaf3a90b079e7ce291349
S: 22fc4a4dcf76f82dd64059d55f5ca81f56c86aa4 192.168.117.106:6379
replicates 63075ca167daae59e728c570ca69abeee6bf9c13
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.117.101:6379)
M: fc107841c17adfb02fbcaf3a90b079e7ce291349 192.168.117.101:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 22fc4a4dcf76f82dd64059d55f5ca81f56c86aa4 192.168.117.106:6379
slots:15098 (1 slots) master
0 additional replica(s)
S: 82fbbf7ead1257183d7788fd151195296de3759c 192.168.117.104:6379
slots: (0 slots) slave
replicates 315113656cbca3b2ea155fae230764f88e038a5e
M: 315113656cbca3b2ea155fae230764f88e038a5e 192.168.117.103:6379
slots:10923-15097,15099-16383 (5460 slots) master
1 additional replica(s)
M: 63075ca167daae59e728c570ca69abeee6bf9c13 192.168.117.102:6379
slots:5461-10922 (5462 slots) master
0 additional replica(s)
S: 7fe6f43f9041f52b9cda6f570640f5ff3e9087fd 192.168.117.105:6379
slots: (0 slots) slave
replicates fc107841c17adfb02fbcaf3a90b079e7ce291349
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
既然集群已经启动好了,我们使用redis客户端随意连接一台设备进行测试,比如我们连接192.168.117.105这台设备(这是个从节点,从属于192.168.117.101),如下所示(注意:一定要加上参数"-c"否则没办法重定向 到其它节点)。
[root@itcast02 bin]# ./redis-cli -h 192.168.117.105 -p 6379 -c
192.168.117.105:6379>
连接上之后,我们先来保存key1,它的值是234,如下所示,可以看到,这个key1经过算法并对16384进行求余之后的数字是9189,这个槽号是在192.168.117.102上,因此key1被保存到了192.168.117.102上。
192.168.117.105:6379> set key1 234
-> Redirected to slot [9189] located at 192.168.117.102:6379
我们再接着保存key2、key3、key4,如下所示,可以看到key2所对应的槽号是4998,显然是在192.168.117.101上,key3所对应的槽号也在0-5640,因此set key3的时候根本就没有重定向,还是停留在192.168.117.101上。key4所对应的槽号是13120,显然是在192.168.117.103上因此被保存到了192.168.117.101上。
192.168.117.105:6379> set key1 234
-> Redirected to slot [9189] located at 192.168.117.102:6379
OK
192.168.117.102:6379> set key2 111
-> Redirected to slot [4998] located at 192.168.117.101:6379
OK
192.168.117.101:6379> set key3 111
OK
192.168.117.101:6379> set key4 aaa
-> Redirected to slot [13120] located at 192.168.117.103:6379
OK
192.168.117.103:6379> set key5 bbb
-> Redirected to slot [9057] located at 192.168.117.102:6379
OK
192.168.117.102:6379>
我们可以使用命令cluster info查看集群的某些信息,如下所示,可以看到当前集群的状态是OK的,所有的槽号都已分配完毕,没有失败的节点。所有的节点数是6,当前提供服务的有4台
192.168.117.102:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:4
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_ping_sent:1290
cluster_stats_messages_pong_sent:1355
cluster_stats_messages_meet_sent:2
cluster_stats_messages_sent:2647
cluster_stats_messages_ping_received:1352
cluster_stats_messages_pong_received:1292
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:2647
192.168.117.102:6379>
还可以通过命令cluster nodes来查看节点信息。
192.168.117.102:6379> cluster nodes
22fc4a4dcf76f82dd64059d55f5ca81f56c86aa4 192.168.117.106:6379@16379 master - 0 1533140137788 6 connected 15098
63075ca167daae59e728c570ca69abeee6bf9c13 192.168.117.102:6379@16379 myself,master - 0 1533140136000 2 connected 5461-10922
fc107841c17adfb02fbcaf3a90b079e7ce291349 192.168.117.101:6379@16379 master - 0 1533140137000 1 connected 0-5460
82fbbf7ead1257183d7788fd151195296de3759c 192.168.117.104:6379@16379 slave 315113656cbca3b2ea155fae230764f88e038a5e 0 1533140137000 4 connected
7fe6f43f9041f52b9cda6f570640f5ff3e9087fd 192.168.117.105:6379@16379 slave fc107841c17adfb02fbcaf3a90b079e7ce291349 0 1533140135769 5 connected
315113656cbca3b2ea155fae230764f88e038a5e 192.168.117.103:6379@16379 master - 0 1533140137000 3 connected 10923-15097 15099-16383
192.168.117.102:6379>
下面使用JedisCluster来测试集群,我们在taotao-content-service工程的测试类中再添加一个测试方法(与第三十课结合学习),如下所示。运行,发现是可以正常输出"hello jedis cluster"的。注意此处使用redis 4.0.1 需要修改taotao-parent中pom文件jedis的版本
@Test
public void testJedisCluster(){
//创建构造参数Set类型,集合中每个元素是HostAndPort类型
Set<HostAndPort> nodes = new HashSet<>();
//向集合中添加节点
nodes.add(new HostAndPort("192.168.117.101", 6379));
nodes.add(new HostAndPort("192.168.117.102", 6379));
nodes.add(new HostAndPort("192.168.117.103", 6379));
nodes.add(new HostAndPort("192.168.117.104", 6379));
nodes.add(new HostAndPort("192.168.117.105", 6379));
nodes.add(new HostAndPort("192.168.117.106", 6379));
//创建JedisCluster对象
JedisCluster jedisCluster = new JedisCluster(nodes);
//直接使用jedisCluster,自带连接池,jedisCluster可以是单例的
jedisCluster.set("jedis-cluster", "hello jedis cluster");
String result = jedisCluster.get("jedis-cluster");
System.out.println(result);
//系统关闭前关闭jedisCluster
jedisCluster.close();
}