现象
线上由3个控制节点组成的一个raft集群种的一个节点stop了,stop 之前刚发过一条踢掉一台数据节点的命令,但是数据节点并没完全被踢掉---虽然元数据不在了,但是节点还在集群中,前端还能访问它。
问题分析
梳理了下kick 数据节点的业务流程如下:
1.RPC服务器端响应brpc请求;
2.服务器端判断当前如果是leader, 就进入leader 处理流程;
3.leader append KickDataServer 事务日志到所有的副本;
- 每个副本收到事务日志,走下边的流程:
4.1 解析对应的请求类型;
4.2 判断自己现在角色是否leader, 如果不是结束当前流程;如果是,开始apply 这条事务日志:
4.2.1 去掉数据库中关于带kick的数据节点的记录;
4.2.2 针对有副本在待删除节点机器上的block, 发起补副本;
4.2.3 返回给CLI kick数据节点成功;
4.2.4 给待kick的数据节点发下线命令。
上面流程看了两遍,初步怀疑是执行到4.2.3后碰到控制节点被stop 导致的。但后来仔细一下,咱这是基于raft的啊,即便老leader被stop掉,新leader 接管后,也会重放踢数据节点的命令啊? 那问题在哪呢?
遗留问题
-
raft 切主后回放哪些log?
- raft 切主后如何回放log?