NÀr datan överstiger vad som fÄr plats pÄ en enskild disk, Àr det dags att börja tÀnka pÄ RAID. Som barn hörde jag ofta Àldre sÀga: "En dag kommer RAID att försvinna, objektlagring kommer att fylla vÀrlden, och du vet knappt vad CEPH Àr" - sÄ det första jag gjorde nÀr jag blev sjÀlvstÀndig var att skapa min egen kluster. MÄlet med experimentet var att bekanta sig med den interna strukturen i Ceph och förstÄ ramen för dess anvÀndning. Hur berÀttigat Àr det att införa Ceph i medelstora företag, och i smÄ? Efter flera Ärs anvÀndning och nÄgra oÄterkalleliga dataförluster har insikter om nyanserna vuxit fram, vilket gör att lÀget inte Àr sÄ entydigt. Egenskaperna hos CEPH skapar hinder för dess breda spridning, och pÄ grund av dem har experimenten kört fast. Nedan följer en beskrivning av alla genomförda steg, det erhÄllna resultatet och de dragna slutsatserna. Om kunniga personer delar med sig av sina erfarenheter och förklarar vissa punkter - skulle jag vara tacksam.
AnmÀrkning: Kommentatorerna har pÄpekat allvarliga fel i vissa antaganden som krÀver en översyn av hela artikeln.
CEPH-strategi
CEPH-klustret sammanför ett godtyckligt antal K-diskar av godtycklig storlek och lagrar data pÄ dem genom att duplicera varje bit (4 MB som standard) ett angivet antal N gÄnger.
LĂ„t oss övervĂ€ga det enklaste fallet med tvĂ„ identiska diskar. Av dessa kan man antingen bygga en RAID 1 eller en kluster med N=2 â resultatet blir detsamma. Om det finns tre diskar av olika storlek, Ă€r det lĂ€tt att skapa en kluster med N=2: en del av data kommer att finnas pĂ„ diskar 1 och 2, en del â pĂ„ 1 och 3, och en del â pĂ„ 2 och 3, vilket inte Ă€r möjligt med RAID (man kan konstruera en sĂ„dan RAID, men det skulle vara en avvikelse). Om det finns Ă€nnu fler diskar, Ă€r det möjligt att skapa RAID 5, och CEPH har en motsvarighet â erasure_code, vilket strider mot utvecklarnas tidigare koncept, och dĂ€rför inte beaktas. RAID 5 förutsĂ€tter att det finns ett litet antal diskar, och att alla Ă€r i gott skick. Vid ett misslyckande av en, mĂ„ste de andra hĂ„lla ut tills diskbytet och Ă„terstĂ€llningen av data Ă€r slutfört. Ă andra sidan, med CEPH, nĂ€r N>=3, uppmuntras anvĂ€ndningen av gamla diskar, sĂ€rskilt om man har flera fungerande diskar för att lagra en kopia av datan, medan de Ă„terstĂ„ende tvĂ„-tre kopiorna lagras pĂ„ ett stort antal gamla diskar. DĂ„ kommer informationen att vara sĂ€ker, eftersom sĂ„ lĂ€nge de nya diskarna fungerar finns det inga problem, och om en av dem gĂ„r sönder, Ă€r det extremt osannolikt att tre diskar med en livslĂ€ngd pĂ„ över fem Ă„r â helst frĂ„n olika servrar â skulle gĂ„ sönder samtidigt.
I distributionen av kopior finns det en subtilitet. Som standard antas det att data delas upp pÄ fler grupper (~100 per disk) av PG-distribution, dÀr varje grupp dupliceras pÄ vissa diskar. Anta att K=6, N=2, sÄ om tvÄ valfria diskar gÄr sönder, förloras data garanterat, eftersom sannolikhetsteorin visar att det kommer att finnas Ätminstone en PG som ligger pÄ just dessa tvÄ diskar. Och förlusten av en grupp gör all data i poolen otillgÀnglig. Om diskarna istÀllet delas upp i tre par och lagring av data endast tillÄts pÄ diskar inom samma par, sÄ Àr denna distribution fortfarande motstÄndskraftig mot ett diskfel, men vid tvÄ fel Àr sannolikheten för dataförlust inte 100%, utan endast 3/15, och Àven vid tre diskar som gÄr sönder Àr den bara 12/20. DÀrför bidrar entropin i datadistributionen inte till felresilience. Vi noterar ocksÄ att för en filserver ökar den lediga RAM-minnet avsevÀrt svarstiden. Ju mer minne varje nod har, och ju mer minne hela klustret har, desto snabbare blir det. Detta Àr utan tvekan en fördel för klustret jÀmfört med en ensam server och, Ànnu mer, en hÄrdvaru-NAS, som har en mycket liten mÀngd minne.
Detta innebÀr att CEPH Àr ett bra sÀtt att med minimiinvesteringar av förÄldrad utrustning skapa ett pÄlitligt datalagringssystem pÄ tiotals TB med skalbarhet (hÀr krÀvs givetvis kostnader, men de Àr smÄ jÀmfört med kommersiella lagringslösningar).
Implementering av klustret
För experimentet tar vi en utrangerad dator Intel DQ57TM + Intel Core i3 540 + 16 GB RAM. Vi organiserar fyra diskar pÄ 2 TB i likhet med RAID10, efter lyckad testning lÀgger vi till en andra nod och lika mÄnga diskar till.
Installerar Linux. Distributionen mĂ„ste vara anpassningsbar och stabil. Debian och Suse uppfyller kraven. Suse har en mer flexibel installationsprocess som tillĂ„ter att avaktivera vilket paket som helst; tyvĂ€rr kunde jag inte lista ut vilka som kan tas bort utan att skada systemet. Vi installerar Debian via debootstrap buster. Alternativet min-base installerar ett icke-fungerande system som saknar drivrutiner. Skillnaden i storlek jĂ€mfört med fullversionen Ă€r inte sĂ„ stor att det Ă€r vĂ€rt besvĂ€ret. Eftersom arbetet utförs pĂ„ en fysisk maskin, vill man kunna göra snapshots, som pĂ„ virtuella maskiner. Denna möjlighet erbjuds av antingen LVM eller btrfs (eller xfs, eller zfs â skillnaden Ă€r inte stor). LVM:s snaps Ă€r inte dess starka sida. Vi vĂ€ljer btrfs. Och bootloadern â i MBR. Det finns ingen mening med att fylla disken med 50 MB partition med FAT nĂ€r man kan trycka in det i 1 MB-omrĂ„det av partititionstabellen och all plats dedikera till systemet. Det tog 700 MB pĂ„ disken. Hur mycket standardinstallationen av SUSE tar â minns jag inte, verkar vara runt 1.1 eller 1.4 GB.
Installerar CEPH. Vi ignorerar version 12 i debian-förvaret och ansluter direkt frÄn webbplatsen version 15.2.3. Följ instruktionerna i avsnittet "installerar CEPH manuellt" med följande förbehÄll:
- Innan du ansluter förvaret, mÄste du installera gnupg wget ca-certificates
- Efter att ha anslutit förvaret, men före installationen av klustret, utelĂ€mnas paketinstallationen: apt -y âno-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
- Vid installationstillfÀllet av CEPH kommer lvm2 att försöka installeras av oklara skÀl. I princip Àr det inget problem, men installationen misslyckas, vilket ocksÄ hindrar installationen av CEPH.
Den hÀr patchen hjÀlpte:
cat <> /var/lib/dpkg/status Package: lvm2 Status: install ok installed Priority: important Section: admin Installed-Size: 0 Maintainer: Debian Adduser Developers Architecture: all Multi-Arch: foreign Version: 113.118 Description: No-install EOF
Ăversikt över klustret
ceph-osd â ansvarar för datalagring pĂ„ disken. För varje disk körs en nĂ€tverksservice som tar emot och utför begĂ€rningar om lĂ€sning eller skrivning av objekt. PĂ„ disken skapas tvĂ„ partitioner. En av dem innehĂ„ller information om klustret, disknumret och nycklarna till klustret. Denna information pĂ„ 1 KB skapas en gĂ„ng vid tillĂ€gg av disken och har aldrig förĂ€ndrats efter det. Den andra partitionen har ingen filsystem och lagrar binĂ€ra data för CEPH. Automatisk installation i tidigare versioner skapade en xfs-partition pĂ„ 100 MB för tjĂ€nsteinformation. Jag konverterade disken till MBR och avsatte bara 16 MB â tjĂ€nsten klagar inte. Jag tror att xfs skulle kunna ersĂ€ttas med ext utan problem. Denna partition monteras i /var/lib/âŠ, dĂ€r tjĂ€nsten lĂ€ser information om OSD och Ă€ven hittar en lĂ€nk till blockenhet dĂ€r binĂ€ra data lagras. Teoretiskt sett gĂ„r det att direkt placera hjĂ€lpfiler i /var/lib/âŠ, och helt avsĂ€tta disken för data. Vid skapandet av OSD med ceph-deploy skapas automatiskt en regel för montering av partitionen i /var/lib/âŠ, och rĂ€ttigheter tilldelas anvĂ€ndaren ceph för att lĂ€sa den nödvĂ€ndiga blockenheten. Vid manuell installation mĂ„ste detta göras sjĂ€lv, detta nĂ€mns inte i dokumentationen. Det Ă€r ocksĂ„ önskvĂ€rt att ange parametern osd memory target, sĂ„ att det finns tillrĂ€ckligt med fysisk minne.
ceph-mds. PĂ„ lĂ„g nivĂ„ Ă€r CEPH â en objektlagring. Möjligheten för blocklagring reduceras till att lagra varje block pĂ„ 4 MB som ett objekt. Det fungerar pĂ„ samma sĂ€tt som filsystemlagring. TvĂ„ pooler skapas: en för metadata, och en för data. Dessa förenas i ett filsystem. Vid detta tillfĂ€lle skapas en slags post, sĂ„ om man tar bort filsystemet men behĂ„ller bĂ„da poolerna, gĂ„r det inte att Ă„terstĂ€lla det. Det finns en procedur för att extrahera filer i block, har inte testat det. TjĂ€nsten ceph-mds ansvarar för Ă„tkomsten till filsystemet. För varje filsystem krĂ€vs en separat instans av tjĂ€nsten. Det finns en funktion "index" som gör det möjligt att skapa en liknande struktur av flera filsystem i ett â det har inte heller testats.
ceph-mon â den hĂ€r tjĂ€nsten lagrar klusterkartan. Den innehĂ„ller information om alla OSD, algoritmen för distribution av PG i OSD och, viktigast av allt, information om alla objekt (detaljerna i denna mekanism Ă€r oklara för mig: det finns en katalog /var/lib/ceph/mon/âŠ/store.db, dĂ€r en stor fil pĂ„ 26 MB finns, och i klustret finns det 105K objekt, vilket ger drygt 256 byte per objekt, - jag tror att monitorn lagrar en lista över alla objekt och PG dĂ€r de ligger). Skada pĂ„ denna katalog leder till förlust av all data i klustret. DĂ€rav slutsatsen att CRUSH visar hur PG Ă€r fördelade över OSD, och hur objekt Ă€r fördelade över PG â dessa lagras centraliserat i databasen, oavsett hur utvecklarna försöker undvika detta ord. Som en följd kan vi för det första inte installera systemet pĂ„ en flash-enhet i RO-lĂ€ge, eftersom databasen krĂ€ver stĂ€ndig skrivning, ytterligare en disk behövs för detta (sannolikt inte mer Ă€n 1 GB), för det andra Ă€r det nödvĂ€ndigt att ha en kopia av denna databas i realtid. Om det finns flera monitorer sker redundansen automatiskt, men i vĂ„rt fall finns det en monitor, högst tvĂ„. Det finns en teoretisk procedur för att Ă„terstĂ€lla monitorn baserat pĂ„ OSD-data, jag har anvĂ€nt den tre gĂ„nger av olika skĂ€l, och vid varje tillfĂ€lle har det inte kommit nĂ„gra felmeddelanden, liksom ingen data heller. TyvĂ€rr fungerar denna mekanism inte. Antingen mĂ„ste vi anvĂ€nda ett minimalt partition pĂ„ OSD och sĂ€tta ihop en RAID för att lagra databasen, vilket sĂ€kert kommer att pĂ„verka prestandan negativt, eller sĂ„ mĂ„ste vi avsĂ€tta Ă„tminstone tvĂ„ pĂ„litliga fysiska medier, helst USB, sĂ„ att vi inte tar upp portar.
rados-gw â exporterar objektlagring via S3-protokollet och liknande. Skapar mĂ„nga pooler, oklart varför. Jag har inte experimenterat mycket.
ceph-mgr â vid installationen av denna tjĂ€nst startas flera moduler. En av dem Ă€r den oavstĂ€ngda autoscale. Den försöker upprĂ€tthĂ„lla rĂ€tt antal PG/OSD. Om man vill styra förhĂ„llandet manuellt kan man förbjuda skalning för varje pool, men i sĂ„ fall kraschar modulen med division med 0, och klusterstatus blir ERROR. Modulen Ă€r skriven i Python, och om man kommenterar bort rĂ€tt rad leder det till att den stĂ€ngs av. Detaljerna har jag inte lust att minnas.
Lista över anvÀnda kÀllor:
Skriptlistor:
Installera systemet via debootstrap
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 @\/.\n\nchroot \/mnt\/@ \/bin\/bash
echo rbd1 > \/etc\/hostname
passwd
uuid=\`blkid | grep $blkdev | cut -d """ -f 2\`\ncat < \/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 <> \/var\/lib\/dpkg\/status
Package: lvm2
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install
\nPackage: sudo
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install
EOF
\nexit\ngrub-install --boot-directory=@\/boot\/ \/dev\/$blkdev
init 6\n\napt -yq install --no-install-recommends linux-image-amd64 bash-completion ed btrfs-progs grub-pc iproute2 ssh smartmontools ntfs-3g net-tools man
exit\ngrub-install --boot-directory=@\/boot\/ \/dev\/$blkdev
init 6Skapa en kluster
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 < /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@rbd1LĂ€gg till OSD (del)
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@$osdnumSammanfattning
Den största marknadsföringsfördelen med CEPH Ă€r CRUSH - algoritmen för datalagring. Ăvervakningarna distribuerar denna algoritm till kunderna, varefter kunderna direkt begĂ€r den nödvĂ€ndiga noden och den nödvĂ€ndiga OSD:n. CRUSH sĂ€kerstĂ€ller avsaknad av centralisering. Det Ă€r en liten fil som till och med kan skrivas ut och hĂ€ngas pĂ„ vĂ€ggen. Praktiken har visat att CRUSH inte Ă€r en uttömmande karta. Om man förstör och Ă„terskapar övervakningarna, med alla OSD:er och CRUSH kvar, Ă€r det inte tillrĂ€ckligt för att Ă„terstĂ€lla klustret. DĂ€rmed dras slutsatsen att vissa metadata om hela klustret lagras pĂ„ varje övervakning. Den obetydliga mĂ€ngden metadata lĂ€gger inga begrĂ€nsningar pĂ„ klustrets storlek, men krĂ€ver att deras bevarande sĂ€kerstĂ€lls, vilket utesluter att spara disk genom att installera systemet pĂ„ ett USB-minne och utesluter kluster med mindre Ă€n tre noder. Utvecklarens aggressiva politik angĂ„ende valfria funktioner. LĂ„ngt frĂ„n minimalism. Dokumentationen Ă€r pĂ„ nivĂ„: "för det som finns, tack, men vĂ€ldigt, vĂ€ldigt knapert". Möjligheten att interagera med tjĂ€nster pĂ„ lĂ„g nivĂ„ finns, men dokumentationen berör detta Ă€mne för ytligt, sĂ„ det Ă€r mer sannolikt att det Ă€r nej Ă€n ja. NĂ€stan inga chanser till datarĂ€ddning frĂ„n en nödsituation.
Alternativa handlingsplaner: överge CEPH och anvÀnda den banala flerdiskbtrfs (eller xfs, zfs), ta reda pÄ ny information om CEPH som gör det möjligt att anvÀnda det under angivna förhÄllanden, eller försöka skriva ett eget lagringssystem som en kompetenshöjning.
KĂ€lla: habr.com
