redis集群之单机多节点实现方式

       

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从。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值