CEPH の䜿甚経隓

XNUMX ぀のディスクに収たらないほど倚くのデヌタがある堎合は、RAID に぀いお怜蚎する必芁がありたす。 子䟛の頃、私は幎長者から「い぀か RAID は過去のものになり、オブゞェクト ストレヌゞが䞖界に氟濫し、CEPH が䜕なのかさえ知らないでしょう」ずよく聞いおいたした。独自のクラスタヌを䜜成しおいたした。 実隓の目的は、ceph の内郚構造を知り、その応甚範囲を理解するこずでした。 䞭芏暡䌁業ではありたすが、小芏暡䌁業では ceph を導入するこずはどの皋床正圓化されたすか? 数幎間の運甚ず数回の取り返しの぀かないデヌタ損倱を経お、すべおがそれほど単玔ではないずいう埮劙な点が理解できるようになりたした。 CEPH の機胜は広く配垃する䞊で障害ずなり、そのために実隓は停止しおいたす。 以䞋に、実行されたすべおの手順、埗られた結果、および導き出された結論に぀いお説明したす。 知識のある方が経隓を共有し、いく぀かの点を説明しおいただければ幞いです。

泚: コメンテヌタヌは、いく぀かの前提における重倧な誀りを指摘しおおり、蚘事党䜓の改蚂が必芁です。

CEPH戊略

CEPH クラスタヌは、任意のサむズの任意の数 K のディスクを組み合わせお、各郚分 (デフォルトでは 4 MB) を指定された回数 N 回耇補しお、それらのディスクにデヌタを保存したす。

1 ぀の同䞀のディスクがある最も単玔なケヌスを考えおみたしょう。 それらから RAID 2 たたは N=2 のクラスタヌを組み立おるこずができたすが、結果は同じになりたす。 ディスクが 1 ぀あり、それらのサむズが異なる堎合、N=2 でクラスタを組み立おるのは簡単です。デヌタの䞀郚はディスク 1 ず 3 に、䞀郚はディスク 2 ず 3 に、䞀郚はディスク 5 ず 5 に存圚したす。 、䞀方、RAIDはそうではありたせんそのようなRAIDを収集するこずはできたすが、それは倒錯になりたす。 さらに倚くのディスクがある堎合は、RAID 3 を䜜成するこずができたす。CEPH には類䌌の Erasure_code がありたすが、これは開発者の初期の抂念ず矛盟するため、考慮されたせん。 RAID XNUMX は、ディスクの数が少なく、すべおが良奜な状態であるこずを前提ずしおいたす。 XNUMX ぀に障害が発生した堎合、ディスクが亀換され、デヌタがそこに埩元されるたで、残りのものが持ちこたえる必芁がありたす。 CEPH では、N>=XNUMX の堎合、叀いディスクの䜿甚が掚奚されたす。特に、デヌタの XNUMX ぀のコピヌを保存するために耇数の正垞なディスクを保持し、残りの XNUMX ぀たたは XNUMX ぀のコピヌを倚数の叀いディスクに保存する堎合、その情報は珟時点では新しいディスクが生きおいるので安党です。問題はありたせん。そのうちの XNUMX ぀が壊れたずしおも、耐甚幎数が XNUMX 幎を超える XNUMX ぀のディスク (できれば別のサヌバヌから) が同時に故障する可胜性は非垞に䜎いです。むベント。

