GNU/Linux

You are currently browsing the archive for the GNU/Linux category.

Förra veckan gick jag igenom hur man kan sätta upp ett replikerat filsystem med GlusterFS. Om du behöver lägga till ytterligare en server i den setupen visar det sig vara mycket enkelt:

gluster volume add-brick replvolume replica 3 glustersrv3:/export/sdb1/brick

Notera här hur jag räknar upp antalet replicas till tre från förra veckans två, missar du det kommer det inte att funka.

Säg att du nu behöver ta bort glustersrv2 från ditt klustrade filsystem, då gör du bara så här:

gluster volume remove-brick replvolume replica 2 glustersrv2:/export/sdb1/brick
gluster peer detach glustersrv2

Notera återigen hur jag nu räknar ned antalet replicas. Klart! Du har nu lagt till en server och tagit bort en annan .

GlusterFs är ett väldigt coolt replikerat filsystem. Det innebär att du kan ha dina filer spridda över flera filservrar och därmed alltid ha dina filer tillgängliga även om en server skulle gå ned.

Så här gör du för att installera GlusterFS på två servrar, här nedan kallade glustersrv1.example.com (10.0.0.100) och glustersrv2.example.com (10.0.0.101) samt en klient kallad glusterclient1.example.com (10.0.0.200). Servrarna har var sin tillgänglig extra disk kallad /dev/sdb där vi kommer lägga upp en brick. Den version som installeras här är GlusterFs 3.4.1-3, om du vill installera en annan version, t.ex. om det kommit en nyare version när du läser den här bloggposten får du anpassa kommandona nedan för detta.

 

Börja med att fixa lagringsytan som Gluster ska användas, denna kallas med Glustertermer för en brick, detta görs på båda servrarna:

yum install xfsprogs
fdisk /dev/sdb #Skapa en stor partition här bara
mkfs.xfs -i size=512 /dev/sdb1
mkdir -p /export/sdb1 && mount /dev/sdb1 /export/sdb1 && mkdir /export/sdb1/brick
echo "/dev/sdb1 /export/sdb1 xfs defaults 0 0"  >> /etc/fstab

installera sedan själva glusterfs-mjukvaran, detta görs på båda servrarna:

mkdir gluster_rpms
cd gluster_rpms/
wget -l 1 -nd -nc -r -A.rpm http://download.gluster.org/pub/gluster/glusterfs/LATEST/RHEL/epel-6.4/x86_64/
yum localinstall glusterfs-3.4.1-3.el6.x86_64.rpm glusterfs-fuse-3.4.1-3.el6.x86_64.rpm glusterfs-geo-replication-3.4.1-3.el6.x86_64.rpm glusterfs-server-3.4.1-3.el6.x86_64.rpm glusterfs-libs-3.4.1-3.el6.x86_64.rpm glusterfs-cli-3.4.1-3.el6.x86_64.rpm
service glusterd start
chkconfig glusterd on
chkconfig glusterfsd on

Från glustersrv1.example.com ska du nu göra lite konfiguration:

gluster peer probe 10.0.0.101
gluster volume create replvolume rep 2 transport tcp glustersrv1:/export/sdb1/brick glustersrv2:/export/sdb1/brick
gluster volume start replvolume

På glusterclient1.example.com kan du nu installera den mjukvara du behöver där samt montera den replikerade volymen:

mkdir gluster_rpms
cd gluster_rpms/
wget -l 1 -nd -nc -r -A.rpm http://download.gluster.org/pub/gluster/glusterfs/LATEST/RHEL/epel-6.4/x86_64/
yum localinstall glusterfs-fuse-3.4.1-3.el6.x86_64.rpm glusterfs-3.4.1-3.el6.x86_64.rpm glusterfs-libs-3.4.1-3.el6.x86_64.rpm
mkdir /mnt/gluster
mount -t glusterfs glustersrv1:/replvolume /mnt/gluster

Nu är du klar och kan glatt lägga till fler klienter om du behöver.Notera att även om du monterat klienten mot en av servrarna kommer allt att fortsätta funka även om just den servern går ned. Om en server går sönder kommer den automatiskt att replikera sig tillbaka så att servrarna innehåller samma information när den kommer upp igen. Du kommer heller inte ha problem med split-brain, även om servrarna inte kan prata med varandra, så länge åtminstonne en klient kan prata med båda servrarna. Du kan även se till att servrarna stänger ned sig själva om de skulle bli ensamma och inte ha majoritet i klustret genom att använda en feature som heter server quorum. Detta har jag dock inte testat själv.

 

Instruktionerna har anpassats härifrån:

