深入理解Redis Cluster(2)

集群的整个数据库被分为16384个槽,集群中的每个节点可以处理0个或最多16384个槽。当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok),反之,如果数据库中有任何一个槽没有得到处理,则集群处理下线状态(fail)。

查看集群状态

# redis-cli -p 6379
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:6212
cluster_stats_messages_pong_sent:6348
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:12565
cluster_stats_messages_ping_received:6348
cluster_stats_messages_pong_received:6217
cluster_stats_messages_received:12565

查看节点和槽的分配关系

127.0.0.1:6379> cluster nodes
260a27a4afd7be954f7cb4fe12be10641f379746 127.0.0.1:6379@16379 myself,master - 0 1539094639000 1 connected 0-5461
645438fcdb241603fbc92770ef08fa6d2d4c7ffc 127.0.0.1:6380@16380 master - 0 1539094636362 2 connected 5462-10922
bf1aa1e626988a5a35bc2a837c3923d472e49a4c 127.0.0.1:6381@16381 master - 0 1539094639389 0 connected 10923-16383
5350673149500f4c2fd8b87a8ec1b01651572fae 127.0.0.1:6383@16383 master - 0 1539094637000 4 connected
7dd5f5cc8d96d08f35ff395d05eb30ac199f7568 127.0.0.1:6382@16382 master - 0 1539094638000 3 connected
8679f302610e9ea9a464c247f70924e34cd20512 127.0.0.1:6384@16384 master - 0 1539094638381 5 connected

使用cluster replicate添加从节点

cluster replicate命令必须在对应的从节点上执行,后面接的是主节点的节点ID。

[root@slowtech conf]# redis-cli -p 6382
127.0.0.1:6382> cluster replicate 260a27a4afd7be954f7cb4fe12be10641f379746
OK
127.0.0.1:6382> quit
[root@slowtech conf]# redis-cli -p 6383
127.0.0.1:6383> cluster replicate 645438fcdb241603fbc92770ef08fa6d2d4c7ffc
OK
127.0.0.1:6383> quit
[root@slowtech conf]# redis-cli -p 6384
127.0.0.1:6384> cluster replicate bf1aa1e626988a5a35bc2a837c3923d472e49a4c
OK

快捷命令

echo "cluster replicate `redis-cli -p 6379 cluster nodes | grep 6379 | awk '{print $1}'`" | redis-cli -p 6382 -x
echo "cluster replicate `redis-cli -p 6379 cluster nodes | grep 6380 | awk '{print $1}'`" | redis-cli -p 6383 -x
echo "cluster replicate `redis-cli -p 6379 cluster nodes | grep 6381 | awk '{print $1}'`" | redis-cli -p 6384 -x

查看节点和槽的分配关系

127.0.0.1:6384> cluster nodes
8679f302610e9ea9a464c247f70924e34cd20512 127.0.0.1:6384@16384 myself,slave bf1aa1e626988a5a35bc2a837c3923d472e49a4c 0 1539094947000 5 connected
7dd5f5cc8d96d08f35ff395d05eb30ac199f7568 127.0.0.1:6382@16382 slave 260a27a4afd7be954f7cb4fe12be10641f379746 0 1539094947000 3 connected
5350673149500f4c2fd8b87a8ec1b01651572fae 127.0.0.1:6383@16383 slave 645438fcdb241603fbc92770ef08fa6d2d4c7ffc 0 1539094946000 4 connected
bf1aa1e626988a5a35bc2a837c3923d472e49a4c 127.0.0.1:6381@16381 master - 0 1539094948000 0 connected 10923-16383
645438fcdb241603fbc92770ef08fa6d2d4c7ffc 127.0.0.1:6380@16380 master - 0 1539094947306 2 connected 5462-10922
260a27a4afd7be954f7cb4fe12be10641f379746 127.0.0.1:6379@16379 master - 0 1539094948308 1 connected 0-5461

至此,我们基于Redis协议手动创建了一个Cluster,其由6个节点组成,3个主节点负责处理数据,3个从节点负责故障切换。

键到slot的映射算法

HASH_SLOT=CRC16(key)mod16384

重新分片的流程

1. 对目标节点发送cluster setslot <slot> importing <source-node-id>命令,让目标节点准备导入槽的数据。

2. 对源节点发送cluster setslot <slot> migrating <destination-node-id>命令,让源节点准备迁出槽的数据。

3.  源节点循环执行cluster getkeysinslot {slot} {count}命令,获取count个属于槽{slot}的键。

4. 在源节点执行

4. 对于步骤3中获取的每个key,redis-trib.rb都向源节点发送一个MIGRATE <target_ip> <target_port> <key_name> 0 <timeout> 命令,将被选中的键原子性地从源节点迁移至目标节点。

5. 重复执行步骤3和4,直到源节点保存的所有属于槽slot的键值对都被迁移到目标节点为止。

6. redis-trib.rb向集群中的任意一个节点发送CLUSTER SETSLOT <slot> NODE <node-id>命令,将槽slot指派给目标节点。这一消息会发送给整个集群。

客户端ASK重定向流程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/175512e5abc98ac31b76089c5f089927.html