引言
快照是Ceph RBD的关键特性,快照的元数据可参考Ceph RBD:快照 + Bluestore/Filestore快照区别一文。
快照id是快照的重要属性,本文介绍快照id的生成策略及其含义。
本文结论
- snap_seq
- 快照id本质上产生于pool上面记录的snap_seq,snap_seq是一个递增的数。
- snap_seq持久化在osdmap中。
- 快照创建时通过monitor获取osdmap中记录的snap_seq。
- snap_seq初始值为1
- snap_seq递增
- rbd创建快照时snap_seq加1。
- rbd删除快照时snap_seq加1。
- 创建第一个image时会在validpool流程创建一个快照并删除,因此用户看到第一个快照的snapid为4。
快照id代码详解
snap_seq
struct pg_pool_t {
snapid_t snap_seq; ///< seq for per-pool snapshot
};
class OSDMap {
mempool::osdmap::map<int64_t,pg_pool_t> pools;
};
创建快照流程
- librbd:创建快照流程,调用librados接口alloc snapid。
- librados:创建快照id,调用objecter接口。
- osd objector:发送消息到monitor获取snapid。
- monitor:获取osdmap,并在snap_seq上递增1后返回snapid。
void SnapshotCreateRequest<I>::send_allocate_snap_id() {
...
image_ctx.data_ctx.aio_selfmanaged_snap_create(&m_snap_id, rados_completion);
...
}
void librados::IoCtxImpl::aio_selfmanaged_snap_create(uint64_t *snapid, AioCompletionImpl *c)
{
...
int r = objecter->allocate_selfmanaged_snap(poolid, &onfinish->snapid,
onfinish);
...
}
int Objecter::allocate_selfmanaged_snap(int64_t pool, snapid_t *psnapid, Context *onfinish