Gebruikershulpmiddelen

Site-hulpmiddelen


installatie_handleidingen:3_node_glusterfs_centos7_cluster

Dit is een oude revisie van het document!


Een 3 Node GlusterFS cluster op CentOS 7

Work in progress

Begin met een kaal ingerichte CentOS 7 server met bij voorkeur een extra, apart storage LAN.

diskindeling

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 glusterVG /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

GlusterFS server installatie

repo

installeer de nodige repositories:
yum install epel-release
yum install centos-release-gluster

name resolving

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

software

install de gluster server software:
yum install glusterfs-server

start de glusterfs software nu en in de toekomst:
systemctl enable glusterd
systemctl start glusterd

firewall

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

start een Trusted pool

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

Define en start een GlusterFS volume

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

GlusterFS client koppelen

client software instaleren

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)

CentOS7

eerst de repository koppelen:
yum install centos-release-gluster

dan de client software installeren:
yum install fuse fuse-libs openib libibverbs glusterfs glusterfs-fuse

Ubuntu

apt-get install glusterfs-client

Gluster volume mounten

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:



Expanding with another server

replace a faulty disk

expand with an extra disk

troubleshoot

verwijder een volume

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

Bronnen

installatie_handleidingen/3_node_glusterfs_centos7_cluster.1545573631.txt.gz · Laatst gewijzigd: 2018/12/23 15:00 door abel