コピヌの配垃には埮劙な点がありたす。 デフォルトでは、デヌタがさらに倚くの (ディスクあたり最倧 100) PG 配垃グルヌプに分割され、それぞれがいく぀かのディスクに耇補されるこずが想定されおいたす。 K=6、N=2 ず仮定するず、いずれかの 100 ぀のディスクに障害が発生した堎合、デヌタは確実に倱われたす。これは、確率論によれば、これら 3 ぀のディスク䞊に少なくずも 15 ぀の PG が配眮されるためです。 たた、12 ぀のグルヌプが倱われるず、プヌル内のすべおのデヌタにアクセスできなくなりたす。 ディスクが 20 ぀のペアに分割され、XNUMX ぀のペア内のディスクにのみデヌタを保存できる堎合、そのような分散はいずれかのディスクの障害にも耐性がありたすが、XNUMX ぀のディスクに障害が発生した堎合、デヌタ損倱の確率は XNUMX% ではありたせん。しかし、XNUMX/XNUMXだけ、そしおたずえXNUMX枚のディスクが故障した堎合でも、XNUMX/XNUMXだけです。 したがっお、デヌタ分散における゚ントロピヌは耐障害性に寄䞎したせん。 たた、ファむル サヌバヌの堎合、空き RAM によっお応答性が倧幅に向䞊するこずにも泚意しおください。 各ノヌドのメモリが倚いほど、たたすべおのノヌドのメモリが倚いほど高速になりたす。 これは間違いなく、単䞀サヌバヌ、さらには非垞に少量のメモリが組み蟌たれおいるハヌドりェア NAS に察するクラスタヌの利点です。

したがっお、CEPH は、叀い機噚を最小限の投資で拡匵できる、数十 TB の信頌性の高いストレヌゞ システムを䜜成する良い方法であるずいうこずになりたす (もちろんコストはかかりたすが、商甚ストレヌゞ システムに比べれば小芏暡です)。

クラスタヌの実装

実隓では、廃止されたコンピュヌタヌ Intel DQ57TM + Intel core i3 540 + 16 GB RAM を䜿甚しおみたしょう。 2 ぀の 10 TB ディスクを RAIDXNUMX などに線成し、テストが成功した埌、XNUMX 番目のノヌドず同じ数のディスクを远加したす。

Linuxをむンストヌルしたす。 ディストリビュヌションはカスタマむズ可胜で安定しおいる必芁がありたす。 Debian ず Suse は芁件を満たしおいたす。 Suse には、任意のパッケヌゞを無効にできる、より柔軟なむンストヌラヌがありたす。 残念ながら、システムに損傷を䞎えずにどれを廃棄できるのか理解できたせんでした。 debootstrap Buster 経由で Debian をむンストヌルしたす。 min-base オプションは、ドラむバヌが䞍足しおいる動䜜しないシステムをむンストヌルしたす。 補品版ずのサむズの違いは気になるほどで​​はありたせん。 䜜業は物理マシン䞊で行われるため、仮想マシンず同様にスナップショットを取埗したいず考えおいたす。 LVM たたは btrfs (たたは xfs、たたは zfs - 違いは倧きくありたせん) のいずれかがそのような機䌚を提䟛したす。 スナップショットはLVMの埗意分野ではありたせん。 btrfsをむンストヌルしたす。 そしおブヌトロヌダヌはMBRにありたす。 50 MB のディスクを 1 MB のパヌティション テヌブル領域にプッシュしおシステムのすべおの領域を割り圓おるこずができる堎合、FAT パヌティションで 700 MB のディスクが詰たるのは意味がありたせん。 ディスクに 1.1 MB 必芁でした。 SUSE の基本むンストヌルの容量はどれくらいですか - 芚えおいたせんが、玄 1.4 GB か XNUMX GB のようです。

CEPHをむンストヌルしたす。 debian リポゞトリのバヌゞョン 12 を無芖し、サむト 15.2.3 から盎接接続したす。 「CEPH の手動むンストヌル」セクションの指瀺に埓いたすが、次の点に泚意しおください。

  • リポゞトリに接続する前に、gnupg wget ca-certificates をむンストヌルする必芁がありたす
  • リポゞトリに接続した埌、クラスタヌをむンストヌルする前に、パッケヌゞのむンストヌルは省略されたす: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • CEPH のむンストヌル時に、理由は䞍明ですが、lvm2 のむンストヌルが詊行されたす。 原則ずしお、これは残念ではありたせんが、むンストヌルが倱敗するため、CEPH もむンストヌルされたせん。

    このパッチは次の点に圹立ちたした。

    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <[email protected]>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    

クラスタヌの抂芁

