redis cluster几个关键特性介绍

redis cluster 几个关键特性介绍.

首先在本机创建一个最小的cluster(6个节点,3主,3从),至于下载redis3.0 启动每个node实例略过 见官方手册

$ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
 
#查看cluster信息 可知7000主(7003从) 负责的slots(分片):0-5460, 7001主(7004从) 负责的slots: 5461-10922, 7002主(7005从) 负责分片为: 10923-16383
$ redis-cli -p 7000 cluster nodes
1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 127.0.0.1:7005 slave 932421de71b0990ce82c22fcb1e5e0ff96ee083d 0 1430656988143 6 connected
a4f1ea3da348de90d4dbffb3a12be14c0acd39db 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
3ead381974b2ba096ad6a1e9ffe559d7d77e3061 127.0.0.1:7003 slave a4f1ea3da348de90d4dbffb3a12be14c0acd39db 0 1430656987141 4 connected
4d23176839f0ef8cd5cd5039310a748d036d9a65 127.0.0.1:7004 slave bb25019207ac500084d8345a67998c424e2fb1c8 0 1430656987642 5 connected
bb25019207ac500084d8345a67998c424e2fb1c8 127.0.0.1:7001 master - 0 1430656988645 2 connected 5461-10922
932421de71b0990ce82c22fcb1e5e0ff96ee083d 127.0.0.1:7002 master - 0 1430656987141 3 connected 10923-16383
#操作示例
$ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"
  1.  演示主从切换,即主节点宕机了,从节点会自动切换为主节点,并继续提供服务.等之前主节点恢复后,它会变成新主节点的从节点.如下所示:

#连上7002主redis 并设置一个key
$ redis-cli -c -p 7002
127.0.0.1:7002> set foo bar
OK
127.0.0.1:7002> get foo
"bar"
#另一终端中显式终止7002主redis进程 模拟主节点宕机
$ redis-cli -p 7002 debug segfault
Error: Server closed the connection
$ redis-cli -p 7002
Could not connect to Redis at 127.0.0.1:7002: Connection refused
#这时查看cluster信息 7002状态为fail, 从节点7005升级为主节点了
$ redis-cli -p 7000 cluster nodes
1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 127.0.0.1:7005 master - 0 1430657808438 7 connected 10923-16383
932421de71b0990ce82c22fcb1e5e0ff96ee083d 127.0.0.1:7002 master,fail - 1430657460297 1430657457990 3 disconnected
#此时查询该key 显示已经转移到7005上了
$ redis-cli -c -p 7000
127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7005
"bar"
#恢复7002节点 变成7005的从节点了
$ redis-cli -p 7000 cluster nodes
1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 127.0.0.1:7005 master - 0 1430657998727 7 connected 10923-16383
932421de71b0990ce82c22fcb1e5e0ff96ee083d 127.0.0.1:7002 slave 1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 0 1430657998226 7 connected

注: 若7002主节点宕机了,7005从节点切换为主节点后,7002节点并未能及时恢复,不巧7005之后也挂了,这时整个集群就会停止服务了
如下所示:

#模拟之后7005新主节点也宕机了
$ redis-cli -p 7005 debug segfault
Error: Server closed the connection
$ redis-cli -p 7000 cluster nodes
1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 127.0.0.1:7005 master,fail - 1430658569063 1430658567861 9 disconnected 10923-16383
932421de71b0990ce82c22fcb1e5e0ff96ee083d 127.0.0.1:7002 master,fail - 1430658115838 1430658114034 8 disconnected
$ redis-cli -c -p 7000
127.0.0.1:7000> get foo
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7000> set hello world
(error) CLUSTERDOWN The cluster is down

注: 若该节点的配置文件(redis.conf)指定cluster-require-full-coverage为no的话, 其他节点挂了, 仍可以查询当前节点所负责slots中的数据。

cluster-require-full-coverage <yes/no>: If this is set to yes, as it is by default, the cluster stops accepting writes if some percentage of the key space is not covered by any node. If the option is set to no, the cluster will still serve queries even if only requests about a subset of keys can be processed.

2. 演示添加一个主节点7006 并从其他3个主节点中抽取共3000个slot(分片)到7006节点中 如下所示:

