1.Redis版本及下载
找到安装的redis版本,redis3.0以上版本才支持集群

下载对应的版本

2.安装redis集群
解压上传编译
 [hadoop@host152 opensource]$ tar -xvf redis-3.2.11.tar.gz
 [hadoop@host152 opensource]$ cd redis-3.2.11/
 [hadoop@host152 redis-3.2.11]$ make
 cd src && make all
 make[1]: 进入目录“/home/hadoop/opensource/redis-3.2.11/src”
     CC adlist.o
 /bin/sh: cc: 未找到命令
 make[1]: *** [adlist.o] 错误 127
 make[1]: 离开目录“/home/hadoop/opensource/redis-3.2.11/src”
 make: *** [all] 错误 2
编译报错,缺少gcc,使用root用户先安装gcc,若没有报错则跳过此步骤
 [root@host152 redis-3.2.11]#  gcc -v
 bash: gcc: 未找到命令...
 [root@host152 redis-3.2.11]# yum -y install gcc
 [root@host152 redis-3.2.11]# gcc -v
 gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
需要删除原来的安装目录,重新解压编译安装redis,因为包已经弄坏
 [hadoop@host152 opensource]$ rm -rf redis-3.2.11
 [hadoop@host152 opensource]$ tar -xvf redis-3.2.11.tar.gz
 [hadoop@host152 opensource]$ cd redis-3.2.11/
 [hadoop@host152 redis-3.2.11]$ make
 [hadoop@host152 redis-3.2.11]$ pwd
 /home/hadoop/opensource/redis-3.2.11
 [hadoop@host152 redis-3.2.11]$ cd src
 [hadoop@host152 src]$ make install PREFIX=/home/hadoop/opensource/redis-3.2.11
此时可以切换到上面PREFIX指定的安装路径,可以看到bin目录下面有redis服务端和客户端生成
 [hadoop@host152 src]$ cd /home/hadoop/opensource/redis-3.2.11
 [hadoop@host152 redis-3.2.11]$ cd bin
 [hadoop@host152 bin]$ ll
 总用量 15080
 -rwxr-xr-x. 1 hadoop hadoop 2433104 9月  10 23:22 redis-benchmark
 -rwxr-xr-x. 1 hadoop hadoop   25008 9月  10 23:22 redis-check-aof
 -rwxr-xr-x. 1 hadoop hadoop 5190752 9月  10 23:22 redis-check-rdb
 -rwxr-xr-x. 1 hadoop hadoop 2585952 9月  10 23:22 redis-cli
 lrwxrwxrwx. 1 hadoop hadoop      12 9月  10 23:22 redis-sentinel -> redis-server
 -rwxr-xr-x. 1 hadoop hadoop 5190752 9月  10 23:22 redis-server
直接创建文件6个节点,7001-7006放置redis集群配置文件的
 [hadoop@host152 redis-3.2.11]$ mkdir 7001
 [hadoop@host152 redis-3.2.11]$ mkdir 7002
 [hadoop@host152 redis-3.2.11]$ mkdir 7003
 [hadoop@host152 redis-3.2.11]$ mkdir 7004
 [hadoop@host152 redis-3.2.11]$ mkdir 7005
 [hadoop@host152 redis-3.2.11]$ mkdir 7006
 [hadoop@host152 redis-3.2.11]$ cp redis.conf 7001
 [hadoop@host152 redis-3.2.11]$ cp redis.conf 7002
 [hadoop@host152 redis-3.2.11]$ cp redis.conf 7003
 [hadoop@host152 redis-3.2.11]$ cp redis.conf 7004
 [hadoop@host152 redis-3.2.11]$ cp redis.conf 7005
 [hadoop@host152 redis-3.2.11]$ cp redis.conf 7006
分别进入7001-7006文件夹修改改各个节点对应的配置redis.conf
bind 192.168.72.152
port 7006
daemonize yes
dir /home/hadoop/opensource/redis-3.2.11/7006
logfile "/home/hadoop/opensource/redis-3.2.11/7006/redis.log"
dbfilename "dump-7006.rdb"
cluster-enabled yes
cluster-config-file nodes-7006.conf
 ##设置挂某个节点,不影响集群