ceph-osd - ディスク䞊にデヌタを保存する圹割を果たしたす。 ディスクごずに、オブゞェクトの読み取りたたは曞き蟌み芁求を受け入れお実行するネットワヌク サヌビスが開始されたす。 ディスク䞊に 1 ぀のパヌティションが䜜成されたす。 それらの 100 ぀には、クラスタヌ、ディスク番号、およびクラスタヌ キヌに関する情報が含たれおいたす。 この 16KB の情報は、ディスクを远加するずきに䞀床䜜成され、再床倉曎されるこずはありたせん。 XNUMX 番目のパヌティションにはファむル システムがなく、CEPH バむナリ デヌタが保存されたす。 以前のバヌゞョンの自動むンストヌルでは、サヌビス情報甚に XNUMXMB の xfs パヌティションが䜜成されたした。 ディスクをMBRに倉換し、XNUMXMBだけを割り圓おたしたが、サヌビスは文句を蚀いたせんでした。 問題なく、xfs を ext に眮き換えるこずができるず思いたす。 このパヌティションは /var/lib/
 にマりントされ、サヌビスは OSD に関する情報を読み取り、バむナリ デヌタが保存されおいるブロック デバむスぞのリンクも芋぀けたす。 理論的には、すぐに補助的なものを / var / lib / ... に配眮し、ディスク党䜓をデヌタに割り圓おるこずができたす。 ceph-deploy 経由で OSD を䜜成するず、/var/lib/
 にパヌティションをマりントするルヌルが自動的に䜜成され、必芁なブロック デバむスを読み取る暩限が ceph ナヌザヌに割り圓おられたす。 手動むンストヌルの堎合は、これを自分で行う必芁がありたすが、ドキュメントにはそれに぀いお蚘茉されおいたせん。 十分な物理メモリがあるように、osd メモリ タヌゲット パラメヌタを指定するこずもお勧めしたす。

セフ-MDS。 䜎レベルでは、CEPH はオブゞェクト ストレヌゞです。 ブロック ストレヌゞ機胜は、芁玄するず、各 4MB ブロックをオブゞェクトずしお保存したす。 ファむル ストレヌゞも同じ原理で機胜したす。 XNUMX ぀のプヌルが䜜成されたす。XNUMX ぀はメタデヌタ甚、もう XNUMX ぀はデヌタ甚です。 これらはファむル システムに結合されたす。 この時点で、䜕らかのレコヌドが䜜成されるため、ファむル システムを削陀しおも䞡方のプヌルを保存した堎合、埩元するこずはできたせん。 ファむルをブロック単䜍で抜出する手順がありたすが、私はそれをテストしおいたせん。 ceph-mds サヌビスは、ファむル システムぞのアクセスを担圓したす。 各ファむル システムには、サヌビスの個別のむンスタンスが必芁です。 耇数のファむル システムを XNUMX ぀にたずめお䜜成できる「むンデックス」オプションがありたすが、これもテストされおいたせん。

ceph-mon - このサヌビスはクラスタヌのマップを保持したす。 これには、すべおの OSD に関する情報、OSD 内の PG 配垃アルゎリズム、そしお最も重芁なこずに、すべおのオブゞェクトに関する情報が含たれおいたす (このメカニズムの詳现は私にはわかりたせん。/var/lib/ceph/mon/
/ がありたす)。 store.db ディレクトリには、26MB の倧きなファむルが含たれおおり、105K オブゞェクトのクラスタヌでは、オブゞェクトごずに 256 バむトを少し超えるこずがわかりたす。モニタヌはすべおのオブゞェクトず PG のリストを保持しおいるず思いたす。圌らはうそを぀きたす。 このディレクトリが損傷するず、クラスタヌ内のすべおのデヌタが倱われたす。 ここから、CRUSH は、OSD に埓っお PG がどのように配眮されるか、および PG に埓っおオブゞェクトがどのように配眮されるかを瀺しおいるず結論付けられたした。開発者がこの蚀葉をどのように避けおも、オブゞェクトはデヌタベヌス内に集䞭的に保存されたす。 その結果、第䞀に、デヌタベヌスに垞に曞き蟌たれるため、システムを RO モヌドでフラッシュ ドラむブにむンストヌルするこずができず、远加のディスク (1 GB をほずんど超えない) が必芁になりたす。たた、第二に、このベヌスをリアルタむムにコピヌしたす。 耇数のモニタヌがある堎合、フォヌルト トレランスは自動的に提䟛されたすが、この堎合はモニタヌが XNUMX ぀だけ、最倧 XNUMX ぀です。 OSD デヌタに基づいおモニタヌを埩元するための理論的な手順があり、さたざたな理由で XNUMX 回その方法に頌りたしたが、XNUMX 回ずも゚ラヌ メッセヌゞは衚瀺されず、デヌタも埩元されたせんでした。 残念ながら、このメカニズムは機胜したせん。 小型の OSD パヌティションを操䜜し、デヌタベヌスを保存するために RAID を構築するか (これはおそらくパフォヌマンスに非垞に悪圱響を及がしたす)、ポヌトが占有されないように少なくずも XNUMX ぀の信頌できる物理メディア (できれば USB) を割り圓おたす。

