Ceph RBD (RADOS Block Device) poskytuje uživatelům síťové blokové zařízení, které se v systému, kde je připojeno, tváří jako lokální disk. Blokové zařízení je plně pod správou uživatele, který si zde může vytvořit file-systém a používat ho dle svých potřeb.
Následující návod se vztahuje k distribuci CENTOS/RHEL. Návod pro UBUNTU/DEBIAN naleznete na konci této sekce.
Nejdříve nainstalujeme release.asc klíč pro Ceph repozitáře.
sudo rpm --import 'https://download.ceph.com/keys/release.asc'
V adresáři /etc/yum.repos.d/ vytvoříme textový soubor ceph.repo a do něho vyplníme záznam pro Ceph nástroje. Pro CentOS 9 upravíme v řádek baseurl z „rpm-nautilus/el7“ na „/rpm-reef/el9/“.
Některé balíčky z Ceph repozitáře vyžadují pro správnou funkčnost rovněž knihovny třetích stran, proto ještě přidáme repozitář EPEL.
CentOS 9
sudo dnf install -y epel-release
RedHat 9
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
Nakonec si nainstalujeme základní nástroje pro Ceph, které rovněž obsahují podporu RBD.
sudo dnf install ceph-common
Instalace ceph nástrojů v Debian/Ubuntu
Instalace ceph nástrojů v Debian/Ubuntu
Nejdříve je nezbytné přidat příslušné repozítáře do balíčkovače, do /etc/apt/sources.list přidáme následující řádky.
deb https://eu.ceph.com/debian-reef/ bionic main deb http://cz.archive.ubuntu.com/ubuntu/ bionic main (potreba pro jeden balik potrebny pri instalaci)
Nainstalujeme potřebné balíky z buster repozitáře.
sudo apt install x11-common libevent-core-2.1-7 libevent-pthreads-2.1-7
Přidáme Ubuntu PGP klíče.
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E84AC2C0460F3994 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
Nainstalujeme balíček ceph.
sudo apt install ceph-common
Pro konfiguraci a připojení RBD využijeme údaje, které jste obdrželi od správce systému. Jedná se o následující:
V adresáři /etc/ceph/ vytvoříme textový soubor ceph.conf s následujícím obsahem.
V případě jihlavského úložistě s kódovým označením CL1:
[global] fsid = 19f6785a-70e1-45e8-a23a-5cff0c39aa54 mon_host = [v2:78.128.244.33:3300,v1:78.128.244.33:6789],[v2:78.128.244.37:3300,v1:78.128.244.37:6789],[v2:78.128.244.41:3300,v1:78.128.244.41:6789] auth_client_required = cephx
V případě plzeňského úložistě s kódovým označením CL2:
[global] fsid = 3ea58563-c8b9-4e63-84b0-a504a5c71f76 mon_host = [v2:78.128.244.65:3300/0,v1:78.128.244.65:6789/0],[v2:78.128.244.69:3300/0,v1:78.128.244.69:6789/0],[v2:78.128.244.71:3300/0,v1:78.128.244.71:6789/0] auth_client_required = cephx
V případě ostravkého úložistě s kódovým označením CL3:
[global] fsid = b16aa2d2-fbe7-4f35-bc2f-3de29100e958 mon_host = [v2:78.128.244.240:3300/0,v1:78.128.244.240:6789/0],[v2:78.128.244.241:3300/0,v1:78.128.244.241:6789/0],[v2:78.128.244.242:3300/0,v1:78.128.244.242:6789/0] auth_client_required = cephx
V případě brněnského úložistě s kódovým označením CL4:
[global] fsid = c4ad8c6f-7ef3-4b0e-873c-b16b00b5aac4 mon_host = [v2:78.128.245.29:3300/0,v1:78.128.245.29:6789/0] [v2:78.128.245.30:3300/0,v1:78.128.245.30:6789/0] [v2:78.128.245.31:3300/0,v1:78.128.245.31:6789/0] auth_client_required = cephx
V případě dolnich brezan úložistě s kódovým označením CL5:
[global] fsid = c581dace-40ff-4519-878b-c0ffeec0ffee mon_host = [v2:78.128.245.157:3300/0,v1:78.128.245.157:6789/0] [v2:78.128.245.158:3300/0,v1:78.128.245.158:6789/0] [v2:78.128.245.159:3300/0,v1:78.128.245.159:6789/0] auth_client_required = cephx
Dále v adresáři /etc/ceph/ vytvoříme textový soubor ceph.keyring, do kterého uložíme zaslaný keyring, viz příklad níže.
[client.rbd_user] key = sdsaetdfrterp+sfsdM3iKY5teisfsdXoZ5==
Silně doporučujeme připojovat (mapovat) RBD image s volbou –exclusive. Tato volba zabrání vícenásobnému připojení image (lokálně nebo na více strojích), a tím řeší případy, že by došlo k zápisu do image přes jeden server a o chvílí později k zápisu do toho samého image přes jiný server, což by vyustílo k nenávratnému poškození dat! Pokud tedy hrozí ve vašem prostředí i minimální riziko, že dojde k připojení jednoho image na více mist naráz, doporučujeme volbu –exclusive použít.
Scénář kde by bylo naopak nežádoucí použít –exclusive může být RBD image připojený cíleně na více mist, kde ale zámkování řeší clustrový file-systém.
Nyní můžeme provést namapování RBD (rbd_user je string pocházející z keyringu, po oříznutí stringu client..
sudo rbd --id rbd_user --exclusive device map nazev_poolu/nazev_image
sudo rbd -c /home/username/ceph/ceph.conf -k /home/username/ceph/username.keyring --id rbd_user device map nazev_poolu/nazev_image
Následně prověříme připojení ve zprávách od kernelu.
dmesg
Nyní můžeme zkontrolovat stav RBD.
sudo rbd device list | grep "nazev_image"
Dalším krokem je zašifrování namapovaného image. Pro šifrování využijeme program cryptsetup-luks
sudo yum install cryptsetup-luks
Následně provedeme zašifrování příslušného zařízení.
sudo cryptsetup -s 512 luksFormat --type luks2 /dev/rbdX
Pokud chcete využít automatického připojení a dešifrování RBD po startu, pak doporučujeme přidat ješte šifrovací soubor (tzv. keyfile). Pokud nepotřebujete automatického připojení a dešifrování RBD po startu, nebo sekundární způsob pro dešifrování můžete tento krok přeskočit.
Keyfile může být libovolný soubor obsahující posloupnost znaků či byte použitou pro šifrování. Může tedy obsahovat heslo, nebo to může být třeba i nějaký binární soubor typu obrázek. Důležité je tento soubor neztratit, jelikož bez něj nebo bez znalosti hesla (pokud jste tedy na vytvoření šifrované části použili heslo a pak ještě přidali keyfile jako sekundardní metodu) nebudete schopni již nikdy obsah dešifrovat!
Pro jednoduchost si zde obsah souboru vygenerujeme přes dd.
dd if=/dev/random of=/etc/ceph/luks.keyfile bs=512 count=4
Pozor na to, abyste na dané cestě již neměli jiný keyfile pro jiný disk, protože byste si ho tímto příkazem přepsali.
sudo cryptsetup luksAddKey /dev/rbdX /etc/ceph/luks.keyfile
Na konec zkontrolujeme nastavení.
sudo cryptsetup luksDump /dev/rbdX
Abychom mohli provádět s daným zařízením další akce, musíme jej nejdříve dešifrovat.
sudo cryptsetup luksOpen /dev/rbdX luks_rbdX
Doporučujeme u nových RBD imagů nepoužívat discard pri vytváření file-systému, protože u větších imagů by trvalo zbytečné příliš dlouho.
Vypnutí discard pro XFS a EXT4:
mkfs.xfs -K /dev/rbdX
mkfs.ext4 -E nodiscard /dev/rbdX
Dále doporučujeme u větších image nebo těch, kde časem bude třeba je zvětšit na více než 200TB použít rovnou XFS místo EXT4, jelikož EXT4 má relativně velké omezení co do počtu inodů.
Nyní na daném zařízení vytvoříme souborový systém, zde příklad xfs.
sudo mkfs.xfs -K /dev/mapper/luks_rbdX
Jakmile máme připravený souborový systém, můžeme zařízení připojit do předem vytvořené složky v /mnt/.
sudo mount /dev/mapper/luks_rbdX /mnt/rbd
Odpojení svazku.
sudo umount /mnt/rbd/
Uzamknutí svazku.
sudo cryptsetup luksClose /dev/mapper/luks_rbdX
Odmapování svazku.
sudo rbd --id rbd_user device unmap /dev/rbdX
Pro 512MB:
echo 524288 > /sys/block/rbd0/queue/read_ahead_kb
Pro aplikaci je nutné image odpojit a znovu připojit.
Postup výše v podobě úpravy hodnoty v /sys není pernamentní a po restartu zařízení bude opět použita výchozí (nízka) hodnota. Pro zachování nastavení je třeba použít následující udev pravidlo.
# Setting specific kernel parameters for a subset of block devices (Ceph RBD) KERNEL=="rbd[0-9]*", ENV{DEVTYPE}=="disk", ACTION=="add|change", ATTR{bdi/read_ahead_kb}="524288"
Obsah uložte do souboru /etc/udev/rules.d/50-read-ahead-kb.rules
Nastavení pro automatické připojení RBD včetně rozšifrování LUKS a mount filesystémů. + řádné odpojení (v obráceném pořadí) při řízeném vypnutí stroje.
Níže je uvedené nastavení příslušných konfiguračních souborů pro automatické mapovaní a mountování RBD.
dev-mapper-rbd_luks.device … pomocná, automaticky vytvořená podle fstab (resp. dev-mapper-rbd_luks_ec.device) mnt-rbd_luks.mount … automaticky vytvořená podle fstab (resp. mnt-rbd_luks_ec.mount)
Doplníme následující řádky do konfiguračních souborů:
Doplníme následující řádky do konfiguračních souborů:
Nástroj rbdmap
POZOR služba rbdmap.service
musí být enablována pomocí systemctl enable rbdmap.service
.
/etc/ceph/rbdmap
# RbdDevice Parameters #poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring rbd_nazev_poolu/nazev_image id=rbd_user,keyring=/etc/ceph/ceph.keyring,exclusive
LUKS - šifrování
POZOR cryptab vytvoří pomocnou servisu: systemd-cryptsetup@rbd_luks.service
/etc/crypttab
# <target name> <source device> <key file> <options> rbd_luks /dev/rbd/rbd_nazev_poolu/nazev_image /etc/ceph/luks.keyfile luks,_netdev
/etc/ceph/luks.keyfile
je LUKS klíč.
/dev/rbd/$POOL/$IMAGE
fstab
POZOR fstab opět vytvoří pomocnou servisu: dev-mapper-rbd_luks.device
.
POZOR fstab následně vytvoří servisu pro mountování: mnt-rbd_luks.mount
, kterou následně využijeme pro ruční připojení a odpojení.
/etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass> /dev/mapper/rbd_luks /mnt/rbd_luks xfs defaults,noatime,auto,_netdev 0 0
/dev/mapper/$LUKS_NAME
, $LUKS_NAME
je definováno v /etc/crypttab
(jako „<taget name>“)
systemd
Toto změnu doporučujeme provést pomocí příkazu systemctl edit systemd-cryptsetup
a následně uložit jako soubor s názvem 10-deps.conf
.
/etc/systemd/system/systemd-cryptsetup@rbd_luks.service.d/10-deps.conf
[Unit] After=rbdmap.service Requires=rbdmap.service Before=mnt-rbd_luks.mount
ceph-rbdmap.service
místo rbdmap.service
After=
a Requires=
)
systemctl start mnt-rbd_luks.mount
- jsou-li závislosti systemd jednotek správně, provede RBD map, odemkne LUKS a připojí všechny automatické fs závislé na rbdmap, kterou uvedená .mount jednotka potřebuje (⇒ v popisované konfiguraci připojí oba obrazy).
systemctl stop rbdmap.service
(resp. systemctl stop ceph-rbdmap.service
)
- tento příkaz by měl při správně nastavených závislostech provést umount
, LUKS close
i RBD unmap.
Při změně velikosti šifrovaného image, je nutné dodržet pořadí a použít nástroj pro správný filesystem (zde XFS)
(pozor: nástroje pro jiné filesystémy mohou vyžadovat jako parametr blokové zařízení místo mount pointu a odpojený filesystem).
rbd -c ceph_conf -k ceph_keyring --id ceph_user resize rbd_nazev_poolu/nazev_image --size 200T rbd -c ceph_conf -k ceph_keyring --id ceph_user device map rbd_nazev_poolu/nazev_image cryptsetup open --key-file soubor_s_luks_klicem /dev/rbd/rbd_nazev_poolu/nazev_image rbd_luks cryptsetup resize --key-file soubor_s_luks_klicem --verbose rbd_luks mount /dev/mapper/rbd_luks /mnt/mount_point xfs_growfs /mnt/mount_point
Popis problému: Nejde namapovat RBD a spojení vytimeoutuje.
Řešení:
Nejpravděpodobněji Váš firewall zařezává navazování komunikace do internetu. Je nezbytné na něm povolit rozsah dle daného clusteru na portech 3300 a rozsah portů 6789-7300.
1. na firewallu nastavit „related/established“
2. nastavit na firewallu rozsah clusteru clX a povolit porty u nich port 3300/tcp a rozsah portu 6789 - 7300/tcp.
cl1 - 78.128.244.32/27 cl2 - 78.128.244.64/26 cl3 - 78.128.244.128/25 cl4 - 78.128.245.0/25 cl5 - 78.128.245.128/25
3. aktivujte jumbo frames (podporu velkých rámců). Ty musí být korektně nastaveny po celé cestě až do páteřní sítě CESNET, resp. je musíte mít nastavené na všech vašich aktivních síťových prvcích směrem do CESNET sítě, ale i na samotném serveru, kde zkoušíte RBD image připojit. Na serveru doporučujeme nastavit 9000 bytes, v případě aktivních prvků záleží na více faktorech, které konzultujte s vaším správcem sítě.
CESNET, z. s. p. o.
Generála Píky 26
160 00 Praha 6
Tel: +420 234 680 222
Fax: +420 224 320 269
info@cesnet.cz
Tel: +420 234 680 222
GSM: +420 602 252 531
Fax: +420 224 313 211
support@cesnet.cz