1. 数据分布
Redis Cluster采用虚拟槽对数据进行分区。虚拟槽使用分散度良好的哈希函数把所有的数据均匀映射到0到16383个槽slot中。槽是集群中数据管理和迁移的基本单位。使用槽的目的是为了数据拆分和集群扩展,每个节点负责一定数量的槽。
假设集群中有5个节点:
![](https://img.haomeiwen.com/i4302734/880dde2c5e450755.png)
使用虚拟槽分区的好处是:解耦数据与节点之间的关系简化了节点扩容和收缩难度。
2. 搭建集群
2.1 启动节点
Redis集群数量一般至少为6个才能保证完整高可用的集群。下面看下集群中一个节点的配置:
port 6379
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file "nodes-6379.conf"
daemonize yes
logfile "/Users/yubuyun/tools/redis-space/log/6379.log"
dbfilename "dump-6379.rdb"
dir "/Users/yubuyun/tools/redis-space/data/"
其他节点的配置除了端口号外大致相同。
然后就可以执行启动集群的六个节点了:
./redis-server /Users/yubuyun/tools/redis-space/conf/6379.conf
./redis-server /Users/yubuyun/tools/redis-space/conf/6380.conf
./redis-server /Users/yubuyun/tools/redis-space/conf/6381.conf
./redis-server /Users/yubuyun/tools/redis-space/conf/6382.conf
./redis-server /Users/yubuyun/tools/redis-space/conf/6383.conf
./redis-server /Users/yubuyun/tools/redis-space/conf/6384.conf
2.2 握手
启动完6个节点后,但是每个节点并不知道集群中其他节点的信息,需要相互握手才能建立起集群。节点握手是集群彼此通信的第一步。如想让6379节点和6380节点握手,只需要客户端登录6379节点后,执行:
cluster meet 127.0.0.1 6380
即可完成二者之间的相互握手,6379与其他节点依次握手后,集群节点之间的相互握手就完成了:
cluster meet 127.0.0.1 6381
cluster meet 127.0.0.1 6382
cluster meet 127.0.0.1 6383
cluster meet 127.0.0.1 6384
握手后,执行:
cluster nodes
可以查看集群节点信息:
b4ba4a819ba8c94dda7823e54556121906c47d6a 127.0.0.1:6382@16382 master - 0 1555053359000 0 connected
f301b0ffc3e87ace9edcd5d95e5eccc70c2d1492 127.0.0.1:6384@16384 master - 0 1555053359198 0 connected
71ee98d4e9f9968a0e2a0af8d9f6f7f41cdd71e0 127.0.0.1:6381@16381 master - 0 1555053360000 2 connected
115121b9ede65600f2f104f7131b22819274b808 127.0.0.1:6383@16383 master - 0 1555053361220 4 connected
76c5e9aaed573f92564003fb16b5c59f5d66ef8e 127.0.0.1:6379@16379 myself,master - 0 1555053359000 3 connected
6083a5ca000b68b63b12b10fe0ef75053b3035de 127.0.0.1:6380@16380 master - 0 1555053360209 1 connected
这样集群中的6个节点都相互连接了(包括自己)。
2.3 分配槽
节点握手集群还不能使用,比如在6379的客户端执行set hello world时会报错:
(error) CLUSTERDOWN Hash slot not served
这时每个节点被分配的槽是空的,即槽还没有分配到节点,因此集群无法完成槽到节点的映射,只有16384个槽都分配到节点后,集群才处于在线状态。通过cluster addslots命令来分配槽:
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0..5461}
redis-cli -h 127.0.0.1 -p 6380 cluster addslots {5462..10922}
redis-cli -h 127.0.0.1 -p 6381 cluster addslots {10923..16383}
之前我们在集群中创建了6个节点,现在把16383个槽全部都分给了这三个节点,那剩下三个节点怎么办?这是因为我们将这三个节点设置为主节点,所以把槽直接分配给他们,另外三个节点作为这三个节点的从节点,即一个主节点对应一个从节点,并且从节点复制主节点相关信息。当主节点发生故障时,从节点可以顶上来。
在设置从节点之前我们先执行cluster nodes看下节点信息:
b4ba4a819ba8c94dda7823e54556121906c47d6a 127.0.0.1:6382@16382 master - 0 1555056832000 5 connected
f301b0ffc3e87ace9edcd5d95e5eccc70c2d1492 127.0.0.1:6384@16384 master - 0 1555056833735 0 connected
71ee98d4e9f9968a0e2a0af8d9f6f7f41cdd71e0 127.0.0.1:6381@16381 master - 0 1555056832000 2 connected 10923-16383
115121b9ede65600f2f104f7131b22819274b808 127.0.0.1:6383@16383 master - 0 1555056830000 4 connected
76c5e9aaed573f92564003fb16b5c59f5d66ef8e 127.0.0.1:6379@16379 myself,master - 0 1555056831000 3 connected 0-5461
6083a5ca000b68b63b12b10fe0ef75053b3035de 127.0.0.1:6380@16380 master - 0 1555056832725 1 connected 5462-10922
前面这个长的一串数字就是节点id,马上就会用到。
下面就通过命令让剩下三个节点作为主节点的从节点,从而进行复制:
6382节点复制6379节点,6382节点客户端登录后执行:
cluster replicate 76c5e9aaed573f92564003fb16b5c59f5d66ef8e
6383节点复制6380节点,6383节点客户端登录后执行:
cluster replicate 6083a5ca000b68b63b12b10fe0ef75053b3035de
6384节点复制6381节点,6384节点客户端登录后执行:
cluster replicate 71ee98d4e9f9968a0e2a0af8d9f6f7f41cdd71e0
这样集群中主从节点就形成了,三个主节点负责处理槽和数据,三个节点负责故障转移。
![](https://img.haomeiwen.com/i4302734/dd34bcb720e0d40f.png)
通过cluster nodes命令也可以看出它们之间的主从关系:
b4ba4a819ba8c94dda7823e54556121906c47d6a 127.0.0.1:6382@16382 slave 76c5e9aaed573f92564003fb16b5c59f5d66ef8e 0 1555057846734 5 connected
f301b0ffc3e87ace9edcd5d95e5eccc70c2d1492 127.0.0.1:6384@16384 slave 71ee98d4e9f9968a0e2a0af8d9f6f7f41cdd71e0 0 1555057846000 2 connected
71ee98d4e9f9968a0e2a0af8d9f6f7f41cdd71e0 127.0.0.1:6381@16381 master - 0 1555057846000 2 connected 10923-16383
115121b9ede65600f2f104f7131b22819274b808 127.0.0.1:6383@16383 slave 6083a5ca000b68b63b12b10fe0ef75053b3035de 0 1555057847744 4 connected
76c5e9aaed573f92564003fb16b5c59f5d66ef8e 127.0.0.1:6379@16379 myself,master - 0 1555057847000 3 connected 0-5461
6083a5ca000b68b63b12b10fe0ef75053b3035de 127.0.0.1:6380@16380 master - 0 1555057845000 1 connected 5462-10922
注:通过上述手动创建集群的方式在节点比较多的时候会比较麻烦,可以通过redis-trib.rb这个工具来简化搭建过程,这里就不展开了。
网友评论