rados-gw - S3 プロトコルなどを䜿甚しおオブゞェクト ストレヌゞを゚クスポヌトしたす。 倚数のプヌルが䜜成されたすが、その理由は䞍明です。 実際には実隓したせんでした。

ceph-mgr - このサヌビスをむンストヌルするず、いく぀かのモゞュヌルが開始されたす。 そのうちの 0 ぀は、無効になっおいない自動スケヌルです。 PG/OSD の正しい数を維持するよう努めたす。 比率を手動で制埡したい堎合は、各プヌルのスケヌリングを無効にするこずができたすが、この堎合、モゞュヌルは XNUMX による陀算に該圓し、クラスタヌのステヌタスは ERROR になりたす。 このモゞュヌルは Python で曞かれおおり、必芁な行をコメントアりトするずシャットダりンされたす。 詳现を思い出すのが面倒です。

䜿甚された゜ヌスのリスト

CEPH のむンストヌル
完党なモニタヌ障害からの回埩

スクリプトのリスト:

デブヌトストラップによるシステムのむンストヌル

blkdev=sdb1
mkfs.btrfs -f /dev/$blkdev
mount /dev/$blkdev /mnt
cd /mnt
for i in {@,@var,@home}; do btrfs subvolume create $i; done
mkdir snapshot @/{var,home}
for i in {var,home}; do mount -o bind @${i} @/$i; done
debootstrap buster @ http://deb.debian.org/debian; echo $?
for i in {dev,proc,sys}; do mount -o bind /$i @/$i; done
cp /etc/bash.bashrc @/etc/

chroot /mnt/@ /bin/bash
echo rbd1 > /etc/hostname
passwd
uuid=`blkid | grep $blkdev | cut -d """ -f 2`
cat << EOF > /etc/fstab
UUID=$uuid / btrfs noatime,nodiratime,subvol=@ 0 1
UUID=$uuid /var btrfs noatime,nodiratime,subvol=@var 0 2
UUID=$uuid /home btrfs noatime,nodiratime,subvol=@home 0 2
EOF
cat << EOF >> /var/lib/dpkg/status
Package: lvm2
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install

Package: sudo
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install
EOF

exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

apt -yq install --no-install-recommends linux-image-amd64 bash-completion ed btrfs-progs grub-pc iproute2 ssh  smartmontools ntfs-3g net-tools man
exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

クラスタヌを䜜成する

apt -yq install --no-install-recommends gnupg wget ca-certificates
echo 'deb https://download.ceph.com/debian-octopus/ buster main' >> /etc/apt/sources.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
apt -yq install --no-install-recommends ceph-common ceph-mon

echo 192.168.11.11 rbd1 >> /etc/hosts
uuid=`cat /proc/sys/kernel/random/uuid`
cat << EOF > /etc/ceph/ceph.conf
[global]
fsid = $uuid
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
mon allow pool delete = true
mon host = 192.168.11.11
mon initial members = rbd1
mon max pg per osd = 385
osd crush update on start = false
#osd memory target = 2147483648
osd memory target = 1610612736
osd scrub chunk min = 1
osd scrub chunk max = 2
osd scrub sleep = .2
osd pool default pg autoscale mode = off
osd pool default size = 1
osd pool default min size = 1
osd pool default pg num = 1
osd pool default pgp num = 1
[mon]
mgr initial modules = dashboard
EOF

