Fri programvara

You are currently browsing the archive for the Fri programvara category.

Under julen skrev jag en liten Turingmaskin och ett program till den som implementerar addition av två 7 bitars binära tal på den. Med hjälp av den kod som finns i additionen finns allt som behövs för att också implementera subtraktion, multiplikation och division samt modulo, men det lämnar jag till något annat tillfälle.

Koden finns här för den som är intresserad. Själva Turingmaskinen består av mindre än 100 rader kod och är implementerad i python. Maskinen har ett register som börjar på noll och kan gå till minus oändligheten och till plus oändligheten. Den har också ett läs/skrivhuvud samt en kortläsare som kan läsa in programkod. Korten innehåller sex rader och ger instruktioner för vad maskinen ska göra om den läser en nolla i registret respektive vad den ska göra om den läser en etta. Möjliga handlingar är att skriva en nolla eller en etta. I kortet finns också instruktioner till vilket som är nästa kort beroende på om den läste en etta eller en nolla.
Själva additionen görs ganska enkelt och är implementerad i 88 kort. Algoritmen ser ut som följer:

Först går den till den negativa sidan av registret och fyller i ettor motsvarande det första talet som ska adderas till det andra, sedan går det till den positiva sidan av registret och fyller i den andra talet. Det första talet lagrar alltså sina bitar binärt i registerposition -1 till -8 (det riskerar förstås att bli overflow om alla bitar används på båda sidor) medan det andra talet finns på register position 1 till 8. Därefter rör sig läshuvudet tillbaka till position noll och räknar ned talet på den negativa sidan med ett. Nedräkningen görs genom att om läshuvudet ser en etta så skriver den en nolla och går tillbaka till position noll, om den tvärt om ser en nolla så går den till nästa bit och upprepar samma sak. Om den inte sett någon etta när den kollat hela vägen bort till position -8 så är talet noll och det har då blivit overflow vilket vi kommer utnyttja senare för att avsluta vår algoritm. När den räknat ned talet på den negativa sidan så adderar den ett till talet på den positiva sidan. Det sker på samma sätt som nedräkning, fast tvärt om. Om läshuvudet ser en etta så skriver den en nolla och fortsätter bort i registret, om den ser en nolla så skriver den en etta och går tillbaka till position noll. Sedan fortsätter läshuvudet på detta sätt att räkna ned på ena sidan och räkna upp på den andra tills alla bitar är slut på den negativa sidan och läshuvudet har läst förbi talet där. Då avslutas algoritmen och hela det adderade talet finns i registret på position 1 till 8 på den positiva sidan, så läshuvudet läser helt enkelt ut svaret som stå där.

Det är lätt att först att addera 1 till ett tal lika många gånger som värdet på ett annat tal är det samma som att addera dessa två tal, 2 + 2 är det samma som 1 + 1 + 2. Om man i stället skulle ha dragit ifrån en för varje så skulle man på det sättet ha implementerat subtraktion, 2 -2 är det samma som 2 -1 -1. Genom att ha en andra räknare på den negativa sidan så skulle man kunnat ha implementerat multiplikation, 4 * 4 är det samma som 1 + 1 + 1 + 1 + 1 + 1 + 1 +1 + 1 + 1 + 1 + 1 + 4. Detta skulle också ha möjliggjort division, eftersom division bara skulle innebära att räkna hur många gånger man behöver addera ett tal (nämnaren) till sig själv innan man uppnått den efterfrågade summan (täljaren).

Jag har tidigare visat hur man installerar GlusterFS på två servrar eller mer. Nu tänkte jag visa hur man kan använda en GlusterFSvolym tillsammans med Heartbeat för att sätta upp övervakningsverktyget Xymon.

Börja med att skapa en volym i GlusterFS, jag gjorde en på 100 GB, det borde räcka för att övervaka några tusen noder och spara all historik länge (flera år). Jag kallar min volym för xyvol och den server jag monterar volymen ifrån  glustersrv1 vilket kommer synas i kommandona nedan.

Nu behöver du två servrar med CentOS på, se till att ha ip-adresserna för de båda servrarna tillgängliga samt ytterligare en ip-adress som de ska dela på. Kör sedan kommandona nedan på båda servrarna.

Börja med att skapa en användare och lite kataloger som behövs samt montera glustervolymen under /opt/xymon:

groupadd xyserver
useradd -g xyserver -m -d /opt/xymon xyserver
mkdir /var/run/xyserver
chown xyserver:xyserver /var/run/xyserver
echo 'glustersrv1:/xyvol /opt/xymon glusterfs defaults,_netdev 0 0
' >> /etc/fstab
mount -a

Installera sedan apache och de beroenden vi behöver för att kunna bygga våra paket längre fram:

yum install gcc make httpd mod_ssl pango-devel libxml2-devel pcre-devel openssl-devel openldap-devel

 

Två paket vi behöver är rrdtool och fping så vi bygger dem så här:

