Ceph

Allikas: Kuutõrvaja
Redaktsioon seisuga 16. oktoober 2014, kell 13:58 kasutajalt Jj (arutelu | kaastöö) (Cephfs)

Sissejuhatus

Ceph on dünaamiliselt exabaidini laiendatav objekti, bloki, and failihoidla, mis arendatud pidades silmas tõrkekindlust. Cephi toetus on uuemates kernelites olemas.

Device Drivers
  Block devices
    Rados block device (RBD)
File systems
  Btrfs filesystem support
    Btrfs POSIX Access Control Lists
  FUSE (Filesystem in Userspace) support
Network File Systems
  Ceph distributed file system

Cephi struktuur

Et kõik ausalt ära rääkida siis Ceph koosneb kolmest põhikompnentist, millede kogumit nimetatakse RADOSiks. Seal on Object Storage Daemon (OSD), Monitor (MON) ja Meta-Data Server (MDS).

Ceph Architecture1.gif

OSD on deemon mis tegeleb andmete hoidmise ja paigaldamisega. See deemon peab töötama igas clustri nodes, kus on salvestusseadmed (sas, sata vms kettad). Kui süsteemis pole raidi tuleb nodes käivitada iga ketta kohta oma OSD deemon (nt 4 ketast tähendab 4 deemonit). Kui kasutuses raid siis piisab ühest. Vaikimisi on ühe OSD kohta kolm nn pooli (data, metadata ja rbd).

Teine oluline komponent on monitor. Tegemist on kergekaalulise deemoniga, mis tegeleb klientide ja muude väliste tarkvaratükkidega läbiviidava suhtlusega. Samuti tegeleb ta info terviklikkuse kontrollimise jms töödega (Quorum decisions). Näiteks, kui mountida ceph failisüsteem kliendi poolelt siis tuleb see ühendada MON serveri aadressiga. Ideaalne on cephi soovituse järgi omada clustris kolme monitori.

Meta-data server on koht kuhu salvestatakse metadata. Seda deemonit on tegelikult vaja vaid Ceph failisüsteemi kasutades, RBD'd (cephi blockdevicet kasutades seda vaja ei ole). Hetkel pole clustrisse üle ühe MDS teenuse võimalik paigaldada, arendus käib. Metadata serverites on mõnedes seadistustes kasutatud SSD kettaid.

Ceph on võimeline jagama ja talletama infot kolmel viisil.

  1. Ceph RGW, mis on Amazon S3 ja openstackiga ühilduv API. Sellele ligipääsuks on vaja paigaldada Radosgw nimeline tarkvara (tegemist fastcgi mooduliga ja tuleb paigaldada fastcgi võimelisele veebiserverile).
  2. Ceph RBD, mis jagab blokkseadmeid (nt virtuaalmasinatele) ja pakub snapshottimist, provisioneerimist ja pakkimist. RBD tugi on olemas Proxmox VE süsteemis ja olemas on ka QEMU-RBD http://ceph.com/docs/master/rbd/qemu-rbd/.
  3. CephFS, mis hajus posix ühilduv failisüsteem, seda saab mountida nii kerneli draiveri kui fuse abil ning ta vajab serverites täiendavat MDS (metadata) teenust http://ceph.com/docs/master/cephfs/kernel/

Nagu juba varem öeldud siis on vaja näiteks lihtsa ainult blockseadmeid säilitava ja jagava clustri ehitamiseks OSD ja MON deemoneid sisaldavaid servereid.

Ceph-skeem.png

Clustri koostamine

Cephi clustri koostamiseks on olemas päris arvutult erinevaid võimalusi. Kuna tegemist on väga modulaarse ja võimalusterohke tarkvaraga sõlbu kõik sellest, et mis on vajadus, milleks tahetakse seda hiljem kasutama hakata, mis on infrastruktur, palju on raha ja nodesid jne jne. Näiteks tuleks blokseadmeid jagav cephi SAN mitmeti erinev veebiprojektile vajaminevast objektilaost Mõned üldised soovitused siiski netis on õnneks olemas.

