Redis有单机模式和集群模式。
集群是 Redis 提供的分布式数据库方案,集群通过分片( sharding )来实现数据共享,并提供复制和故障转移。集群模式可以有多个 master 。使用集群模式可以进一步提升 Redis 性能,分布式部署实现高可用性,更加的稳定。一般较大的项目都会使用redis集群。
ClusterNode结构保存节点状态,有节点创建时间,名字,当前配置纪元,IP地址和端口号,连接节点有关信息。节点还保存着clusterState结构,这个结构记录了该节点视角下集群的状态(是否在线,节点数,配置纪元)
CLUSTERMEET<ip> <port>
收到命令的节点A将与节点B进行握手( handshake ),以此来确认彼此的存在,并为将来的进一步通信打好基础:
1)节点A会为节点B创建一个clusterNode结构,并将该结构添加到自己的clusterState.nodes字典里面。
2)之后,节点A将根据CLUSTER MEET命令给定的IP地址和端口号,向节点B发送一条MEET消息( message ).
3)如果一切顺利,节点B将接收到节点A发送的MEET消息,节点B会为节点A创建一个clusterNode结构,并将该结构添加到自己的clusterstate.nodes字典里面。
4)之后,节点B将向节点A返回一条PONG消息。
5)如果一切顺利,节点A将接收到节点B返回的PONG消息,通过这条PONG消息节点A可以知道节点B已经成功地接收到了自己发送的MEET消息。
6)之后,节点A将向节点B返回一条编福消息。
7)如果一切顺利,节点B将接收到节点A返回的PING消息,通过这条PING消息节点B可以知道节点A已经成功地接收到了自己返回的 PONG消息,握手完成。
?
Redis通过分片的方式来保存数据库中的键值对,集群的整个数据库被分为16384个槽,数据库中每一个键都属于其中一个槽,集群中的节点可以处理0-16384个槽。
所有槽都有节点处理时,集群为上线状态;有任何一个槽没有被节点处理,集群为下线状态。
使用cluster addslots命令给节点分配槽。
clusterNode结构的slots,numslot记录处理的槽和槽的数量,
节点会将自己的slots数组发送给集群中其他节点告知他们自己处理哪些槽
clusterState结构中的slots记录了集群中16384个槽的指派信息
在对数据库中的16384个槽都进行了指派之后,集群就会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了。
?
当节点发现键所在的槽并非由自己处理时,节点向客户端返回一个moved错误,指引客户端转向正确的节点(集群模式move错误不会打印,单机模式会)
节点和单机服务器在数据库方面的一个区别是,节点只能使用0号数据库,而单轨Redis服务器则没有这一限制。
Redis可以重新分片
迁移时要查找的键已经迁移了,在目标节点,向客户端返回ask错误,指引客户端转向正确的节点(集群模式ask错误不会打印,单机模式会)
Asking命令打开发送该命令的客户端的redis_asking标识,表示已经转向到正确节点了(一次性标志)
1.MOVED错误代表槽的负责权已经从一个节点转移到了另一个节点:在客户端收到关于槽i的MOVED错误之后,客户端每次遇到关于槽i的命令请求时,都可以直接将命令请求发送至MOVED错误所指向的节点,因为该节点就是目前负责槽i的节点。
2.与此相反,ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施:在客户端收到关于槽i的ASK错误之后,客户端只会在接下来的一次命令请求中将关于槽i的命令请求发送至ASK错误所指示络菲点,但这种转向不会对客户端今后发送关于槽i的命令请求产生任何影响,客户端仍然会将关于槽i的命令请求发送至目前负责处理槽i的节点,除非ASK错误再次出现。
?
节点分为主节点和从节点,主节点处理槽,从节点复制其主节点,并在主节点下线时代替
集群中每个节点都会定期地向集群中其他节点发送Ping消息,检测对方是否在线。如果没有返回pong,将该节点标记为疑似下线(falgs属性打开pfail标志)
一个集群中如果半数以上负责处理槽的主节点将某个主节点报告为疑似下线,该主节点将会被标记为已下线(fail),并向集群广播该主节点的fail消息,所有节点将其标记为已下线
一个主节点下线时执行故障转移: