1、
redis-cluster
架构图
redis-cluster
投票
:
容错
架构细节
:
(1)
所有的
redis
节点彼此互联
(PING-PONG
机制
),
内部使用二进制协议优化传输速度和带宽
.
(2)
节点的
fail
是通过集群中超过半数的节点检测失效时才生效
.
(3)
客户端与
redis
节点直连
,
不需要中间
proxy
层
.
客户端不需要连接集群所有节点
,
连接集群中任何一个可用节点即可
(4)redis-cluster
把所有的物理节点映射到
[0-16383]slot
上
,cluster
负责维护
node<->slot<->value
Redis
集群中内置了
16384
个哈希槽,当需要在
Redis
集群中放置一个
key-value
时,
redis
先对
key
使用
crc16
算法算出一个结果,然后把结果对
16384
求余数,这样每个
key
都会对应一个编号在
0-16383
之间的哈希槽,
redis
会根据节点数量大致均等的将哈希槽映射到不同的节点
2、
Redis
集群的搭建
1、
集群搭建环境
1.1
、使用
ruby
脚本搭建集群。需要
ruby
的运行环境。
安装ruby
yum install ruby
yum install rubygems
1.2、安装ruby脚本运行使用的包。
[root@localhost ~]#
gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0...
Installing RDoc documentation for redis-3.0.0...
[root@localhost ~]#
[root@localhost ~]# cd redis-3.0.0/src
[root@localhost src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr 1 2015
redis-trib.rb
2、
搭建步骤
需要6
台redis
服务器。搭建伪分布式。
需要6
个redis
实例。
需要运行在不同的端口7001-7006
注意:6个实例既是bin中宝贝过来,要删除其中的
dump.rdb文件。
第一步:创建6
个redis
实例,每个实例运行在不同的端口。需要修改redis.conf
配置文件。配置文件中还需要把cluster-enabled yes
前的注释去掉。
第二步:启动每个redis
实例。
第三步:使用ruby
脚本搭建集群。
./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
|
创建启动集群的脚本:
[root@localhost redis-cluster]# vim start-all.sh
cd 7001
./redis-server redis.conf
cd ..
cd 7002
./redis-server redis.conf
cd ..
cd 7003
./redis-server redis.conf
cd ..
cd 7004
./redis-server redis.conf
cd ..
cd 7005
./redis-server redis.conf
cd ..
cd 7006
./redis-server redis.conf
cd ..
创建关闭集群的脚本:
[root@localhost redis-cluster]# vim shutdow-all.sh
7001/redis-cli -p 7001 shutdown
7002/redis-cli -p 7002 shutdown
7003/redis-cli -p 7003 shutdown
7004/redis-cli -p 7004 shutdown
7005/redis-cli -p 7005 shutdown
7006/redis-cli -p 7006 shutdown
[root@localhost redis-cluster]# chmod u+x shutdow-all.sh
[root@localhost redis-cluster]#
./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
>>> Creating cluster
Connecting to node 192.168.25.153:7001: OK
Connecting to node 192.168.25.153:7002: OK
Connecting to node 192.168.25.153:7003: OK
Connecting to node 192.168.25.153:7004: OK
Connecting to node 192.168.25.153:7005: OK
Connecting to node 192.168.25.153:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.25.153:7001
192.168.25.153:7002
192.168.25.153:7003
Adding replica 192.168.25.153:7004 to 192.168.25.153:7001
Adding replica 192.168.25.153:7005 to 192.168.25.153:7002
Adding replica 192.168.25.153:7006 to 192.168.25.153:7003
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001
slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002
slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003
slots:10923-16383 (5461 slots) master
S: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004
replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
S: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005
replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006
replicates 2935007902d83f20b1253d7f43dae32aab9744e6
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 192.168.25.153:7001)
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001
slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002
slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003
slots:10923-16383 (5461 slots) master
M: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004
slots: (0 slots) master
replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
M: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005
slots: (0 slots) master
replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
M: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006
slots: (0 slots) master
replicates 2935007902d83f20b1253d7f43dae32aab9744e6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost redis-cluster]#
|
注意:如果在搭建集群过程中出现(/usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:79:in `call': ERR Slot 4648 is already busy (Redis::CommandError))的问题
解决方式:先关闭集群,然后到各个节点下删除nodes.conf和dump.rdb文件,然后重启集群问题得以解决。