Clustriks vajalike arvutite hulgast rääkides ei ole soovitatav kasutada alla kolme serveri, paljud allikad nimetavad production clustri minimaalseks suuruseks viis serverit ning soovitavad nt kolme serveri lahendust kasutada ainult testimiseks.

Esimene küsimus - mitu OSD ja MON serverit/teenust? Kiire gogeldamisega jõuab selleni, et nt 10 monitori igas clustri "õlas" on paha. Soovitatakse kasutada keskmistel või suurtel clustritel kolme. Liiga palju monitore pidid tekitama overheadi endavahelise sünkimisega. Raidi kasutada ei soovitata, soovitatakse kettad panna JBOD formaati raidikaardi korral ja iga ketta kohta üks OSD deemon (seejuures ühe masina kohta üle kaheksa OSD ehk siis ketta ei soovitata). Sageli olid clustrinoded koostatud nii, et 2 väikest ketast opsüsteemiga, 2 SSD ketast journaliga (selleni kohe jõuan) ja kaheksa suurt ketast info jaoks.

Järgneval pildil on blokk-seadmeid jagava clustri skeem, kus kakskümmend kuus OSD masinat, mis kasutavaid kettaid ilma raidita ning omavad iga ketta kohta ühe OSD deemoni ja kolm monitor nodet.

Ceph-topo.jpg

Iga salvestamiseks oleva terabaidi kohta soovitatakse OSDl omada üks gigabait mälu (läheb peamiselt vaja taastamisel jms operatsioonidel). Metadata serveritel 1G iga deemoni instance kohta. Väidetakse, et enamus OSD aeglusi tuleb sellest, et faile hoitakse ühel ja samal kettal.

Teine küsimus - kuidas jagada data ja journal info. Ceph lammutab nimelt kõik info enne ketastele kirjutamist kahte lehte. Esimene siis journal ja teine metadata. Vaikimisi pannakse journal info igale kettale data kõrval asuvasse eraldi olevasse kausta ja Ceph peab suutma kirjutada journali info enne seda, kui saab alustada andmete kirjutamist, mis tekitab traditsioonilistes failisüsteemides nagu EXT4 ja XFS seisaku. Btrfs failisüsteem suudab kirjutada journalit ja infot paraleelselt, mistõttu sobib paremini.

Siinpuhul leidsin tõesti väga palju näiteid, kus kasutatakse süsteemi, et iga kuue "pöörleva" traditsioonilise kõvaketta kohta pannakse serverisse üks SSD ketas metadata jaoks. Pakuti välja selline valem

Journal number = (SSD seq write speed) / (spinning disk seq write speed)

Ehk siis SSD teeb keskmiselt ~500MB/s seq write ja tavaline ketas 110 siis tuligi suhtarv midagi 4.5 mida siis nad ümardasid veel.

Oletame, et meil on kõvaketas, mis kirjutab 100MB/s nimg me paigutame nii journali kui andmed samale kettale. Koos vaikimis writeahead seadistusega lüüakse kirjutamiskiirus viie sekundi järel kaheks.

Device:             wMB/s
sdb1 - journal      50.11
sdb2 - osd_data     40.25

Btrfs kasutamine hoiab ära selle, et info kirjutamine hakkaks ootama journali kirjutamise taga (journal kirjutatakse alati esimesena), kuid kirjutamisel jagavad nad sellest hoolimata olemasolevat ketta ribalaiust.

Ceph OSDs calculate data placement with CRUSH, selleks vajab OSD vähemalt 4 tuuma.

Vähemalt test lingil http://ceph.com/community/ceph-performance-part-1-disk-controller-write-throughput/ näitab, et mõistlik oleks kasutada raidikaardil JBOD (just bunch of drives) võimekust, ehk jagada läbi raidikaardi kõik kettad ükshaaval opsüsteemile ilma raidita välja ning tekitada igale sellisele kettale oma OSD deemon. Samuti tuleks parima jõudluse saavutamiseks kasutada btrfs failisüsteemi.

Cephile ehitatud objektihoidla skeem.

