在大量数据面前,通常会增加节点来存储数据。那么在节点集群中数据的分布,节点之间的状态成为一个必须要关注的问题。比如现在有16384份数据,用6个节点来存储这些数据,如果用随机存储的方式,那么会造成数据分布不均衡,下次要查找数据的时候需要花费庞大的时间和精力,并且在这同时会遇到要查找的数据不知道存放在哪个节点上。另外如果新加入的节点后,怎么去分配数据。
而Redis cluster这个工具可以很好地解决这个问题。Redis cluster的架构是有很多个节点,但每个节点之间是相互通信的,并且都拥有读写能力,给每个节点指派相应的槽,让每个节点正常运行。
1、配置Redis节点,并开启
######配置7000端口的文件######
vim redis-7000.conf
port 7000
daemonize yes
dir "/opt/redis/redis-5.0.3/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
######配置7001端口的文件######
sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
######配置7002端口的文件######
sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
######配置7003端口的文件######
sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
######配置7004端口的文件######
sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
######配置7005端口的文件######
sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
######启动redis的7000,7001,7002,7003,7004,7005服务端#######
redis-server redis-7003.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
######查看redis-server的服务进程######
ps -ef | grep redis-server
root 1828 1 0 10:27 ? 00:00:01 redis-server *:7000 [cluster]
root 1856 1 0 10:29 ? 00:00:01 redis-server *:7001 [cluster]
root 1861 1 0 10:29 ? 00:00:00 redis-server *:7002 [cluster]
root 1867 1 0 10:29 ? 00:00:00 redis-server *:7003 [cluster]
root 1872 1 0 10:29 ? 00:00:00 redis-server *:7004 [cluster]
root 1877 1 0 10:29 ? 00:00:01 redis-server *:7005 [cluster]
root 1983 1533 0 10:37 pts/0 00:00:00 grep --color=auto redis-server
查看节点信息以及这个集群的信息
######查看节点的信息######
redis-cli -p 7000 cluster nodes
6f058a012a7384e37a0532dd4130e35d908e38ec :7000@17000 myself,master - 0 0 0 connected
#节点ID:端口@1节点端口 自己,主节点
######查看当前集群的信息######
redis-cli -p 7000 cluster info
cluster_state:fail #当前节点状态是下线状态
cluster_slots_assigned:0 #没有槽数
cluster_slots_ok:0 #可以用的槽数为0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
2、对各个节点进行通信(meet)操作
redis-cli -p 7000 cluster meet 127.0.0.1 7001
OK
redis-cli -p 7000 cluster meet 127.0.0.1 7002
OK
redis-cli -p 7000 cluster meet 127.0.0.1 7003
OK
redis-cli -p 7000 cluster meet 127.0.0.1 7004
OK
redis-cli -p 7000 cluster meet 127.0.0.1 7005
OK
这时候再来查看一下节点信息和集群信息
redis-cli -p 7000 cluster nodes #查看各个节点的信息
40c3891bac2ce5015e8ac7daff53e1088e36d4cb 127.0.0.1:7001@17001 master - 0 1549075584069 1 connected
405ea2ebd3da8b493a762018f0dd72ebd7ec34fd 127.0.0.1:7003@17003 master - 0 1549075582052 3 connected
3bd534578a8c3fb3b3407c0358867eae67f0b3b2 127.0.0.1:7002@17002 master - 0 1549075583059 2 connected
680e1bbcf80877f4b77fc06508102113167e097b 127.0.0.1:7005@17005 master - 0 1549075581000 5 connected
bbc422512adda726030995899c866ffaf6ec9b29 127.0.0.1:7004@17004 master - 0 1549075584000 0 connected
6f058a012a7384e37a0532dd4130e35d908e38ec 127.0.0.1:7000@17000 myself,master - 0 1549075582000 4 connected
redis-cli -p 7000 cluster info #查看这个集群的信息
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_ping_sent:95
cluster_stats_messages_pong_sent:100
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:200
cluster_stats_messages_ping_received:100
cluster_stats_messages_pong_received:100
cluster_stats_messages_received:200
3、对各个节点指派槽
######由于数量比较大,这里使用一个简单的shell脚本来完成######
vim cluster.sh
#!/bin/bash
start=$1 #定义一个起始变量
end=$2 #定义一个结束变量
port=$3 #定义一个端口号的变量
for slot in 'seq ${start} ${end}' #利用for循环来重复执行命令,在slot中
do
echo "slot:${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done
######将16384的数据分为3份,0到5461的数据分到7000端口######
sh cluster.sh 0 5461 7000
######将5462到10922的数据分到7001端口######
sh cluster.sh 5462 10922 7001
######10923到16383的数据分到7002端口######
sh cluster.sh 10923 16383 7002
这时候再来看看各个节点的信息以及集群的信息
####再次查看各个节点的信息,可以看到节点0,1,2这三个节点已经均衡分配好数据了####
redis-cli -p 7000 cluster nodes
40c3891bac2ce5015e8ac7daff53e1088e36d4cb 127.0.0.1:7001@17001 master - 0 1549077186419 1 connected 5462-10922
405ea2ebd3da8b493a762018f0dd72ebd7ec34fd 127.0.0.1:7003@17003 master - 0 1549077186000 3 connected
3bd534578a8c3fb3b3407c0358867eae67f0b3b2 127.0.0.1:7002@17002 master - 0 1549077185000 2 connected 10923-16383
680e1bbcf80877f4b77fc06508102113167e097b 127.0.0.1:7005@17005 master - 0 1549077187426 5 connected
bbc422512adda726030995899c866ffaf6ec9b29 127.0.0.1:7004@17004 master - 0 1549077185408 0 connected
6f058a012a7384e37a0532dd4130e35d908e38ec 127.0.0.1:7000@17000 myself,master - 0 1549077184000 4 connected 2-5461
####再次查看集群信息,可以看到节点数,槽数等信息####
redis-cli -p 7000 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:3 #槽的数量
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_ping_sent:1680
cluster_stats_messages_pong_sent:1710
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:3395
cluster_stats_messages_ping_received:1710
cluster_stats_messages_pong_received:1685
cluster_stats_messages_received:3395
4、对节点进行主从配置
######设置各个节点的主从关系######
####设置7003端口为7000端口的从节点####
redis-cli -p 7003 cluster replicate 6f058a012a7384e37a0532dd4130e35d908e38ec #7000的节点ID
OK
####设置7004端口为7001端口的从节点####
redis-cli -p 7004 cluster replicate 40c3891bac2ce5015e8ac7daff53e1088e36d4cb #7001的节点ID
OK
####设置7005端口为7002端口的从节点####
redis-cli -p 7005 cluster replicate 3bd534578a8c3fb3b3407c0358867eae67f0b3b2 #7002的节点ID
OK
5、查看节点的信息以及集群的信息
redis-cli -p 7000 cluster nodes
40c3891bac2ce5015e8ac7daff53e1088e36d4cb 127.0.0.1:7001@17001 master - 0 1549077600596 1 connected 5462-10922
405ea2ebd3da8b493a762018f0dd72ebd7ec34fd 127.0.0.1:7003@17003 slave 6f058a012a7384e37a0532dd4130e35d908e38ec 0 1549077598580 4 connected
3bd534578a8c3fb3b3407c0358867eae67f0b3b2 127.0.0.1:7002@17002 master - 0 1549077598000 2 connected 10923-16383
680e1bbcf80877f4b77fc06508102113167e097b 127.0.0.1:7005@17005 slave - 0 1549077599000 5 connected 0
bbc422512adda726030995899c866ffaf6ec9b29 127.0.0.1:7004@17004 slave 40c3891bac2ce5015e8ac7daff53e1088e36d4cb 0 1549077599588 1 connected
6f058a012a7384e37a0532dd4130e35d908e38ec 127.0.0.1:7000@17000 myself,master - 0 1549077599000 4 connected 2-5461
redis-cli -p 7000 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:3
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_ping_sent:2088
cluster_stats_messages_pong_sent:2127
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:4220
cluster_stats_messages_ping_received:2127
cluster_stats_messages_pong_received:2093
cluster_stats_messages_received:4220
6、在cluster集群环境下连接节点需要增加 -c 参数
redis-cli -c -p 7000
127.0.0.1:7000> set hello csdn
OK