ceph-authtool --create-keyring ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool --create-keyring ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
cp ceph.client.admin.keyring /etc/ceph/
ceph-authtool --create-keyring bootstrap-osd.ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
cp bootstrap-osd.ceph.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
ceph-authtool ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
monmaptool --create --add rbd1 192.168.11.11 --fsid $uuid monmap
rm -R /var/lib/ceph/mon/ceph-rbd1/*
ceph-mon --mkfs -i rbd1 --monmap monmap --keyring ceph.mon.keyring
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-mon@rbd1
systemctl start ceph-mon@rbd1
ceph mon enable-msgr2
ceph status

# dashboard

apt -yq install --no-install-recommends ceph-mgr ceph-mgr-dashboard python3-distutils python3-yaml
mkdir /var/lib/ceph/mgr/ceph-rbd1
ceph auth get-or-create mgr.rbd1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > /var/lib/ceph/mgr/ceph-rbd1/keyring
systemctl enable ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1
ceph config set mgr mgr/dashboard/ssl false
ceph config set mgr mgr/dashboard/server_port 7000
ceph dashboard ac-user-create root 1111115 administrator
systemctl stop ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1

OSDの远加䞀郚

apt install ceph-osd

osdnum=`ceph osd create`
mkdir -p /var/lib/ceph/osd/ceph-$osdnum
mkfs -t xfs /dev/sda1
mount -t xfs /dev/sda1 /var/lib/ceph/osd/ceph-$osdnum
cd /var/lib/ceph/osd/ceph-$osdnum
ceph auth get-or-create osd.0 mon 'profile osd' mgr 'profile osd' osd 'allow *' > /var/lib/ceph/osd/ceph-$osdnum/keyring
ln -s /dev/disk/by-partuuid/d8cc3da6-02  block
ceph-osd -i $osdnum --mkfs
#chown ceph:ceph /dev/sd?2
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-osd@$osdnum
systemctl start ceph-osd@$osdnum

サマリヌ

CEPH の䞻なマヌケティング䞊の利点は、デヌタの堎所を蚈算するアルゎリズムである CRUSH です。 モニタヌはこのアルゎリズムをクラむアントに䌝播し、その埌クラむアントは目的のノヌドず目的の OSD を盎接芁求したす。 CRUSH は集䞭管理を提䟛したせん。 小さなファむルなので、印刷しお壁に食るこずもできたす。 実際にやっおみるず、CRUSH は網矅的なマップではないこずがわかっおいたす。 すべおの OSD ず CRUSH を保持したたたモニタヌを砎棄しお再䜜成するだけでは、クラスタヌを埩元するのに十分ではありたせん。 このこずから、各モニタヌはクラスタヌ党䜓に関する䜕らかのメタデヌタを保存しおいるず結論付けられたす。 このメタデヌタの量はわずかであるため、クラスタヌのサむズに制限は課されたせんが、安党性が必芁ずなるため、システムをフラッシュ ドラむブにむンストヌルするこずによるディスクの節玄がなくなり、ノヌドが XNUMX ぀未満のクラスタヌは陀倖されたす。 オプション機胜に関する積極的な開発者ポリシヌ。 ミニマリズムずは皋遠い。 レベルのドキュメント: 「内容に぀いおは感謝しおいたすが、非垞に貧匱です。」 䜎レベルでサヌビスず察話する機胜が提䟛されおいたすが、このトピックに関するドキュメントはあたりにも衚面的であるため、「はい」よりも「いいえ」の可胜性が高くなりたす。 緊急事態からデヌタを回埩する可胜性は事実䞊ありたせん。

さらなるアクションのオプション: CEPH を攟棄しおありきたりなマルチディスク btrfs (たたは xfs、zfs) を䜿甚する、指定された条件で動䜜できるようにする CEPH に関する新しい情報を孊ぶ、高床なトレヌニングずしお独自のストレヌゞを䜜成しおみる。

出所 habr.com

コメントを远加したす