一、搭建集群:
三个步骤:
1、准备节点
Redis集群一般由多个节点组成,节点数量至少为6个才能保证组成完整高可用的集群。每个节点需要开启配置cluster-enable yes,让Redis运行在集群模式下。建议为集群内所有节点统一目录,一般划分为三个目录:conf、data、log,分别存放配置、数据和日志相关文件。
启动所有节点,第一次启动时如果没有集群配置文件,它会自动创建一份。当集群内节点信息发生变化,节点会自动保存集群状态到配置文件中。Redis自动维护集群配置文件,不需要手动修改。
2、节点握手
节点握手是指一批运行在集群模式下的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通信的第一步,由客户端发起命令:cluster meet {ip} {port},例如:cluster meet 127.0.0.1 6380,表示让节点6379和6380节点进行握手通信。6379和6380节点通过meet命令彼此建立通信后,对节点6379和6380分别执行cluster nodes 命令,可以看到他们已经彼此感知到对方的存在。
类似的,只需要在集群被任意节点上执行cluster meet 命令加入新节点,握手状态会通过消息在集群内传播,这样其他节点会自动发现新节点并发起握手流程。最后执行cluster nodes 命令确定6个节点都彼此感知并组成集群。通过cluster info 命令可以获取集群当前状态。
3、分配槽
Redis 集群把所有的数据映射到16384个槽中,每个key会映射为一个固定的槽,只有当节点分配了槽,才能相应和这些槽关联的键命令。通过cluster addslots命令为节点分配槽,把16384个slot平均分配给6379、6380、6381三个节点。
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0...5461}
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {5462...10922}
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {10923...16383}
通过cluster info 命令可以查看集群状态,执行cluster nodes 命令可以看到节点和槽的分配关系。
每个负责处理槽的节点应该具有从节点用以保证当他出现故障的时候可以自动进行故障转移。Redis模式下,首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽信息和相关的数据。使用cluster replicate {nodeId}命令让一个节点成为从节点,其中命令执行必须在对应的从节点上执行,nodeId是要复制主节点的节点ID。
通过cluster nodes 命令查看集群状态和复制关系。当我们同意这份计划之后输入yes,redis-trib.rb开始执行节点握手和槽分配操作。最后输出报告说明槽全部被分配,集群创建成功。
集群完整性检查:使用 redis-trib.rb check 命令检测之前创建的集群是否成功,check 命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作。
二、节点通信
1、通信流程
(1)集群中的每个节点都会单独开辟一个TCP通道,用于节点之间彼此通信,通信端口号在基础端口上加10000。
(2)每个节点在固定周期内通过特定规则选择几个节点发送ping消息。
(3)接受到ping消息的节点用pong消息作为响应。
2、Gossip消息
Gossip协议的主要职责是信息交换。信息交换是载体就是节点彼此发送的Gossip消息。常用的分为以下几种,通信模式如图:
- meet消息:用于通知新节点加入,消息发送者通知接收者加入到当前集群。
- ping消息:集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此信息状态。
- pong消息:当接收到了ping、meet信息时,作为响应消息回复给发送方确认消息正常通信。
- fail消息:当节点判断集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态。
3、集群伸缩
集群伸缩就是在Redis集群中添加或删除节点。其原理可抽象为槽和数据再节点之间灵活移动。
(1)扩容
扩容时通过相关命令吧一部分槽和数据迁移给新节点,每个节点负责的槽和数据相比之前变少了从而达到扩容的目的。在集群内任意节点执行 cluster meet 命令让新节点加入到现有集群中。
127.0.0.1:6379> cluster meet 127.0.0.1 6385
(2)收缩
收缩时如果下线的节点有负责的槽需要迁移到其它节点,通过cluster forget命令让集群内其它节点忘记被下线节点。