cluster-require-full-coverage no 
启动所有节点,查看进程
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-server 7001/redis.conf
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-server 7002/redis.conf
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-server 7003/redis.conf
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-server 7004/redis.conf
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-server 7005/redis.conf
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-server 7006/redis.conf
 [hadoop@host152 redis-3.2.11]$ ps -ef|grep redis
 hadoop    66312      1  0 23:41 ?        00:00:00 ./bin/redis-server 192.168.72.152:7001 [cluster]
 hadoop    66316      1  0 23:41 ?        00:00:00 ./bin/redis-server 192.168.72.152:7002 [cluster]
 hadoop    66320      1  0 23:41 ?        00:00:00 ./bin/redis-server 192.168.72.152:7003 [cluster]
 hadoop    66324      1  0 23:41 ?        00:00:00 ./bin/redis-server 192.168.72.152:7004 [cluster]
 hadoop    66328      1  0 23:41 ?        00:00:00 ./bin/redis-server 192.168.72.152:7005 [cluster]
 hadoop    66332      1  0 23:41 ?        00:00:00 ./bin/redis-server 192.168.72.152:7006 [cluster]
连接7001节点,使用cluster meet命令分别与7002-7006其他节点握手建立联系,显示OK即成功
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7001
 192.168.72.152:7001> cluster meet 192.168.72.152 7002
 OK
 192.168.72.152:7001> cluster meet 192.168.72.152 7003
 OK
 192.168.72.152:7001> cluster meet 192.168.72.152 7004
 OK
 192.168.72.152:7001> cluster meet 192.168.72.152 7005
 OK
 192.168.72.152:7001> cluster meet 192.168.72.152 7006
 OK
查看各个节点是否已经和7001节点connected以及节点数量
 192.168.72.152:7001> cluster nodes
 236bca208b8ed0ba4a1f042d756bbaec56cac6e4 192.168.72.152:7003 master - 0 1694361465216 3 connected
 88be3f0f135e582f93345078e6c32d9d66083755 192.168.72.152:7001 myself,master - 0 0 2 connected
 a65395ca86e3a58b48da86b400b0ae16ee20da82 192.168.72.152:7006 master - 0 1694361469252 4 connected
 018b58f800f2d23d1c712c039d5fda0e90c35426 192.168.72.152:7005 master - 0 1694361465216 5 connected
 45063091c71eecef8b20af40322a9b33b806972a 192.168.72.152:7002 master - 0 1694361467237 1 connected
 c3320213a8c90e6154aff53d8f84fd6a171407a3 192.168.72.152:7004 master - 0 1694361468245 0 connected
 192.168.72.152:7001> 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:2
 cluster_stats_messages_sent:347
 cluster_stats_messages_received:347
备注:或者也登陆客户端用CLUSTER NODES获取各个节点的UUID唯一编码,查看连接的节点
 192.168.72.152:7001> CLUSTER NODES
 88be3f0f135e582f93345078e6c32d9d66083755 :7001 myself,master - 0 0 0 connected
也可以通过cluster-config-file指定的配置.conf文件找到各个节点的编码
 [hadoop@host152 redis-3.2.11]$ more 7001/nodes-7001.conf
 88be3f0f135e582f93345078e6c32d9d66083755 :0 myself,master - 0 0 0 connected
 vars currentEpoch 0 lastVoteEpoch 0
 [hadoop@host152 redis-3.2.11]$ more 7002/nodes-7002.conf
 45063091c71eecef8b20af40322a9b33b806972a :0 myself,master - 0 0 0 connected
 vars currentEpoch 0 lastVoteEpoch 0
 [hadoop@host152 redis-3.2.11]$ more 7003/nodes-7003.conf
 236bca208b8ed0ba4a1f042d756bbaec56cac6e4 :0 myself,master - 0 0 0 connected
 vars currentEpoch 0 lastVoteEpoch 0
 [hadoop@host152 redis-3.2.11]$ more 7004/nodes-7004.conf
 c3320213a8c90e6154aff53d8f84fd6a171407a3 :0 myself,master - 0 0 0 connected
 vars currentEpoch 0 lastVoteEpoch 0
 [hadoop@host152 redis-3.2.11]$ more 7005/nodes-7005.conf
 018b58f800f2d23d1c712c039d5fda0e90c35426 :0 myself,master - 0 0 0 connected
 vars currentEpoch 0 lastVoteEpoch 0
 [hadoop@host152 redis-3.2.11]$ more 7006/nodes-7006.conf
 a65395ca86e3a58b48da86b400b0ae16ee20da82 :0 myself,master - 0 0 0 connected
 vars currentEpoch 0 lastVoteEpoch 0
分别登陆7004/7005/7006节点,用cluster replicate依次设置当前从节点跟随哪个主节点标识
设置7004为从节点,跟随7001
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7004
 192.168.72.152:7004> cluster replicate 88be3f0f135e582f93345078e6c32d9d66083755
 OK