Ceph Architecture2.gif

Võrgu koostamine

Soovituslik oleks eraldada OSD deemonite omavaheline sünkronisatsioon ja infovahetus eraldi võrku/vlani.

Ditaa-2452ee22ef7d825a489a08e0b935453f2b06b0e6.png

Cephi paigaldus Debianile ceph-deploy utiliidiga

Esiteks tuleb paigadada uuem kernel, vanemaga kipub btrfs kernel paanikat kisama, kernel tuleb paigalda kõigile masinatele ühesugune muidu võib erroreid tekkida. Juhul kui btrfsi kasutada ei plaani võib need punktid vahele jätta.

faili /etc/apt/sources.list

deb http://ftp.au.debian.org/debian testing main

ja värske kernel

# apt-get install btrfs-tools linux-image-3.16-2-amd64

admin masinas milleks meil on ceph1 anname järgnevad käsud

Genereerime ssh võtme

ssh-keygen

ja kopeerime võtme kõigile nodedele

ssh-copy-id root@ceph2
ssh-copy-id root@ceph3
ssh-copy-id root@ceph4
ssh-copy-id root@ceph5
ssh-copy-id root@ceph6
ssh-copy-id root@ceph7
ssh-copy-id root@ceph8
ssh-copy-id root@ceph9

Seejärel tekitame järgneva /etchosts faili

10.40.6.117 ceph1
10.40.6.118 ceph2
10.40.6.119 ceph3
10.40.6.120 ceph4
10.40.6.121 ceph5
10.40.6.122 ceph6
10.40.6.123 ceph7
10.40.6.124 ceph8
10.40.6.125 ceph9

hosts fail ja enviroment paika kõigile

for masin in `cat nodes.txt`; do echo -n "$masin: " && scp -r /etc/environment root@$masin:/etc/environment; done
for masin in `cat nodes.txt`; do echo -n "$masin: " && scp -r /etc/hosts root@$masin:/etc/hosts; done

cephi tarkvara tuleb järgneva käsuga paigaldada kõigile nodedele

ceph-deploy install ceph1 ceph2 ceph3 ceph4 ceph5 ceph6 ceph7 ceph8 ceph9

Seejärel tuleb luua monitor(id) neid tekitame kolm tk

ceph-deploy new ceph3 ceph4 ceph2
ceph-deploy mon create-initial ceph2 ceph3 ceph4

Edasi data nodede paigaldus. Neid on meil kokku viis. ceph6 ceph5 ceph7 ceph8 ceph9 on masinad mil on süsteemis neli ketast

sda - süsteem
sdb
sdc
sdd

vaikimisi tekib xfs seega tuleks näitada btrfs ette võtmega ceph.conf lõppu lisada mõned read, selleks kui meil pole tegu puhaste ketastega vaid neil oli juba varem nt btrfs olemas --overwrite-conf parameeter on ka selle tarbeks

osd mkfs type = btrfs
osd mkfs options btrfs = "-f" 

Ja siis hakkame kettaid ja osd'sid valmistama ehk paigaldame kõigile serveritele OSD (iga ketas nõuab eraldi OSD deemonit)

ceph-deploy disk zap ceph7:sdb
ceph-deploy disk zap ceph7:sdc
ceph-deploy disk zap ceph7:sdd

ceph-deploy --overwrite-conf osd prepare --fs-type btrfs ceph7:sdb
ceph-deploy --overwrite-conf osd prepare --fs-type btrfs ceph7:sdc
ceph-deploy --overwrite-conf osd prepare --fs-type btrfs ceph7:sdd

ceph-deploy disk zap ceph6:sdb
ceph-deploy disk zap ceph6:sdc
ceph-deploy disk zap ceph6:sdd

ceph-deploy --overwrite-conf osd prepare --fs-type btrfs ceph6:sdb
ceph-deploy --overwrite-conf osd prepare --fs-type btrfs ceph6:sdc
ceph-deploy --overwrite-conf osd prepare --fs-type btrfs ceph6:sdd

