集群异常下的IO

问题

集群出现非致命性故障后,CEPH如何处理IO。

出于对问题的简化,假设分析场景为size为2的情况下rbd的写。

思考

首先,确定有哪些故障情况(非致命性情况):

  • OSD故障
  • 网络故障
  • rbd客户端故障

梳理一下粗略的IO流程

client
 | 
 |1
 ↓
master-osd → 3 → complete → 6 → reply
 |    ↑
 |2   |5
 ↓    | 
slave-osd  → 4 → complete

client表示客户端,master-osd单指一次写操作的主OSD,slave-osd指一次操作的副本OSD,reply表示主OSD对client的应答。

client发起一个写请求,通过网络,发送到master-osd,master-osd于是发送写副本请求道slave-osd,两者并行将数据写入到磁盘中,当slave-osd完成写副本后,回应master-osd。master-osd在主副本都完成写入后回应client,本次写请求结束。

对照上图,不论是哪种情况的故障,都可以表示为某个路径中断。

更详细的故障情况:

  • 1.client与cluster连接异常,表现为1或6路径中断
  • 2.master-osd与slave-osd连接异常,表现为2或5路径中断
  • 3.osd与disk异常,表现为3、4路径中断

故障1

路径1中断的情况很常见,可以是client节点断点,或者是网络问题。
如果是网络出现异常,则client会等待网络畅通后,下发写操作。

故障2

该情况相对复杂,考虑这几种情况:

  • master-osd的写副本请求到达slave-osd,slave-osd未给与回应
  • master-osd的些副本请求到达slave-osd,master-osd故障,导致无法接收回应
  • master-osd的写副本请求未到达slave-osd,slave-osd出现故障
  • master-osd的写副本请求未到达slave-osd,master-osd出现故障

第1种情况和第3种情况是相似的,master-osd在无法收到slave-osd的回应时,无从得知slave-osd的具体情况。
master-osd会一直等待,直到crush map表发生改变,master-osd退出等待,将写请求重新放入处理队列中,直到PG再次恢复后,这个写请求才会再次被处理。假如在crush map表发生变化前,master-osd已经将数据写入磁盘,那么恢复后再次处理写请求时,流程直接跳到完成步骤。
这么做的原因,PG恢复的时候,是通过主向副本拷贝数据和日志,所以恢复流程结束后,副本PG已经拥有写请求的数据,master-osd不需要再发送写副本请求,直接回应client即可。

第2种情况,如果master-osd长时间不上线,slave-osd会变成master-osd,crush map改变后,slave-osd之后的过程和前面相同。在这一过程中,slave-osd转变为新的master-osd。

第4中情况,在PG迁移完毕后,client会重新发送写请求到新的master-osd中。

故障3

进程与对应的磁盘出现问题,一般情况下,多为磁盘故障。

这里罗列两种可能性:

  • 磁盘坏道
  • 磁盘被拔

遇到磁盘问题,OSD选择断言崩溃处理,crush map表改变,原本分发到故障OSD上的IO会一句crush map分散到其他OSD。

你可能感兴趣的:(集群异常下的IO)