#首先启动7006节点
/redis-cluster-test/7006$ redis-server redis.conf
#添加它到集群中
$ ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
#查看集群信息 7006是主节点 但没有由其负责的slots
$ redis-cli -p 7000 cluster nodes
1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 127.0.0.1:7005 slave 932421de71b0990ce82c22fcb1e5e0ff96ee083d 0 1430659348233 10 connected
a4f1ea3da348de90d4dbffb3a12be14c0acd39db 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
3ead381974b2ba096ad6a1e9ffe559d7d77e3061 127.0.0.1:7003 slave a4f1ea3da348de90d4dbffb3a12be14c0acd39db 0 1430659347731 4 connected
c241d0498895a3f486020e4749075593dd569df9 127.0.0.1:7006 master - 0 1430659347228 0 connected
4d23176839f0ef8cd5cd5039310a748d036d9a65 127.0.0.1:7004 slave bb25019207ac500084d8345a67998c424e2fb1c8 0 1430659347228 5 connected
bb25019207ac500084d8345a67998c424e2fb1c8 127.0.0.1:7001 master - 0 1430659347731 2 connected 5461-10922
932421de71b0990ce82c22fcb1e5e0ff96ee083d 127.0.0.1:7002 master - 0 1430659348733 10 connected 10923-16383
#从其他三个主节点中共转移3000个slots给7006
$ ./redis-trib.rb reshard 127.0.0.1:7000
......
How many slots do you want to move (from 1 to 16384)? 3000
What is the receiving node ID? c241d0498895a3f486020e4749075593dd569df9
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:all
......
#再看现在的cluster信息  7006负责的slots有:0-998 5461-6461 10923-11921
$ redis-cli -p 7000 cluster nodes
1c2da25d0b22eaf5e6ea7b151e6d34afc8ae86b9 127.0.0.1:7005 slave 932421de71b0990ce82c22fcb1e5e0ff96ee083d 0 1430659574349 10 connected
a4f1ea3da348de90d4dbffb3a12be14c0acd39db 127.0.0.1:7000 myself,master - 0 0 1 connected 999-5460
3ead381974b2ba096ad6a1e9ffe559d7d77e3061 127.0.0.1:7003 slave a4f1ea3da348de90d4dbffb3a12be14c0acd39db 0 1430659573346 4 connected
c241d0498895a3f486020e4749075593dd569df9 127.0.0.1:7006 master - 0 1430659572845 11 connected 0-998 5461-6461 10923-11921
4d23176839f0ef8cd5cd5039310a748d036d9a65 127.0.0.1:7004 slave bb25019207ac500084d8345a67998c424e2fb1c8 0 1430659573848 5 connected
bb25019207ac500084d8345a67998c424e2fb1c8 127.0.0.1:7001 master - 0 1430659572845 2 connected 6462-10922
932421de71b0990ce82c22fcb1e5e0ff96ee083d 127.0.0.1:7002 master - 0 1430659573346 10 connected 11922-16383

这时只有7006这么一个主节点,没有从节点,若7006挂了,就会导致整个集群停止服务.再演示为其添加一个从节点7007.如下所示:

#首先启动7007从节点
/redis-cluster-test/7007$ redis-server redis.conf
#指定7007为7006的从节点
$ ./redis-trib.rb add-node --slave --master-id c241d0498895a3f486020e4749075593dd569df9 127.0.0.1:7007 127.0.0.1:7000
#查看集群信息
$ redis-cli -p 7000 cluster nodes
2e19ea73f9ec1e15c2f186f2afc6a6b9cbf237f1 127.0.0.1:7007 slave c241d0498895a3f486020e4749075593dd569df9 0 1430660159186 11 connected
c241d0498895a3f486020e4749075593dd569df9 127.0.0.1:7006 master - 0 1430660159688 11 connected 0-998 5461-6461 10923-11921

3. 显然每个主节点拥有的从节点数越多,集群就越稳定.但这又不经济. 折中的办法就是为集群中的一些主节点添加多个从节点,其他的主节点可以仍仅有一个从节点.一旦检测到某个主节点当前没有从节点(如从节点宕机了)存在, 会自动从拥有最多的从节点数的主节点的从节点中选择一个作为该光杆主节点的从节点.如下所示:

#7006主节点 拥有两个从节点7007和7008 7000主节点只有一个从节点(7003)
$ redis-cli -p 7000 cluster nodes
c241d0498895a3f486020e4749075593dd569df9 127.0.0.1:7006 master - 0 1430661014100 11 connected 0-998 5461-6461 10923-11921
2e19ea73f9ec1e15c2f186f2afc6a6b9cbf237f1 127.0.0.1:7007 slave c241d0498895a3f486020e4749075593dd569df9 0 1430661016105 11 connected
4b0367aa025c685dc39b7cbf65be198162fcec0b 127.0.0.1:7008 slave c241d0498895a3f486020e4749075593dd569df9 0 1430661014200 11 connected
 