# selleks, et ka peale booti võetaks osd külge 
ceph-deploy osd activate ceph7:/dev/sdb
ceph-deploy osd activate ceph7:/dev/sdc
ceph-deploy osd activate ceph7:/dev/sdd

Ja nii kõigile nodedele

nullist alustamiseks, juhul kui kõik läks nässu.

ceph-deploy purge ceph1 ceph2 ceph3 ceph4 ceph5 ceph6 ceph7 ceph8 ceph9
ceph-deploy purgedata ceph1 ceph2 ceph3 ceph4 ceph5 ceph6 ceph7 ceph8 ceph9
ceph-deploy forgetkeys

Statistika

# ceph status
    cluster 0a588263-cc78-407c-9282-7539cc947a86
     health HEALTH_WARN too few pgs per osd (12 < min 20); clock skew detected on mon.ceph3, mon.ceph4
     monmap e1: 3 mons at {ceph2=10.40.6.118:6789/0,ceph3=10.40.6.119:6789/0,ceph4=10.40.6.120:6789/0}, election epoch 6, quorum 0,1,2 ceph2,ceph3,ceph4
     osdmap e82: 15 osds: 15 up, 15 in
      pgmap v139: 192 pgs, 3 pools, 0 bytes data, 0 objects
            62608 kB used, 21319 GB / 21349 GB avail
                 192 active+clean

Veel saab vaadata osd deemonite statistikat

# ceph osd tree

weight peaks näitama seejuures suurust (weight 1 on tera, weight 1.8 kaks jne). Selle muutmiseks

$ ceph osd tree | grep osd.13
13  3                   osd.13  up  1   

Teeme muutmise 3 pealt 2 peale

$ ceph osd crush reweight osd.13 2

Kontrollime muudatust

$ ceph osd tree | grep osd.13
13  2                osd.13  up  1

OSD kustutamine

# ceph osd out osd.5
# ceph osd crush remove osd.5
# ceph auth del osd.5

Logida nodesse ja panna osd seisma.

# ceph osd rm 5

7200 RPM kiirusega ketaste ning gigase võrgu puhul tundub mõistlik kasutada 10Gb suurust journalit.

osd journal size = 10000

Võimalus seadistada journal ja data erinevatesse kohtadesse

[osd]
   osd data = /srv/ceph/osd$id
   osd journal = /srv2/ceph/osd$id/journal
   osd journal size = 10000

Kui on soov kasutada btrfsi siis tasub silmas pidada, et 2014 oktoobri seisuga stabiilne debiani kernel seda hästi ei toeta ja vajalik on paigaldada unstable kernel. Lisaks võib kontrollida kas journal_parallel on sisse lülitatud

# ceph --admin-daemon /var/run/ceph/ceph-osd.4.asok config show | grep paral
  "filestore_journal_parallel": "false",

selle toimima panekuks konfi

filestore journal parallel = true

Kasutamine

Poolid

Peale cephi paigaldamist on olemas juba kolm vaikimisi pooli, näiteks rbd nimeline. Neid saab ise juurde tekitada ning igale poolile saab seadistada

  1. Mitu OSDd võib rikneda, ehk mitu replikat failist hoitakse.
  2. Placement groups mis määrib ära koormuse ja info jaotuse. Tavaliselt 100tk OSD kohta,
  3. CRUSH reeglid.
  4. Snapshotid
  5. Kasutajaõigused

NB! Tasub jälgida, et kasutusel oleks realistlik number placement gruppe. Pg numbrite kohta on selline reegel:

  1. Vähem kui 5 OSDs süsteemis - pg_num 128
  2. 5 kuni 10 OSDd pg_num 512
  3. 10 kuni 50 OSD'd pg_num 2096
  4. Rohkem kui 50 OSD korral tasub pg_num arvutada ise. Soovitatav valem on võtta iga OSD kohta sada PG'd ning jagada

saadud arv replica numbriga (osd pool default size). Ehk siis 10 OSD deemoni ja pool default size= 3 korral tuleks see arv umbkaudu 333. (100*10)/3=333

