Dit is een oude revisie van het document!
Begin met een kaal ingerichte CentOS 7 server met bij voorkeur een extra, apart storage LAN.
De zogenaamde “bricks” (een aangewezen directory in een filesysteem waarvan vervolgens de ruimte van het onderliggende blockdevice van wordt gebruikt) waar een gluster volume uit bestaan moeten thin provisioned zijn vanwege een eigenaardigheid van glusterfs waar we mee te maken hebben.
We willen namelijk niet gewoon 3 kopieën draaien op alle servers, dit zou jammer zijn van de diskruimte (slechts 1/3 bruikbaar). We willen 2 kopieën op de drie servers hebben. Echter geldt bij glusterfs dat het aantal bricks een veelvoud moet zijn van het aantal kopieën.
Hier is wel een soort oplossing voornamelijk de arbitrator brick. Hierop wordt alleen file metadata opgeslagen (ongeveer 4kb per file) die bij een split brain situatie wordt gebruikt om te beslissen welke kopie de juiste is.
Een probleem is dat een glustervolume alleen maar zo groot wordt als de kleinste brick. En de arbitrator brick wordt in deze gewoon als brick gezien. dus weer zonde van de ruimte.
De oplossing is thin provisioning met overprovisioning, aangezien we zeker zijn dat de arbitrator brick nooit die volledige ruimte in beslag zal nemen.
Dit betekent ook dat we een schijf altijd in drieën moeten delen om de schijf symmetrisch over de servers te verdelen.
Hoeveel overprovisioning precies is dus wat vaag, maar uit mijn ervaring met een multipurpose nas kan ik ongeveer schatten dat je rekening moet houden met 1/2 gb meta data per tb storage.
dus bijvoorbeeld voor een 4Tb schijf moeten we rekening houden met 2Gb aan arbitrator ruimte, dus 4000Gb-2Gb=3998Gb ruimte over voor werkelijke data, delen door 2 geeft een partitie grootte van 1999Gb. Daar dus 3 van, thin provisioned, twee waarvan werkelijk gevuld kunnen worden met data tot 1999Gb en één waarvan we hopen dat de data nooit groter zal worden dan 2Gb.
Nu gaan we de thin provisioned logical volumes aanmaken. (In mijn voorbeeld heb ik een 4 Gb disk gebruikt ipv een 4 Tb disk)
Vind de disks die we voor het gluster file systeem gaan gebruiken(op alle servers)
lsblk
[root@server1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 9G 0 disk ├─vda1 252:1 0 1G 0 part /boot └─vda2 252:2 0 8G 0 part ├─centos-root 253:0 0 7,1G 0 lvm / └─centos-swap 253:1 0 924M 0 lvm [SWAP] vdb 252:16 0 3,7G 0 disk [root@server1 ~]#
we gaan de laatste (nog niet ingedeelde) gebruiken.
In dit geval dus /dev/vdb. Maak vervolgens een partitie aan door: parted -a optimal /dev/vdb
mklabel gpt mkpart primary 0% 100% quit
nu zie je bij lsblk de partitie ook staan:
vdb 252:16 0 3,7G 0 disk └─vdb1 252:17 0 3,7G 0 part
Vervolgens maken we op die partitie een volumegroup met logical volumes:
pvcreate /dev/vdb1
vgcreate glusterVG0 /dev/vdb1
De logical volumes moeten thin provisioned zijn om een quirk in de werking van glusterfs omdat we de werking van de arbitrator willen gebruiken die dit noodzakelijk maakt.
Dit betekent ook dat we een schijf altijd in drieën moeten delen om de schijf symetrisch over de servers te verdelen.
Hier wordt het wat ingewikkeld, de arbitrator slaat alleen metadata van de files op namelijk 4kb per file. in mijn situatie is komt dit neer op een 2tb volume met 250000 files dus 1gb aan arbitrator data.
Nu wordt een glusterfs volume zo groot als de kleinste brick, en een arbitrator geldt wel als een brick, dus vandaar de thin provisioning met over-provisioning.
Hoeveel overprovisioning precies is dus wat vaag, maar uit mijn ervaring met een multipurpose nas kan je dus stellen dat je rekening noet houden met 1/2 gb meta data per tb storage.
lvcreate -n glusterLV1 -l 100%FREE glusterVG
vervolgens een xfs filesysteem:
mkfs -t xfs /dev/mapper/glusterVG-glusterLV1
het filesysteem mounten.
maak een mountpoint: mkdir -p /GLUSTER_DATA/brick1
maak de mount vi /etc/fstab en voeg toe:
/dev/mapper/glusterVG-glusterLV1 /GLUSTER_DATA/brick1 xfs defaults 0 0
en mount : mount -a
en maak de volume directory aan waar glusterfs uiteindelijk mee gaat werken:
mkdir /GLUSTER_DATA/brick1/gv1
installeer de nodige repositories:
yum install epel-release
yum install centos-release-gluster
Aangezien de storage meestal onderin de stack zit en de DNS als een VM op die stack draait is het niet echt verstandig om voor de name resolving van het cluster afhankelijk te zijn van een DNS. Daarom verdient het aanbeveling de hostnames van de nodes in de hosts file op te nemen:
vi /etc/hosts
en voeg toe:
192.168.120.21 server1.voorbeeld.nl server1 192.168.120.22 server2.voorbeeld.nl server2 192.168.120.23 server3.voorbeeld.nl server3
install de gluster server software:
yum install glusterfs-server
start de glusterfs software nu en in de toekomst:
systemctl enable glusterd
systemctl start glusterd
Er zijn een aantal standaard poorten die GlusterFS gebruikt, maar met elke nieuwe brick kiest GlusterFS een nieuwe poort erbij. Het is, ook wat betreft netwerk load aan te bevelen een appart netwerk voor het storage verkeer te gebruiken.
door apparte NIC's te gebruiken voor storage verkeer is het voldoende om onderin de netwerk config file:
vi /etc/sysconfig/network-scripts/ifcfg-<juste_device>
de zone te veranderen:
ZONE=trusted
Door een probe wordt het cluster geinitieerd.
van server1: gluster peer probe server2
van server2: gluster peer probe server1
Na het eerste pair moet een nieuw lid van het cluster eerst vanaf een geverifieerd lid van het cluster ge-probed worden:
van server2: gluster peer probe server3
nu kan je controleren welke nodes in de gluster pool draaien:
gluster pool list (bijvoorbeeld op server3)
[root@server3 ~]# gluster pool list UUID Hostname State c4db0a33-a877-44fd-91a6-fa93dfe0514a server2.voorbeeld.nl Connected af00ee80-c7ec-4f91-bc31-b0bccc1e33df server1.voorbeeld.nl Connected 4a257d8a-633b-467c-b44e-ec82f73a4df9 localhost Connected
Nu kan je een GlusterFS volume aanmaken, we hadden al een directory aangemaakt op een gemount logical volume, een zogenaamde “brick” . In dit voorbeeld /GLUSTER_DATA/brick1/gv1/.
De naamgeving van een brick directory is freeform, en het gebruik van LVM is ook niet perse noodzakelijk. Voor zover ik kan nagaan zou je zelfs de brick kunnen definiëren als een rauw mountpoint, dus zonder de extra directory daarin.
gluster volume create gv1 replica 2 arbiter 1 server1:/GLUSTER_DATA/brick1/gv1/ server2:/GLUSTER_DATA/brick1/gv1/ server3:/GLUSTER_DATA/brick1/gv1/
In dit geval met 3 nodes zouden we eigenlijk maar 1 copie van alles willen hebben, maar dan bestaat het gevaar van een split brain situatie waarin er geen methode is om aan te tonen welke node over de juiste file waarden beschikt, om toch niet helemaal 3 copien tew hoeven gebruiiken hebben we hier opgegeven : arbiter 1wat resulteert in dat 1 node niet een hele copie van de data bewaard maar alleen de file metadate. zodoende heb je van 3x2Gb niet maar 2Gb over maar iets minder dan 4Gb.
volume create: gv1: success: please start the volume to access data
En start het volume:
gluster volume start gv1
gluster volume start gv1
controleren:
gluster volume info gv1
Volume Name: gv1 Type: Replicate Volume ID: 5958b2eb-9789-46c3-b882-0c421bf61b9f Status: Started Snapshot Count: 0 Number of Bricks: 1 x (2 + 1) = 3 Transport-type: tcp Bricks: Brick1: server1:/GLUSTER_DATA/brick1/gv1 Brick2: server2:/GLUSTER_DATA/brick1/gv1 Brick3: server3:/GLUSTER_DATA/brick1/gv1 (arbiter) Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off
Als eerste moet de fuse module in de kernel geladen worden:
modprobe fuse
controleren: dmesg | grep -i fuse
[ 5647.281780] fuse init (API version 7.22)
Vervolgens de client voor de betreffende client (voor zover er niet in de vervolg stack een native driver zit, zoals in openshift en oVirt)
eerst de repository koppelen:
yum install centos-release-gluster
dan de client software installeren:
yum install fuse fuse-libs openib libibverbs glusterfs glusterfs-fuse
apt-get install glusterfs-client
maak een mountpoint:
mkdir /glustervolume1
mount met de hand:
mount -t glusterfs server1:/gv1 /glustervolume1
controleren : df en daar staat dan tussen:
server1:/gv1 2082816 53940 2028876 3% /glustervolume1
en maak een permanente entry in de fstab: vi /etc/fstab
en voeg toe:
Soms maak je in het begin een fout en wil je even opnieuw beginnen.
verwijder het gluster volume:
gluster volume stop gv1
gluster volume delete gv1
geef de brick directory weer vrij:
setfattr -x trusted.glusterfs.volume-id /GLUSTER_DATA/brick1/gv1/
setfattr -x trusted.gfid /GLUSTER_DATA/brick1/gv1
rm -rf /GLUSTER_DATA/brick1/gv1/.glusterfs
https://wiki.centos.org/SpecialInterestGroup/Storage/gluster-Quickstart
https://support.rackspace.com/how-to/getting-started-with-glusterfs-considerations-and-installation/
https://sysadmins.co.za/setup-a-3-node-replicated-storage-volume-with-glusterfs/
https://serverfault.com/questions/803308/gluster-file-system-used-space-seen-by-df
https://gluster.readthedocs.io/en/latest/Administrator%20Guide/arbiter-volumes-and-quorum/
https://joejulian.name/post/replacing-a-glusterfs-server-best-practice/