一、创建集群与添加节点(meet)
通过redis源码之:redis-cli 集群命令发现,不管是新建cluster集群还是往集群里添加新节点,都是通过meet指令完成,假设有ABCD四个节点,新建集群:redis-cli --cluster create A B C --cluster-replicas 0
则是以A开始,BC各自向A发送meet请求,当新节点D加入时:redis-cli --cluster add-node D A
D向A发送meet请求,最终通过gossip协议,达成各节点信息最终一致。
当redis-cli执行create或者add-node命令后,最终都是通过cluster meet发往服务端节点,接收到该命令的节点进入clusterCommand():
这里我们是借着redis-cli执行create或者add-node的线索,对于clusternode的初始化还不甚了解,接下来,看看cluster节点的初始化。
二、cluster节点初始化clusterInit
在节点启动时,进入main()->initServer()创建了一个serverCron定时任务,然后再进入clusterInit()完成本地cluster初始化:
这里设置clusterAcceptHandler,等待别的节点来连接本节点时触发,当触发accept时间后,通过clusterAcceptHandler-》clusterConnAcceptHandler-》connSetReadHandler,设置readhandler为:clusterReadHandler
这里主要是对主动请求过来的客户端的处理,这里设置的clusterReadHandler主要是处理对方发送过来的请求,后面clusterCron中会主动去连接别的node,然后也是设置clusterReadHandler处理,不过是处理对方的响应。
三、clusterCron定时任务
在定时任务serverCron执行中,在开启cluster_enabled时,每次定时任务执行都会进入clusterCron():
一秒执行10次:
3.1、新节点连接或重启本方实例后重连
在此处主要还是对通过cluster meet命令加到本方的cluster-nodes的节点,发送meet请求到对方,让对方也认识自己(把自己加到对方的cluster->nodes。并通过clusterReadHandler处理对方的响应。
这里存在一个疑问,在重新本地节点后,重新创建link ,如果失去连接前发送过一次ping,要保存上一次发送ping的时间?
if (old_ping_sent) {/* If there was an active ping before the link was* disconnected, we want to restore the ping time, otherwise* replaced by the clusterSendPing() call. */node->ping_sent = old_ping_sent;}
3.2、每隔一秒随机ping五个实例
每十次遍历(100毫秒一次遍历,十次遍历就是一秒)随机ping五个实例
3.3、集群故障处理
在clusterCron后续的处理中,主要涉及集群故障处理,打算后续再开一篇博文分析。