概述
Redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能
一 节点
一个Redis集群由多个节点组成,最初他们都是相互独立的,他们都处于一个只包含自己的集群当中,但是要形成一个真正可用的集群,就必须将各个节点联系起来,构成一个包含多个节点的集群
连接各个节点通过 CLUSTER MEET 命令
连接成功后就可以将对方节点拉到自己所在的集群中,连接页可以称之为握手。节点的状态在redis中是通过clusterNode
对象进行保存的
二 槽指派
Redis集群通过分片的方式来保存数据库中的键值对:集群中的整个数据库被分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个,集群中的每个节点都可以处理0个或者最多16384个槽
当数据库中的16384个槽都有节点在处理时,集群处于上线状态,否则处于下线状态
通过 CLUSTER ADDSLOTS 命令,可以进行节点的槽指派
槽指排信息会记录在clusterNode
对象的slots和numslot属性上。
当设置已经存在的数据,如 set msg "hello world"时,集群会先计算出msg属于哪个槽,然后判断槽属于哪一个节点,如果当前节点不是槽所在的节点,那么会返回moved错误,指引节点转向正在负责这个槽的节点进行数据的处理
三 重新分片
Redis的重新分片可以将任意数量已经指派给某个节点的槽改为指派给另一个节点,并且相关节点的键值对也移动到另一个节点
重新分片可以在线上进行,集群不用下线,并且源节点和目标节点都可以继续执行命令请求
四 ASK错误
当迁移过程中可能会发生错误,访问源节点时数据其实已经迁移到了目标节点,这时候会发出ask错误,并将请求指向目标节点
五 复制和故障转移
集群中的节点分为主节点和从节点,其中主节点复杂处理槽,从节点用于复制某个主节点,例如 7000,7001,7002为3个主节点,将7004,7005设置到集群里,添加为从节点。
集群各个节点会互相发送ping命令,来互相发现对方是不是存于下线状态,clusterNode
中的flags记录了节点的状态,分为三个在线状态,疑似下线状态,下线状态,当半数以上负责处理槽的主节点报告某一主节点为疑似下线状态,那么这个主节点就会被标记为已下线。
六 选取新的主节点
当一个主节点下线了,那么剩下的主节点会进行投票给从节点,从从节点中选择一个新的主节点,当一个从节点获取到的票数大于N/2+1时,这个从节点就会晋升为主节点。这里要说一下,部署4个主节点和部署5个主节点在投票时其实是一样的,因为他们都是需要3张选票才能推选谁是主节点。