在集群命令执行前,需要先按上一章节的方式redis源码之:clion搭建cluster环境,启动四个新的redis节点,但不要执行cluster create命令,保持四个节点独立。
redis-cli的命令执行大抵流程差不多,下面以redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 --cluster-replicas 0
为例,进行代码分析:
一、命令解析
进入redis-cli的main方法,方法中通过parseOptions(),对命令的cmdname,和对应的参数进行解析,此处主要看cluster的,其他的本文不做介绍:
二、匹配命令执行方法proc
在redisvCommand(),先对命令进行封装,然后通过__redisBlockForReply()->redisGetReply()->redisBufferWrite()将命令内容写入对应socketfd的buffer;
组装发往服务端的命令,被服务端通过epoll接收请求并解析执行,具体可以看redis源码之:客户端命令执行Command
三、proc的执行
本文例子的proc就是create命令对应的clusterManagerCommandCreate():
关于cluster set-config-epoch
redis主从选举,采用的raft算法,epoch是经过的选举轮数的标识,在cluster模式下的单个node的主从选举,比如nodeA,B,C,分别有从节点A1,A2,B1,,B2,C1,C2,当A下线,A1,检测到主A下线,则自己将epoch加1,并向B,C两个主节点发送选举信息,B和C同意A1选举为新的主,BC则将自身的epoch修改A1发送过来的epoch。此时A2也会将自身的epoch加1发送同样的选举消息到BC,由于BC发现A2发过来的新Epoch跟A1发过来的一样,或者小于A1发过来的,则拒绝A2的选举信息。
四、集群相关命令
在上面的分析中,主要使用过的命令有,cluster info,cluster nodes,cluster replicate、cluster meet、cluster addslots、cluster set-config-epoch等,通过redis源码之:客户端命令执行Command,可以发现,最终在服务端处理会进入clusterCommand()
在该方法中可以看到支持如下这些米命令:
方法的后续会根据每种命令进行对应的处理