注意

本文档适用于 Ceph 开发版本。

映射和PG消息处理

概述

OSD处理将传入消息路由到PG,在某些情况下创建PG。

PG消息通常有两种类型:

  1. 对等消息

  2. 操作/子操作

消息可能以几种方式被丢弃或延迟。重要的是,消息延迟不应导致在到达相关PG处理逻辑的过程中违反某些消息排序要求:

  1. 涉及同一对象的操作不得重新排序。

  2. 对等消息不得重新排序。

  3. 子操作不得重新排序。

MOSDMap

MOSDMap消息可能来自监视器或其他OSD。收到后,OSD必须执行几项任务:

  1. 将新地图持久化到文件存储。

  2. 更新并持久化超级块。

  3. 更新与当前地图相关的OSD状态。

  4. 通过OSDService.

  5. 因池删除而删除PG。

  6. 队列虚拟事件以触发PG地图追赶。

每个PG在处理事件之前,在process_peering_events期间异步赶上当前发布的地图。因此,不同的PG可能对“当前”地图有不同的看法。

这种设计的一个后果是,包含来自多个PG的子消息的消息(MOSDPGInfo、MOSDPGQuery、MOSDPGNotify)必须将每个子消息标记为PG的时期,以及将整个消息标记为OSD的当前发布时期。

MOSDPGOp/MOSDPGSubOp

见OSD::dispatch_op、OSD::handle_op、OSD::handle_sub_op

MOSDPGOps由客户端用于启动rados操作。MOSDSubOps用于OSD之间协调大多数非对等活动,包括复制MOSDPGOp操作。

OSD::require_same_or_newer 地图检查当前OSDMap是否至少与消息上指示的地图时期一样新。如果不是,则通过OSD::wait_for_new_map通过OSD::waiting_for_osdmap将消息排队。注意,这不能违反上述条件,因为任何两条消息都将按接收顺序排队,如果收到一条时期为e0的消息,则来自同一来源的后续消息必须至少为e0时期。注意,来自同一OSD的两个PG在这些目的上被视为不同的来源,即来自不同PG的消息可能会被重新排序。

MOSDPGOps遵循以下流程:

  1. OSD::handle_op:验证权限和crush映射。

  2. OSD::enqueue_op

MOSDSubOps遵循以下流程:

  1. OSD::handle_sub_op检查发送者是否为OSD

  2. OSD::enqueue_op

OSD::enqueue_op调用PG::queue_op,该操作在调用OpWQ::queue之前检查waiting_for_map,并将操作添加到负责处理该操作的PG的队列中。

OSD::dequeue_op最终被调用,并锁定PG。此时,操作被传递到PG::do_request,该操作检查:

  1. PG地图是否足够新(PG::must_delay_op)

  2. 请求操作的客户端是否有足够的权限(PG::op_has_sufficient_caps)

  3. 操作不会被丢弃(PG::can_discard_{request,op,subop,scan,backfill})

  4. PG处于活动状态(PG::flushed布尔值)

  5. 操作是CEPH_MSG_OSD_OP并且PG处于PG_STATE_ACTIVE状态并且不在PG_STATE_REPLAY

如果这些条件不满足,操作将被丢弃或排队以供以后处理。如果所有条件都满足,操作将根据其类型进行处理:

  1. CEPH_MSG_OSD_OP由PG::do_op处理

  2. MSG_OSD_SUBOP由PG::do_sub_op处理

  3. MSG_OSD_SUBOPREPLY由PG::do_sub_op_reply处理

  4. MSG_OSD_PG_SCAN由PG::do_scan处理

  5. MSG_OSD_PG_BACKFILL由PG::do_backfill处理

CEPH_MSG_OSD_OP处理

PrimaryLogPG::do_op处理CEPH_MSG_OSD_OP操作,如果它是CEPH_OSD_OP_PGLS并且为指定的snapid并且一些对象更新仍然缺失,则将其排队

  1. 在wait_for_all_missing中,如果它是CEPH_OSD_OP_PGLS并且为指定的snapid并且一些对象更新仍然缺失

  2. 在waiting_for_active中,如果操作可以写入但清理程序正在工作

  3. 在waiting_for_missing_object中,如果操作需要对象或快照目录或特定快照而它们仍然缺失

  4. 在waiting_for_degraded_object中,如果操作可以写入退化的对象或快照目录,或者如果另一个对象阻止它(“blocked_by”)

  5. 在waiting_for_backfill_pos中,如果操作需要对象,该对象将在回填完成后可用

  6. 在waiting_for_ack中,如果预期从另一个OSD收到确认

  7. 在waiting_for_ondisk中,如果操作正在等待写入完成

对等消息

见OSD::handle_pg_(notify|info|log|query)

对等消息带有两个时期标记:

  1. epoch_sent:消息发送时的地图时期

  2. query_epoch:触发消息的消息发送时的地图时期

在没有触发消息的情况下,这两个是相同的。如果相关PG进入新时期(见PG::old_peering_evt、PG::queue_peering_event),则丢弃对等消息。通知、信息、通知和日志都作为PG::PeeringMachine事件处理,并由PG::queue_*通过PG::CephPeeringEvts包装,其中包括创建的状态机事件以及epoch_sent和query_epoch,以便在插入和从队列中删除时通用检查PG::old_peering_message。

注意,通知、日志和信息可以触发PG的创建。见OSD::get_or_create_pg。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.