Nende seadistamiseks nt poolil rbd tuleb anda käsk

# ceph osd pool set rbd pg_num 512
# ceph osd pool set rbd pgp_num 512

Tekitame uue pooli

rados mkpool kettaimidzad

Seadistame testimiseks pooli replikatsiooniks 1 (Set number of replicas across all nodes)

ceph osd pool set kettaimidzad size 1

Vaatame statistikat ja poolide liiklust

# ceph osd pool stats
pool data id 0
  nothing is going on

pool metadata id 1
  nothing is going on

pool rbd id 2
  -89/0 objects degraded (-inf%)
  recovery io 167 MB/s, 41 objects/s

Rbd

Pooli sisse luuakse omakorda nt rbd kettad. Tekitame sinna näiteks ühe 10 giga suuruse tüki

# rbd create myimage2 --size 10240 --pool kettaimidzad

Ilma --pool võtmeta tekitatakse myimage2 vaikimisi loodud rbd pooli. Selleks, et ketas võetaks opsüsteemile külge

# rbd  map myimage2 --id admin

Failisüsteemi loomine ja külgehaakimine

# mkfs.ext4 /dev/rbd0 
# mount /dev/rbd/rbd0 /mnt

tekitatud rbd ketaste vaatamiseks

#  rbd ls
myimage2
myimage3

Eemaldamiseks

# rbd rm myimage2

Info küsimiseks poolide kohta

Cephfs

Cephfs vajab esiteks metadata serverit MDS, selle paigaldamiseks tuleb anda käsk

