1、在虚拟机中部署具有三个主节点,三个从节点的集群(注,必须要有从节点),虚拟机的IP地址为192.168.133.129,三个主节点的部口号分别为7001(从:7004)、7002(从:7005)、7003(从:7006)。
2、安装Redis,教程网上都有。这里我们已经准备好的Redis二进制安装文件,放在/opt/modules/redis/bin目录下。再在redis目录下新建data、log、conf三个目录。分别存放集群数据、日志和配置文件。
3、节点1的配置文件(conf/redis-7001.conf)如下:# 以守护进程方式启动
daemonize yes
# 指定进程文件路径,注意其它节点要有相应的变动,把7001变成对应的端口号
pidfile "/opt/modules/redis/run/redis-7001.pid"
# 指定节点的端口
port 7001
# 指定节点的日志文件
logfile "/opt/modules/redis/log/redis-7001.log"
# 指定节点的数据文件
dbfilename "dump-7001.rdb"
# 指定集群的数据目录
dir "/opt/modules/redis/data"
# 启用集群
cluster-enabled yes
# 集群文件名称,这个文件会有Redis自动生成并放在data目录下
cluster-config-file nodes-7001.conf
# 集群节点超时时间
cluster-node-timeout 10000
# 下面两行为了设置节点的密码,以便可以远程访问
masterauth 123456
requirepass 123456
# 绑定IP地址,如果不写黙认绑定127.0.0.1,远程就无法访问
bind 192.168.133.129
其它节点的配置文件直接复制7001节点的配置文件并将7001改成对应的值(7002-7006),配置文件名称也是redis-7002/7006.conf。放在conf目录下。
4、上面完成之后,这里我写了一个脚本,启动这6个节点,注意这个脚本要放在redis目录下,由于脚本中的命令写的是相对路径,所以放在redis目录下,也就是与bin目录同级。脚本文件内容如下:$>pwd
$>/opt/modules/redis
$>cat start.sh
bin/redis-server conf/redis-7001.conf
bin/redis-server conf/redis-7002.conf
bin/redis-server conf/redis-7003.conf
bin/redis-server conf/redis-7004.conf
bin/redis-server conf/redis-7005.conf
bin/redis-server conf/redis-7006.conf
$>sudo chmod +x start.sh
5、再写一个停止6个节点的脚本文件,也放在redis目录下。文件名称为stop.sh$> stop.sh
bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 shutdown
bin/redis-cli -h 192.168.133.129 -p 7002 -a 123456 shutdown
bin/redis-cli -h 192.168.133.129 -p 7003 -a 123456 shutdown
bin/redis-cli -h 192.168.133.129 -p 7004 -a 123456 shutdown
bin/redis-cli -h 192.168.133.129 -p 7005 -a 123456 shutdown
bin/redis-cli -h 192.168.133.129 -p 7006 -a 123456 shutdown
$> chmod +x stop.sh
6、运行start.sh启动6个节点:$> cd /opt/modules/redis
$> sudo ./start.sh
7、好了,现在每个节点都启动起来了,可以用以下命令查看集群状态:$> bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster nodes
注意,这个命令只显示了7001节点是master节点,同样查看7002-7006,都是独立的master主节点。
8、上面的节点都是独立的,现在让它们组成集群,相互发现自己,注意这个操作只需要操作一遍,redis会自己保存集群的配置文件,也就是在节点配置文件中指定的集群配置文件的名称。集群发现脚本如下,文件名为meet.sh,也放在redis目录下:$> cat meet.sh
bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster meet 192.168.133.129 7002
bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster meet 192.168.133.129 7003
bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster meet 192.168.133.129 7004
bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster meet 192.168.133.129 7005
bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster meet 192.168.133.129 7006
解释:上面第一句命令让7001节点发现了7002节点,这样7001、7002就组成了一个集群,再让7001发现7003,由于7001已经在一个集群中了,所以7003就加入到集群中,这个过程,你也可以用7002节点去发现7003道理一样。
好了,现在再执行$> bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster nodes
这条命令就会显示6个master节点。
8、为主节点分配slots,注意:现在主从节点还没有分别,我们只是人为定义7001、7002、7003这三个节点为主节点,分配槽的脚本如下:$> cat slot.sh
for i in {0..5400};do bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster addslots $i; done
for i in {5401..11000};do bin/redis-cli -h 192.168.133.129 -p 7002 -a 123456 cluster addslots $i; done
for i in {11001..16383};do bin/redis-cli -h 192.168.133.129 -p 7003 -a 123456 cluster addslots $i; done
注意:槽数量一定,一共有16384个槽,编号为0..16383,上述命令平均分配三个节点。
9、现在所有的节点都是主节点,现在要将7004、7005、7006这三个节点指定为7001、7002、7003的从节点。命令如下:$> cd /opt/modules/redis
$> bin/redis-cli -h 192.168.133.129 -p 7004 -a 123456 cluster replicate 89bd19f86c9eaa04f6b9aa8e1813a5bfe379c5f2
$> bin/redis-cli -h 192.168.133.129 -p 7005 -a 123456 cluster replicate 08db1cecd4770dd1c086b3cf8c34acb457bb0ebc
$> bin/redis-cli -h 192.168.133.129 -p 7006 -a 123456 cluster replicate 7e618dc71117821d2cbfb908c7a07460a1a286fd
上述命令中的89bd19f86c9eaa04f6b9aa8e1813a5bfe379c5f2是7001节点的ID,08db1cecd4770dd1c086b3cf8c34acb457bb0ebc是7002节点的ID,7e618dc71117821d2cbfb908c7a07460a1a286fd是7003节点的ID。这个ID可以使用命令查看:$> bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster nodes
7e618dc71117821d2cbfb908c7a07460a1a286fd 192.168.133.129:7003@17003 master - 0 1555847474000 5 connected 11001-16383
f3b669f5654eddb5b782bf72bf390dc702b9e201 192.168.133.129:7006@17006 slave 7e618dc71117821d2cbfb908c7a07460a1a286fd 0 1555847475087 5 connected
7196289749e68d25fe77f3e66c44becbe37cc791 192.168.133.129:7005@17005 slave 08db1cecd4770dd1c086b3cf8c34acb457bb0ebc 0 1555847472037 4 connected
89bd19f86c9eaa04f6b9aa8e1813a5bfe379c5f2 192.168.133.129:7001@17001 myself,master - 0 1555847471000 1 connected 0-5400
cb015faba5d1ead01787173998d56852935a19b2 192.168.133.129:7004@17004 slave 89bd19f86c9eaa04f6b9aa8e1813a5bfe379c5f2 0 1555847473048 2 connected
08db1cecd4770dd1c086b3cf8c34acb457bb0ebc 192.168.133.129:7002@17002 master - 0 1555847474077 3 connected 5401-11000
从节点分配好后,如以上命令所示。注意分配置从节点时,这个节点上必须没有被分配任何一个槽,并且节点中没有数据。
10、这个集群就分配好了,可以使用./stop.sh停止,这6个节点,再用./start.sh启动这6个节点,再用$> bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 cluster nodes
这个命令查看,集群状态是对的。redis会自动保存集群的状态。
11、你可以停止7001主节点,发现7004的状态由slave状态变成master状态。$> bin/redis-cli -h 192.168.133.129 -p 7001 -a 123456 shudown
$> bin/redis-cli -h 192.168.133.129 -p 7002 -a 123456 cluster nodes
89bd19f86c9eaa04f6b9aa8e1813a5bfe379c5f2 192.168.133.129:7001@17001 master,fail - 1555848004665 1555848000000 1 disconnected
f3b669f5654eddb5b782bf72bf390dc702b9e201 192.168.133.129:7006@17006 slave 7e618dc71117821d2cbfb908c7a07460a1a286fd 0 1555848029000 5 connected
cb015faba5d1ead01787173998d56852935a19b2 192.168.133.129:7004@17004 master - 0 1555848031010 6 connected 0-5400
08db1cecd4770dd1c086b3cf8c34acb457bb0ebc 192.168.133.129:7002@17002 myself,master - 0 1555848029000 3 connected 5401-11000
7196289749e68d25fe77f3e66c44becbe37cc791 192.168.133.129:7005@17005 slave 08db1cecd4770dd1c086b3cf8c34acb457bb0ebc 0 1555848030000 4 connected
7e618dc71117821d2cbfb908c7a07460a1a286fd 192.168.133.129:7003@17003 master - 0 1555848030000 5 connected 11001-16383
现在可以看到7004已经成为主节点了,下次再将7001启动起来,7001会自动成为7004的从节点。
12、设置数据:$> bin/redis-cli -h 192.168.133.129 -p 7002 -a 123456 set foo 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
(error) MOVED 12182 192.168.133.129:7003
在7002节点上将foo键设置为1时,报了一个错,(error) MOVED 12182 192.168.133.129:7003。注意,这是正常,Redis告诉你,这个foo键的hash槽在7003节点中,不在7002节点中,你应该在7003节点设置foo这个键的值。
如果使用redis desktop manager连接redis集群,如果连接了7002,再设置set foo 1时,会自动切换到7003节点的连接,将设置成功。
如果使用Java的Jedis连接集群也是有专门的配置方式,在设置一个键时,如果槽不在这个节点上,Redis会给出反馈,客户端会自动切换到对应节点上再设置。