redis集群的特点:
1.至少要3主3从
2.redis的集群不用自己配置主从,集群会根据原则自己分配,分配的原则是:主尽量在不同ip上,从尽量不和主在一个ip上
这篇文章讲解一下单机多节点方式配置redis集群:
1.切换到redis的安装目录/usr/local/redis/bin,拷贝redis的集群工具redis-trib.rb到redis安装目录,redis-trib.rb在redis解压后的目录下面:
cp ~/redis-3.2.8/src/redis-trib.rb /usr/local/redis/bin
2.创建一个集群目录redis_cluster
[root@node112 /usr/local/redis/bin]#mkdir redis_cluster
3.创建对应redis端口的几个文件夹,名字随意,这里为了方便记忆,才这样起名字。
[root@node112 /usr/local/redis/bin/redis_cluster]#mkdir 7001 7002 7003 7004 7005 7006
4.分别拷贝配置文件到7001等6个文件夹
[root@node112 /usr/local/redis/bin/redis_cluster]#cp ../redis.conf 7001 [root@node112 /usr/local/redis/bin/redis_cluster]#cp ../redis.conf 7002 [root@node112 /usr/local/redis/bin/redis_cluster]#cp ../redis.conf 7003 [root@node112 /usr/local/redis/bin/redis_cluster]#cp ../redis.conf 7004 [root@node112 /usr/local/redis/bin/redis_cluster]#cp ../redis.conf 7005 [root@node112 /usr/local/redis/bin/redis_cluster]#cp ../redis.conf 7006
5.每一个文件夹下面的redis.conf的需要修改的配置分别如下
7001/redis.conf:
port 7001 #六个节点配置文件分别是7001-7006 daemonize yes bind 0.0.0.0 pidfile /var/run/redis_7001.pid #pidfile文件对应7001-7006 cluster-enabled yes #开启集群 cluster-config-file nodes_7001.conf #保存节点配置(如启动节点是否成功等),自动创建,每个节点要不同 cluster-node-timeout 5000 #集群超时时间5s,节点超过这个时间没反应就断定是宕机 dbfilename "dump7001.rdb"
分别修改7002、7003、7004、7005、7006目录下的redis.conf,跟上边类似,只是port ,pidfile,cluster-config-file的值要和端口对应起来:
7002/redis.conf:
port 7002 daemonize yes bind 0.0.0.0 pidfile /var/run/redis_7002.pid cluster-enabled yes cluster-config-file nodes_7002.conf cluster-node-timeout 5000 dbfilename "dump7002.rdb"
7003/redis.conf:
port 7003 daemonize yes bind 0.0.0.0 pidfile /var/run/redis_7003.pid cluster-enabled yes cluster-config-file nodes_7003.conf cluster-node-timeout 5000 dbfilename "dump7003.rdb"
7004/redis.conf:
port 7004 daemonize yes bind 0.0.0.0 pidfile /var/run/redis_7004.pid cluster-enabled yes cluster-config-file nodes_7004.conf cluster-node-timeout 5000 dbfilename "dump7004.rdb"
7005/redis.conf:
port 7005 daemonize yes bind 0.0.0.0 pidfile /var/run/redis_7005.pid cluster-enabled yes cluster-config-file nodes_7005.conf cluster-node-timeout 5000 dbfilename "dump7005.rdb"
7006/redis.conf:
port 7006 daemonize yes bind 0.0.0.0 pidfile /var/run/redis_7006.pid cluster-enabled yes cluster-config-file nodes_7006.conf cluster-node-timeout 5000 dbfilename "dump7006.rdb"
6.启动6个redis:
[root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7001/redis.conf [root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7002/redis.conf [root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7003/redis.conf [root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7003/redis.conf [root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7004/redis.conf [root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7005/redis.conf [root@node112 /usr/local/redis/bin]#./redis-server redis_cluster/7006/redis.conf
7.ps -ef | grep redis 验证是否都启动成功,可以看到已经启动成功:
[root@node112 /usr/local/redis/bin]#ps -ef |grep redis root 5333 1 0 19:10 ? 00:00:00 ./redis-server 0.0.0.0:7001 [cluster] root 5337 1 0 19:10 ? 00:00:00 ./redis-server 0.0.0.0:7002 [cluster] root 5341 1 0 19:10 ? 00:00:00 ./redis-server 0.0.0.0:7003 [cluster] root 5347 1 0 19:11 ? 00:00:00 ./redis-server 0.0.0.0:7004 [cluster] root 5351 1 0 19:11 ? 00:00:00 ./redis-server 0.0.0.0:7005 [cluster] root 5355 1 0 19:11 ? 00:00:00 ./redis-server 0.0.0.0:7006 [cluster] root 5361 5111 0 19:11 pts/4 00:00:00 grep --color=auto redis
8.创建集群。redis官方提供了redis-trib.rb工具用于创建集群,在第一步里已经放到/usr/local/redis/bin目录下 了,现在就使用这个工具:
[root@node112 /usr/local/redis/bin]#./redis-trib.rb create --replicas 1 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 127.0.0.1:7006 /usr/bin/env: ruby: No such file or directory
要使用redis-trib.rb需要安装ruby,以及redis和ruby连接,那就先安装ruby相关的包:
[root@node112 /usr/local/redis/bin]#yum -y install ruby ruby-devel rubygems rpm-build
安装完成之后再执行一下如下命令:
[root@node112 /usr/local/redis/bin]#gem install redis Fetching: redis-4.0.1.gem (100%) Successfully installed redis-4.0.1 Parsing documentation for redis-4.0.1 Installing ri documentation for redis-4.0.1 Done installing documentation for redis after 1 seconds 1 gem installed
现在就可以再次执行"redis-trib.rb"命令来看看结果了:
[root@node112 /usr/local/redis/bin]#./redis-trib.rb create --replicas 1 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 127.0.0.1:7006 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 Adding replica 127.0.0.1:7004 to 127.0.0.1:7001 Adding replica 127.0.0.1:7005 to 127.0.0.1:7002 Adding replica 127.0.0.1:7006 to 127.0.0.1:7003 M: 93871e8ea32a5041771a2a09d297550de89d0255 127.0.0.1:7001 slots:0-5460 (5461 slots) master M: 05d63406deadc72cb68c8a4edb37083e30edce69 127.0.0.1:7002 slots:5461-10922 (5462 slots) master M: c4d65598e6f6a54636e00b77fedfd8ff00cd7681 127.0.0.1:7003 slots:10923-16383 (5461 slots) master S: 320232db79dd1aa2c30812944bcb3523f7d45810 127.0.0.1:7004 replicates 93871e8ea32a5041771a2a09d297550de89d0255 S: 86c4e4a3fc99914c2fab2ec448237faadf398a50 127.0.0.1:7005 replicates 05d63406deadc72cb68c8a4edb37083e30edce69 S: 2922f983c6f6f523ff3d15b2886142ffa9575269 127.0.0.1:7006 replicates c4d65598e6f6a54636e00b77fedfd8ff00cd7681 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 127.0.0.1:7001) M: 93871e8ea32a5041771a2a09d297550de89d0255 127.0.0.1:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) M: c4d65598e6f6a54636e00b77fedfd8ff00cd7681 127.0.0.1:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 320232db79dd1aa2c30812944bcb3523f7d45810 127.0.0.1:7004 slots: (0 slots) slave replicates 93871e8ea32a5041771a2a09d297550de89d0255 S: 86c4e4a3fc99914c2fab2ec448237faadf398a50 127.0.0.1:7005 slots: (0 slots) slave replicates 05d63406deadc72cb68c8a4edb37083e30edce69 S: 2922f983c6f6f523ff3d15b2886142ffa9575269 127.0.0.1:7006 slots: (0 slots) slave replicates c4d65598e6f6a54636e00b77fedfd8ff00cd7681 M: 05d63406deadc72cb68c8a4edb37083e30edce69 127.0.0.1:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
至此,redis集群就创建完成了。
9.连接集群中的任意一个redis服务:
[root@node112 /usr/local/redis/bin]#./redis-cli -c -p 7002 127.0.0.1:7002> set k1 v1 -> Redirected to slot [12706] located at 127.0.0.1:7003 OK 127.0.0.1:7003> keys * 1) "k1" 127.0.0.1:7003>
很奇怪呀,我连接的是7002的redis,怎么设置一个值之后就跑到了7003这个上面去了呢?这是因为redis集群的值有自己的分配规则,通过算法CRC16(‘my_name’)%16384来计算将这个key 放到哪个节点,这些算法你也不必搞懂,我们在这里只需要记住redis会把值自己分配到计算出来的节点就行了。如现在是3主3从,那么通过这个算法有如下结论:
7001(第一个主)分配到的哈希槽范围是 0-5460
7002(第二个主)分配到的哈希槽范围是 5461-10922
7003(第三个主)分配到的哈希槽范围是 10923-16383。
上边的"set k1 v1"之所以被分配到7003,是因为计算出来的slot是12706,这个slot在7003这个redis的范围之内,所以被存在了以7003为端口的redis中。
10.“redis-trib.rb check 任意一台redis集群中的节点”用于检查当前集群的状态:
[root@node112 /usr/local/redis/bin]#./redis-trib.rb check 127.0.0.1:7006 >>> Performing Cluster Check (using node 127.0.0.1:7006) S: 2922f983c6f6f523ff3d15b2886142ffa9575269 127.0.0.1:7006 slots: (0 slots) slave replicates c4d65598e6f6a54636e00b77fedfd8ff00cd7681 S: 86c4e4a3fc99914c2fab2ec448237faadf398a50 127.0.0.1:7005 slots: (0 slots) slave replicates 05d63406deadc72cb68c8a4edb37083e30edce69 M: 05d63406deadc72cb68c8a4edb37083e30edce69 127.0.0.1:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: c4d65598e6f6a54636e00b77fedfd8ff00cd7681 127.0.0.1:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 320232db79dd1aa2c30812944bcb3523f7d45810 127.0.0.1:7004 slots: (0 slots) slave replicates 93871e8ea32a5041771a2a09d297550de89d0255 M: 93871e8ea32a5041771a2a09d297550de89d0255 127.0.0.1:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
11.杀掉一个master,比如我把以7001为端口的redis杀掉,再观察集群的变化:
[root@node112 /usr/local/redis/bin]#kill -9 5333
12.再检查下集群的情况与状态:
[root@node112 /usr/local/redis/bin]#./redis-trib.rb check 127.0.0.1:7006 >>> Performing Cluster Check (using node 127.0.0.1:7006) S: 2922f983c6f6f523ff3d15b2886142ffa9575269 127.0.0.1:7006 slots: (0 slots) slave replicates c4d65598e6f6a54636e00b77fedfd8ff00cd7681 S: 86c4e4a3fc99914c2fab2ec448237faadf398a50 127.0.0.1:7005 slots: (0 slots) slave replicates 05d63406deadc72cb68c8a4edb37083e30edce69 M: 05d63406deadc72cb68c8a4edb37083e30edce69 127.0.0.1:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: c4d65598e6f6a54636e00b77fedfd8ff00cd7681 127.0.0.1:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 320232db79dd1aa2c30812944bcb3523f7d45810 127.0.0.1:7004 slots:0-5460 (5461 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
可以看到7001这个主节点挂了之后,7001原来的从节点7002由slave自动变为master了。
12.再启动7001呢?
[root@node112 /usr/local/redis/bin]#./redis-server ./redis_cluster/7001/redis.conf [root@node112 /usr/local/redis/bin]#./redis-trib.rb check 127.0.0.1:7006 >>> Performing Cluster Check (using node 127.0.0.1:7006) S: 2922f983c6f6f523ff3d15b2886142ffa9575269 127.0.0.1:7006 slots: (0 slots) slave replicates c4d65598e6f6a54636e00b77fedfd8ff00cd7681 S: 86c4e4a3fc99914c2fab2ec448237faadf398a50 127.0.0.1:7005 slots: (0 slots) slave replicates 05d63406deadc72cb68c8a4edb37083e30edce69 M: 05d63406deadc72cb68c8a4edb37083e30edce69 127.0.0.1:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: c4d65598e6f6a54636e00b77fedfd8ff00cd7681 127.0.0.1:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 320232db79dd1aa2c30812944bcb3523f7d45810 127.0.0.1:7004 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 93871e8ea32a5041771a2a09d297550de89d0255 127.0.0.1:7001 slots: (0 slots) slave replicates 320232db79dd1aa2c30812944bcb3523f7d45810 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
可以看到,7001虽然启动了,却变为了7002的从。这跟什么一样?跟redis里面的哨兵一模一样。
这就是redis的集群。一句话总结,什么是redis集群呢?就是多个“redis的主从配置加上哨兵机制”的集合。
13.当然你不启动7001,而是吧新上来的这个7002这个master也杀掉,没法分配槽slot了,再redis-trib.rb check 127.0.0.1:7001
就会显示报错,因为redis集群至少需要3主3从。