wget http://fping.org/dist/fping-3.2.tar.gz
tar xfv fping-3.2.tar.gz
cd fping-3.2
./configure
make && make install
cd ..
chmod +xs /usr/local/sbin/fping
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz
tar xfv rrdtool-1.4.8.tar.gz
cd rrdtool-1.4.8
./configure
make && make install
cd ..

Här näst kan vi installera Xymon, du behöver ladda hem filen på nått bra sätt efterson sourceforge inte tillåter direktlänkar så överlåter jag det med varm hand åt läsaren. Här finns filen iaf:  http://downloads.sourceforge.net/project/xymon/Xymon/4.3.17/xymon-4.3.17.tar.gz

Nu kan du packa upp och bygga servern, det behöver du dock bara göra på ena servern eftersom du ju ska lägga filerna på en delad volym. Du kommer behöva besvara frågor från configureskriptet, kom i håg att  xyserver iäranvändaren som ska köra server och att installationskatalogen ska vara  /opt/xymon. När du får fråga om serverns ip-nummer ska du ange den delade ip-adressen du förberett och som du kommer konfigurera med Heartbeat senare :

tar xfv xymon-4.3.17.tar.gz
cd xymon-4.3.17
./configure.server
make && make install

Nu kan du kopiera konfen för apache till rätt ställe, det här behöver du göra på båda servrarna:

cp /opt/xymon/server/etc/xymon-apache.conf /etc/httpd/conf.d/

 

Kör:

vi /etc/init.d/xyserver

och klistra in detta

#!/bin/bash
#
# chkconfig: - 80 20
# description: Xymon is a network monitoring tool that can monitor hosts \
#               and services and shows monitor status via a webpage.
#
# processname: xyserver
#
### BEGIN INIT INFO
# Provides: xyserver
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Short-Description: start and stop xymon
# Description: Xymon is a network monitoring tool that can monitor hosts
#              and services and shows monitor status via a webpage.
### END INIT INFO
USER=xyserver
SCRIPT=/opt/xymon/server/xymon.sh
function call_script {
	su - $USER -c "$SCRIPT $1"
}
case "$1" in
	"start")
		call_script $1
		;;
	"stop")
		call_script $1
		;;
	"restart")
		call_script $1
		;;
	"reload")
		call_script $1
		;;
	"status")
		call_script $1
		;;
	"rotate")
		call_script $1
		;;
	*)
        echo "Usage: $0 start|stop|restart|reload|status|rotate"
        ;;
esac

Kör sedan:

chmod +x /etc/init.d/xyserver

I filerna /opt/xymon/server/xymon.sh och /opt/xymon/server/etc/tasks.cfg måste du nu ändra så att sökvägen till alla pid-filer ändras till  /var/run/xyserver, det funkar inge bra att ha dem på den delade volymen.

Nu kan du sätta upp Heartbeat så att du får en delad ip-adress att köra Xymonservern på. Instruktioner för att sätt upp Heartbeat kan du hitta här: http://www.howtoforge.com/high_availability_heartbeat_centos. Följ instruktionerna och sätt upp den delade ip-adressen, glöm inte att lägga till både httpd och xyserver som resurser i ditt kluster.

Klart!

Nu kan du faila över din Xymoninstallation mellan noderna och alltid ha din övervakningsserver tillgänglig.

 

Jag har tidigare gått igenom hur man sätter upp ett replikerat filsystem med GlusterFS och även noterat hur man gör för att lägga till och ta bort servrar ur konfigurationen.

Hur gör man då när man har ett klustrat filsystem, men inte vill att kreti och pleti skall kunna ansluta till det? Jo, fär att hindra att andra servrar går med i klustert gör man så här på en av de ingående klusternoderna:

gluster volume set replvolume auth.allow 10.0.0.100,10.0.0.101,10.0.0.102

Om man även vill hindra klienter från att ansluta utan tillåtelse måste man använda en brandvägg så som iptables. Varje brick får sin egen port, så det är ganksa enkelt att fixa. Kolla först vilken port din brick använder:

[root@glustersrv1 ~]# gluster volume status replvolume
Status of volume: replvolume
Gluster process                                         Port    Online  Pid
------------------------------------------------------------------------------
Brick glustersrv1:/export/sdb1/brick                  49152   Y       3218
Brick glustersrv3:/export/sdb1/brick                  49152   Y       4387
NFS Server on localhost                                 2049    Y       23745
Self-heal Daemon on localhost                           N/A     Y       23752
NFS Server on glustersrv3                             2049    Y       4659
Self-heal Daemon on glustersrv3                       N/A     Y       4667

Här ovan är det alltså 49152 som används, så börja med att tillåta dina legitima klienter: (i det här fallet 10.0.0.200 och 10.0.0.201):

iptables -A INPUT -p tcp --dport 49152 -s 10.0.0.200  -j ACCEPT
iptables -A INPUT -p tcp --dport 49152 -s 10.0.0.201  -j ACCEPT

När det är klart kan du börja blocka:

iptables -A INPUT -p tcp --dport 49152 -s 10.0.0.0/24  -j REJECT

Du behöver göra det här på alla ingående servrar.

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:

« Older entries

Switch to our mobile site

Page optimized by WP Minify WordPress Plugin