ceph-deploy mds create {host-name}[:{daemon-name}

Hetkel manuaalide järgi ei ole produktsioonis soovitatav kasutada rohkem kui ühte mds serverit.

Cepfsi saab mountida nii kerneli driveri abil kui üle fuse. Esimesena tuleb paigaldada paketid

# apt-get install ceph-fs-common ceph-fuse

Seejärel tekitame vajaliku pooli

$ ceph osd create webdata 500
successfully created pool webdata

Hangime pooli ID

$ ceph osd dump | grep webdata
pool 5 'webdata' rep size 2 crush_ruleset 0 object_hash rjenkins pg_num 500 pgp_num 500 last_change 12 owner 0

Seome ID mille saime mds serveriga

$ ceph mds add_data_pool 5
added data pool 5 to mdsmap

Ja seejärel haagime

mount -t ceph {ip-address-of-monitor}:6789:/ /mnt/mycephfs

Monitori aadresse võib olla mitu nind need tuleb eraldada komaga, kui port pole määratud kasutatakse 6789 vaikimisi. Või siis fuse abil mountimine:

ceph-fuse -m {ip-address-of-monitor}:6789 ~/mycephfs

Fstabi kaudu mountimiseks /etc/fstab faili kirje

192.168.200.101:6789:/ /srv ceph name=cephfs,secretfile=/etc/ceph/client.cephfs,noatime 0 2

Kiirustestid

Integreeritud cephi testimise vahend RADOS bench

Benchmark for seconds. The mode can be write, seq, or rand. seq and rand are read benchmarks, either sequential or random. Before running one of the reading benchmarks, run a write benchmark with the –no-cleanup option. The default object size is 4 MB, and the default number of simulated threads (parallel writes) is 16.

Runs a simple throughput benchmark against OSD.N, writing TOTAL_BYTES in write requests of BYTES_PER_WRITE each. By default, the test writes 1 GB in total in 4-MB increments.

ceph tell osd.10 bench

keep in mind the osd bench is entirely a local test — if it says 100MB/s, that means your OSD disk can do 100MB/s, and increasing the network connectivity isn't going to change that.

Praktikas suudab tavaline gigabit võrk kirjutada kiirusel 100 MB/sekundis

Jamadega jamamine ja tuunimine

Palju aitab tavaliselt käsk

# ceph --keyring=ceph.client.admin.keyring health detail

Teate clock skew detected on mon.ceph3, mon.ceph4 vastu aitab

mon_clock_drift_allowed = 1

Peale paigaldamist teade HEALTH_WARN too few pgs per osd (12 < min 20)

# ceph osd pool get rbd pg_num
pg_num: 64

Tundub, et see number on liiga väike, suurendame

# ceph osd pool set rbd pg_num 512
# ceph osd pool set rbd pgp_num 512

Pudelikaelade paika ajamine. Võib juhtuda, et cephi enda perf testi tehes kukub cur MB/s nulli ja tuleb teade

health HEALTH_WARN 41 requests are blocked > 32 sec

Abiks aegluse tekitajate otsimisel ilmselt käsk

# cat /var/log/ceph/ceph.log  | grep 'slow request'| awk '{print $3}' | sort | uniq -c | sort -n
      2 osd.10
      2 osd.12
      2 osd.14
      4 osd.7
      4 osd.9
      6 osd.1
     10 osd.8
    170 osd.4

http://noahdesu.github.io/2014/01/31/ceph-perf-wtf.html

Cephi haldamiseks võib kirjutada igasuguseid vahvaid skripte näiteks kellaaja paika seadistamiseks

for masin in `cat datanodes.txt | awk '{ print $2 }'`; do 
 echo $masin
ssh -q "$masin" bash <<-'EOF'
 apt-get -y install ntp ntpdate
 /etc/init.d/ntp stop
 ntpdate  10.40.0.140
 /etc/init.d/ntp start
 date
EOF
done

Ühe jama anatoomia

Näidisjuhtum probleemist ja selle lahenduskäigust.

Kirjutamisel kukkus average MB/s pidevalt nulli ja logis olid teated health HEALTH_WARN 41 requests are blocked > 32 sec

Süüdlane tundus olevat üks osd milles 2.5 terabaidine ketas. Sai see osd eemaldatud ning vead kadusid aga keskmine MB/s kukkus ikkagi nulli. Täpsem monitoorimine tõi ühel nodel, kus töötasid kaks OSDd ketastega sdb ja sdd välja järgmise pildi.

Diskstats latency-day-ceph6.png

Ehk siis ka teine 2.5 terane ketas (sdd) oli kohutavalt aeglase latentsusega. Peale ka selle ketta eemaldamist kadusid keskmise kirjutamise anomaaliad.

PS: Kettad olid WD green seeria omad tõestades, et green kettad võivad olla küllap head kodukasutajatele aga mitte suurtes süsteemides.

Lingid

Testclustri ehitamine http://ceph.com/docs/master/start/quick-ceph-deploy/

OSD koormuste balanseerimine http://cephnotes.ksperis.com/blog/2013/12/09/ceph-osd-reweight

Veel ühe clustri ehitamine http://www.server-world.info/en/note?os=CentOS_6&p=ceph

Jõudlustestid https://software.intel.com/en-us/blogs/2013/10/25/measure-ceph-rbd-performance-in-a-quantitative-way-part-i

Ilusad skeemid aga võõras keeles http://wiki.zionetrix.net/informatique:systeme:ha:ceph

Veel üks võimalik kombinatsioon http://www.openclouddesign.org/articles/vdi-storage/ceph-highly-scalable-open-source-distributed-file-system

Mõned testid http://www.sebastien-han.fr/blog/2012/08/26/ceph-benchmarks/

Performanci nõuanded http://www.slideshare.net/Inktank_Ceph/ceph-performance

Veel üks asjalik ehitusõpetus http://www.sebastien-han.fr/blog/2012/06/10/introducing-ceph-to-openstack/

Testid raidikaartidega http://ceph.com/community/ceph-performance-part-1-disk-controller-write-throughput/

http://www.anchor.com.au/blog/2012/09/a-crash-course-in-ceph/

http://www.jamescoyle.net/how-to/1244-create-a-3-node-ceph-storage-cluster

http://ceph.com/user-story/ceph-from-poc-to-production/ soovitused ja rahul kasutaja

http://www.severalnines.com/blog/how-cluster-liferay-mysql-galera-and-ceph-high-availability-and-performance?page=5 kasulik juhend, tasub uurida.

http://dachary.org/?p=1971 kah hea