设置7005为从节点,跟随7002
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7005
 192.168.72.152:7005> cluster replicate 45063091c71eecef8b20af40322a9b33b806972a
 OK
设置7006为从节点,跟随7003
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7006
 192.168.72.152:7006> cluster replicate 236bca208b8ed0ba4a1f042d756bbaec56cac6e4
 OK
分配完成后查看主从节点关系master或者slave
 192.168.72.152:7006> cluster nodes
 a65395ca86e3a58b48da86b400b0ae16ee20da82 192.168.72.152:7006 myself,slave 236bca208b8ed0ba4a1f042d756bbaec56cac6e4 0 0 4 connected
 88be3f0f135e582f93345078e6c32d9d66083755 192.168.72.152:7001 master - 0 1694362228496 2 connected
 236bca208b8ed0ba4a1f042d756bbaec56cac6e4 192.168.72.152:7003 master - 0 1694362229004 3 connected
 45063091c71eecef8b20af40322a9b33b806972a 192.168.72.152:7002 master - 0 1694362226980 1 connected
 018b58f800f2d23d1c712c039d5fda0e90c35426 192.168.72.152:7005 slave 45063091c71eecef8b20af40322a9b33b806972a 0 1694362227992 5 connected
 c3320213a8c90e6154aff53d8f84fd6a171407a3 192.168.72.152:7004 slave 88be3f0f135e582f93345078e6c32d9d66083755 0 1694362224957 2 connected
登陆主节点7001/7002/7003分配槽点,redis集群一共有16384个节点,范围在0-16383
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7001
 192.168.72.152:7001> cluster addslots {0..5461}
 (error) ERR Invalid or out of range slot
上述分配报错原因及解决办法
原因:redis-cli的addslots 命令需要的是一个具体数组
         上述的{0..5461}中的{ }在bash中是 brace explansion(括号展开)的意思,在redis-cli客户端中并不认识{}这个命令,再看redis分配slot的命令:
 CLUSTER ADDSLOTS slot [slot …]
         即需要的是一个数组,示例如下才是正确写法,但是总不可能从1写到5461吧,这就很扯了吧
 CLUSTER ADDSLOTS 1 2 3
解决办法:用seq生成序列解决
 查看下面命令
 [hadoop@host152 redis-3.2.11]$ {0..10}
 bash: 0: 未找到命令...
 [hadoop@host152 redis-3.2.11]$ echo {0..10}
 0 1 2 3 4 5 6 7 8 9 10
利用seq生成对应长度的槽点数组即可
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7001 cluster addslots $(seq 0 5461)
 OK
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7002 cluster addslots $(seq 5462 10922 )
 OK
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -h 192.168.72.152 -p 7003 cluster addslots $(seq 10923 16383)
 OK
查看slot分布情况,16384个 槽点是否分配完毕
 192.168.72.152:7001> 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:2
 cluster_stats_messages_sent:5553
 cluster_stats_messages_received:5553
 192.168.72.152:7001> CLUSTER NODES
 236bca208b8ed0ba4a1f042d756bbaec56cac6e4 192.168.72.152:7003 master - 0 1694363986484 3 connected 10923-16383
 88be3f0f135e582f93345078e6c32d9d66083755 192.168.72.152:7001 myself,master - 0 0 2 connected 0-5461
 a65395ca86e3a58b48da86b400b0ae16ee20da82 192.168.72.152:7006 slave 236bca208b8ed0ba4a1f042d756bbaec56cac6e4 0 1694363989507 4 connected
 018b58f800f2d23d1c712c039d5fda0e90c35426 192.168.72.152:7005 slave 45063091c71eecef8b20af40322a9b33b806972a 0 1694363988499 5 connected
 45063091c71eecef8b20af40322a9b33b806972a 192.168.72.152:7002 master - 0 1694363987996 1 connected 5462-10922
 c3320213a8c90e6154aff53d8f84fd6a171407a3 192.168.72.152:7004 slave 88be3f0f135e582f93345078e6c32d9d66083755 0 1694363987492 2 connected
至此集群创建成功,测试集群是否可用
连接7001节点
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -c -h 192.168.72.152 -p 7001
 192.168.72.152:7001> set age 99
 OK
 192.168.72.152:7001> get age
 "99"
连接7002节点
 [hadoop@host152 redis-3.2.11]$ ./bin/redis-cli -c -h 192.168.72.152 -p 7002
 192.168.72.152:7002> get age
 -> Redirected to slot [741] located at 192.168.72.152:7001
 "99"