Snapshoty RBD obrazů

Pokud chcete mít sami možnost operovat se snapshoty je třeba nám tento požadavek sdělit.

Snapshot je logická kopie obrazu (tedy všech dat na něm uložených) v určitém okamžiku, která je pouze pro čtení. Jednou z pokročilých funkcí blokových zařízení Ceph je to, že můžete vytvářet snapshoty RBD obrazů pro uchování historie stavu v určitém okamžiku. Ceph také podporuje layering, které umožňuje rychle a snadno klonovat RBD obrazy (např. VM obraz). Snapshoty blokového zařízení Ceph jsou spravovány pomocí příkazu rbd a několika rozhraními vyšší úrovně, včetně QEMU, libvirt, OpenStack a CloudStack.

Protože RBD neví o žádném souborovém systému v rámci obrazu (svazku), snapshoty jsou konzistentní pouze pokud nedochází v daný čas k zápisům, či jiným modifikačním operacím. Toho lze docílit buď odpojením file-systému a odmapovaní RBD image, nebo zavoláním funkce fsfreeze na přimapovaném RBD image a připojeném file-systému. Jakou cestu zvolíte záleží na vašem prostředí. Níže jsme zkusili popsat dva scénáře.


A Pokud RBD image není sdílen před více zařízení (viz bod B), ale hrozí, že automatika (orchestrační nástroj, skript atd.) může někdy připojit RBD image i file-systém vícekrát, pak doporučujeme použít při mapování RBD image volbu --exclusive. V tomto případě je nezbytné vyrábět snapshoty na odmapovaném RBD. Ujistěte se zároveň, že daný RBD image nemáte připojený na jiném stroji, například pomocí #rbd –id client_name status rbd_pool_name/rbd_image_name. Pokud image není připojen na žádném jiném stroji, měli byste obdržet hlášení Watchers: none.

B Pokud NEpoužíváte při mapování volbu --exclusive, což může být třeba v případě použití clustrového file-systému, stačí použít příkaz fsfreeze a po dokončení snapshotu opět povolit IO přes fsfreeze s přepínačem –unfreeze. Další podrobnosti najdete na manuálové stránce fsfreeze(8).

Základy pro práci se snapshoty

Následující sekce ukazují základní ovládání snapshotů přes příkaz rbd.

Datové přírustky vzniklé použitím snapshotů se započítávají do dohodnuté kvóty.

Vytvoření snapshotu

Pro vytvoření zadejte název poolu, jméno image v daném poolu a jak chcete aby se snapshot jmenoval.

rbd snap create {pool-name}/{image-name}@{snap-name}

Příklad:

rbd snap create rbd-pool/foo@snapname

Vypsání snapshotů

Pro vypsání již vytvořených snapshotů konkrétního RBD image zadejte název poolu a jméno image.

rbd snap ls {pool-name}/{image-name}

Příklad:

rbd snap ls rbd-pool/foo

Rollback snapshotu

Pokud chcete provést rollback do bodu daného snapshotem zadejte název poolu, jméno image v daném poolu a jméno snapshotu.

rbd snap rollback {pool-name}/{image-name}@{snap-name}

Příklad:

rbd snap rollback rbd-pool/foo@snapname
Rollback znamená, že dojde k přepsání aktuálního stavu RBD obrazu stavem, který odpovídal tomu, kdy byl snapshot vytvořen! Čím je RBD obraz větší, tím bude rollback trvat déle. Rychlejší je vytvořit si klon snapshotu, a teprve pak provést rollback do cílového snapshotu. Více informací najdete v dokumentaci.

Ochrana snapshotů

Pro správu snapshotů doporučujeme, každý snapshot opatřit atributem protected, který znemožní přímé smazání snapshotů pro v případě chyby.

rbd snap protect {pool-name}/{image-name}@{snapshot-name}

Příklad:

rbd snap protect rbd/foo@snapname

Zrušení ochrany snapshotů před mazáním

rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}

Příklad:

rbd snap unprotect rbd/foo@snapname

Smazání snapshotu

Pro smazání snapshotu zadejte název poolu, jméno image v daném poolu a jméno snapshotu.

rbd snap rm {pool-name}/{image-name}@{snap-name}

Příklad:

rbd snap rm rbd-pool/foo@snapname
Ceph odmazává data asynchronně. Sice příkaz „rbd snap rm“ zdánlivě proběhne hned, ale ceph bude ještě chvíli odmazávat data na pozadí. S tím se pojí i doba pro opětovné navýšení volného mista v rámci dohodnuté kvóty.

Připojení snapshotu

Snapshot je možné i připojit v režimu read-only a číst:

rbd map {pool-name}/{image-name}@{snap-name}
mount /dev/rbd/{pool-name}/{image-name}@{snap-name} /mnt/{mountpoint} -o ro

Příklad:

rbd map rbd/foo@snapname
mount /dev/rbd/rbd-pool/foo@snapname /mnt/snap -o ro

Pozor: některé filesystémy vyžadují přidání dalších voleb příkazu mount - např. XFS:

mount /dev/rbd/rbd-pool/foo@snapname /mnt/snap -o ro,norecovery