a4f1ea3da348de90d4dbffb3a12be14c0acd39db 127.0.0.1:7000 myself,master - 0 0 1 connected 999-5460
3ead381974b2ba096ad6a1e9ffe559d7d77e3061 127.0.0.1:7003 slave a4f1ea3da348de90d4dbffb3a12be14c0acd39db 0 1430661015603 4 connected
 
#7000主节点的从节点7003宕机了 7000成了光杆主节点
$ redis-cli -p 7003 debug segfault
Error: Server closed the connection
#查看集群信息 因7006有两个从节点 自动选择其中一个(7007)作为7000的从节点
$ redis-cli -p 7000 cluster nodes
c241d0498895a3f486020e4749075593dd569df9 127.0.0.1:7006 master - 0 1430661199642 11 connected 0-998 5461-6461 10923-11921
4b0367aa025c685dc39b7cbf65be198162fcec0b 127.0.0.1:7008 slave c241d0498895a3f486020e4749075593dd569df9 0 1430661200646 11 connected
 
a4f1ea3da348de90d4dbffb3a12be14c0acd39db 127.0.0.1:7000 myself,master - 0 0 1 connected 999-5460
2e19ea73f9ec1e15c2f186f2afc6a6b9cbf237f1 127.0.0.1:7007 slave a4f1ea3da348de90d4dbffb3a12be14c0acd39db 0 1430661199139 11 connected
3ead381974b2ba096ad6a1e9ffe559d7d77e3061 127.0.0.1:7003 slave,fail a4f1ea3da348de90d4dbffb3a12be14c0acd39db 1430661185586 1430661183080 4 disconnected

补充:
若是7000主节点挂了,7003会升级为主节点。但这时不会发生Replicas migration。

11a8d1b9ae875edf91c8b4e68d465c52cd1176cf 127.0.0.1:7006 master - 0 1430823551690 11 connected 0-1332 5461-6794 10923-12254
4678c8927025f79f09e5dad4c546d4ffcec01ca2 127.0.0.1:7007 slave 11a8d1b9ae875edf91c8b4e68d465c52cd1176cf 0 1430823551189 11 connected
21bdc9569a70c6a8345a1ab64110bdf8623f42a4 127.0.0.1:7008 slave 11a8d1b9ae875edf91c8b4e68d465c52cd1176cf 0 1430823550187 13 connected
 
2d730a3412eb40e5b6ee509ec0fd3fd009830cc2 127.0.0.1:7003 master - 0 1430823551690 15 connected 1333-5460
963439d81197715ba1cfd2ebdb1c84b9806b8bd1 127.0.0.1:7000 master,fail - 1430822830798 1430822828291 13 disconnected

参考文档:

官方导读:

http://redis.io/topics/cluster-tutorial

按照官方导读操作遇到的问题及解决:

  1. 安装ruby(sudo apt-get install ruby-full)后,执行./redis-trib.rb命令报错:

/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- redis (LoadError)
    from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from ./redis-trib.rb:25:in `<main>'

解决方法见: https://groups.google.com/forum/#!topic/redis-db/YoF7s4L-AK8

I have recently gone through this exercise. You need to follow -
 
1. install the rubygem ( http://rubygems.org/pages/download)
2. ruby setup.rb  ( You will find setup.rb in rubygem installation path)
3. gem install rubygems-update -v 1.8.7 ( I have ruby version 1.8.7 so I have upgrade rubygems accordingly)
4. gem install redis
 
 
In case you face the SSL issue on step 3 and 4, you can disable the SSL with following CLI ( If you are doing on LAB setup, this is quick work around)
sudo gem sources -r https://rubygems.org/
 
sudo gem sources -a http://rubygems.org/ 
 
 
Thanks,
Dipak

补充: 我在另一台机器上按照上述方法安装redis(gem install redis)时怎么都不成功,始终报错:

ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    Errno::ECONNRESET: Connection reset by peer - SSL_connect (https://rubygems.org/quick/Marshal.4.8/redis-3.2.1.gemspec.rz)

最后开启了VPN,执行成功了。

Fetching: redis-3.2.1.gem (100%)
Successfully installed redis-3.2.1

2. 执行example.rb(./example.rb 127.0.0.1 7000)时 提示:

/example.rb: line 1: require: command not found
./example.rb: line 8: syntax error near unexpected token `else'
./example.rb: line 8: `else'

解决方法: ruby example.rb 127.0.0.1 7000

转载于:https://my.oschina.net/zhuguowei/blog/411076

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值