En del av er kanske tror att en blogg är till för att skriva på? Så är inte fallet, en blogg är en ursäkt för att få bygga kluster och lastbalansera. För att kunna göra det på ett roligt sätt behövs en hel massa burk. Jag tröttnade på att hålla på och virtualisera hemma i garaget och har därför flyttat ut min blogg i ”molnet” :). Jag har skaffat mig fyra vps:er (en blandning av xen och kvm) från två olika leverantörer (Edis och Hosting Inside). Maskinerna finns rent fysiskt i Schweiz, Tyskland och i USA. Därtill har jag köpt två lastbalanserarinstanser hos Rackspace som tjänst. Poängen med upplägget är att inte göra sig beroende av en leverantör och därigenom inte heller få några single points of failure. Leverantörerna valde jag främst på pris.

Huvudkomponenterna i mitt upplägg är:

OpenVPN

OpenVPN använder jag för att få ett internt, krypterat nätverk för kommunikation mellan mina noder. Jag har satt upp en av maskinerna som vpnserver och router för mitt interna nät. Den här delen är inte fullt redundant ännu, men kommer att bli det genom tekniken som används i den här how to’n: http://www.linuxjournal.com/article/9915

Principen är i alla fall klar, jag har med hjälp av OpenVPN fått ett internt nätverk som jag kan använda för intern kommunikation, i nästa steg kommer alla komponeter bli helt redundanta här också.

Edit: Cube-routed kan hämtas här: https://github.com/aguynamedben/cube-routed

Xtradb-cluser

Med hjälp av xtradb-cluster som Perconas implementation av Galera har jag fullt redundanta databasservrar. Jag använder två av servrana som webbservrar med Apache och PHP där jag kör wordpress. Lokalt på dessa kör var sin xtradb-instans. Xtradb-cluser ordnar med replikering av innodb-tabeller för mysql och för apache ser det ut som om den helt enkelt ansluter till en helt vanlig MySQL på localhost. I själva verket replikeras all data på radnivå i tabellerna mellan de båda servrarna över min OpenVPN-länk. På en tredje maskin kör garbd, Galera Arbitrator Daemon som ser till att skydda mot splitbrainproblematik och databaserna skulle tappa kontakten med varandra.

 

WordPress

WordPress är en helt vanlig bloggmotor som kör i Apache, jag har inte gjort något mera fancy här än att sätta upp en rsync som kopierar filer mellan servrarna så att jag håller alla filer och bilder i synk mellan maskinerna. I framtiden kommer jag här förmodligen att gå över till GlusterFS för att hantera filerna, men det har jag inte hunnit med ännu.

 

Puppet

Jag använder puppet för management av maskinerna och har lagt upp manifest för att snabbt och enkelt kunan deploya nya maskiner när jag byter leverantör eller vill kunna skala ut infrastrukturen.

 

Xymon

Jag använder Xymon för övervakning av miljön, allting som behövs på klienterna här deployas genom puppet.

 

Idag har jag laddat upp mitt paket till mentors.debian.net. Jag har även skapat en så kallad RFS (Request For Sponsorship) som är en förfrågan om att få någon att sponsra mig och mitt paket. RFS:en hittar ni på http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=699150 där det redan är diskussion på gång om paketets eventuella (brist på) meriter :).

Det har varit en kul dag och jag har lärt mig mycket om debian-paketering och jag har också splittat mitt github-repo i två, ett för debianpaketeringen och ett för källkoden.

Vi får se vad som händer med paketet nu, om inte Debian vill ha paketet så är planen att sätta upp ett eget repo för paketet och börja paketera nått annat övergivet paket i Debian, för det här projektet lär oavsett vad som händer inte räcka i 100 dagar :).

I dag har jag börjat mitt jobb med att få in mitt projekt begin in i Debian. Jag har gått med i de mejllistor man ska vara med i som en Debian Maintainer, jag har fått hjälp i kanalen #debian-mentors på irc.debian.org och jag har inteminst packat mitt projekt för Debian så att jag vet vad jag behöver göra samt lagt upp en såkallad ITP (Intent To Package) i Debians bugtracker: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=699113

Nu får vi se vad Debian tycker om mitt projekt, om de inte vill ha det har jag i alla fall chansen att lära mig en hel del om hur paketering och Debian fungerar. Inte så dåligt det heller.

En lustig grej som jag upptäckt i mitt paketerande är att jag får en varning av lintian om hardening-no-fortify-functions. En närmare granskning visar att det är följande funktioner som har problemet:

micke@build:~/begin-0.1.1$ hardening-check --verbose debian/begin/usr/bin/begin
debian/begin/usr/bin/begin:
 Position Independent Executable: no, normal executable!
 Stack protected: yes
 Fortify Source functions: no, only unprotected functions found!
        unprotected: memset
        unprotected: memmove
        unprotected: memcpy
 Read-only relocations: yes
 Immediate binding: no, not found!

Mina funktioner är alltså skyddade och jag har satt rätt flaggor. Problemet verkar komma från bugg #673112 så det verkar som om jag har gjort rätt i alla fall.

 

 

 

« Older entries § Newer entries »

Switch to our mobile site

Page optimized by WP Minify WordPress Plugin