Sisällysluettelo |
Alla olevan kuvan tarkoitus on kuvata, miten Linux ja siihen pohjautuvat järjestelmät rakentuvat. Kaiken keskellä on Kernel, ydin, joka on tärkeimmässä roolissa koko järjestelmässä. Linux on kuuluisa luotettavuudestaan ja toimivuudestaan, ja tähän syyllinen on yksinkertainen ja toimiva Kernel. Kernelin vahvuus on sen kehitystavassa eli avoimessa lähdekoodissa, jolloin ammattitaitoiset ja asiaan vannoutuneet henkilöt pystyvät kehittämään yhä parempaa ja parempaa tuotosta. Tätä kehitystapaa on kopioitu isoon osaan kernelin ympärille rakentuvista ohjelmista, ja näin lopputuloksena on se, mistä Linux on kuuluisa.
Linuxissa on valtava määrä hyviä ominaisuuksia, mutta luonnollisesti myös ns. ei-niin-hyviä-ominaisuuksia. Paras kuva Linuxista muodostuu itse tekemällä ja kokeilemalla. Materiaalia löytyy asiaan kuin asiaan tuhansia sivuja. Löytyy artikkeleita, step-by-step -ohjeita, foorumeita, live-keskusteluja ja vaikka mitä.
Mielipide Linuxista kannattaa muodostaa vasta testaamisen jälkeen! Kannattaa käyttää testaamiseen jakelua, johon löytyy paljon ohjeita! Allekirjoittaneen mielipiteitä alla - Ubuntu => Hyvä normaaliin käyttöön. Päivitysaikataulu on kiivas, kannattaa suosia LTS-versioita. Uudehkot ohjelmat, jotka toimiva pääsääntöisesti hyvin ja vakaasti. - Debian => Moneen käyttöön sopiva, aina palvelinympäristöistä sulautettuihin. Toimiva ja luotettava, mutta normikäyttäjälle ohjelmat voivat olla vanhahkoja. - SUSE => Yrityskäyttöön parhaiten sopiva jakelu. Windows-ympäristöjen ylläpitäjille tutunkaltaisia työkaluja palveluiden hallintaan. Yhteensopivuutta ja keskitettyä hallintaa.
Linux sopii hyvin esimerkiksi todellisiin ympäristöihin, joissa käyttöliittymien koristeet ja ohjelmien helppokäyttöisyys eivät ole niitä tärkeimpiä asioita.
NFS on Unix- ja Linux-järjestelmissä suosittu verkon läpi toimiva tiedostojärjestelmä. NFS:n avulla voidaan suorittaa esimerkiksi varmuuskopiointia tai vaikkapa työaseman virtualisointia, niin että kaikki aseman tiedostot sijaitsevat verkossa. Debianissa NFS-palvelimen käyttöönotto tapahtuu seuraavasti.
Asennetaan palvelimeen NFS-palvelinohjelma
nas:~# apt-get install nfs-kernel-server
Asiakas koneella homma näyttää seuraavalta
Palvelin ennen NFS-serverin asennusta
www:~# rpcinfo -p 192.168.1.156
ohjelmaversio proto portti
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 37674 status
100024 1 tcp 44924 status
Palvelimeen asennettu NFS-serveri
www:~# rpcinfo -p 192.168.1.156
ohjelmaversio proto portti
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 37674 status
100024 1 tcp 44924 status
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 45301 nlockmgr
100021 3 udp 45301 nlockmgr
100021 4 udp 45301 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 41386 nlockmgr
100021 3 tcp 41386 nlockmgr
100021 4 tcp 41386 nlockmgr
100005 1 udp 33885 mountd
100005 1 tcp 51562 mountd
100005 2 udp 33885 mountd
100005 2 tcp 51562 mountd
100005 3 udp 33885 mountd
100005 3 tcp 51562 mountd
www:~#
Asennuksen jälkeen palvelimelle tehdään kansio, joka annetaan WWW-palvelimen käyttöön.
nas:~# mkdir -p /srv/nfs/www-000 nas:~# chmod a+rwx /srv/nfs/www-000 nas:~# pico /etc/exports ---- # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /srv/nfs/www-000 www(rw,sync,no_subtree_check,no_root_squash) ---- nas:~# exportfs -rv exporting www:/srv/nfs/www-000 nas:~#
Laitetaan verkkoyhteyksiin liittyvät asiat kuntoon
nas:~# pico /etc/hosts
----
127.0.0.1 localhost
192.168.1.156 nas.testiverkko.info nas
192.168.1.152 www
----
nas:~# ping www -c1
PING www (192.168.1.152) 56(84) bytes of data.
64 bytes from www (192.168.1.152): icmp_seq=1 ttl=64 time=7.77 ms
--- www ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 7.774/7.774/7.774/0.000 ms
nas:~# ip -4 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.1.156/24 brd 255.255.255.255 scope global eth0
nas:~#
Mountataan jaettu kansio asiakaskoneelle, ja tehdään kansioon tiedosto
www:~# mount 192.168.1.156:/srv/nfs/www-000 /mnt/varasto-000 www:~# cd /mnt/varasto-000/ www:/mnt/varasto-000# ls -la yhteensä 8 drwxrwxrwx 2 root root 4096 3.9.2009 . drwxr-xr-x 3 root root 4096 1.9. 19:20 .. www:/mnt/varasto-000# touch test.txt www:/mnt/varasto-000#
Samaan aikaan palvelimella
nas:~# cd /srv/nfs/www-000/ nas:/srv/nfs/www-000# ls -la yhteensä 8 drwxrwxrwx 2 root root 4096 3.9. 09:41 . drwxr-xr-x 3 root root 4096 3.9. 08:46 .. -rw-r--r-- 1 root root 0 3.9. 09:41 test.txt nas:/srv/nfs/www-000#
Seuraavaksi määritellään asiakaskoneelle mounttaaminen tapahtumaan jo käynnistysvaiheessa
www:~# pico /etc/hosts ---- 127.0.0.1 localhost 192.168.1.152 www.testiverkko.info www 192.168.1.156 nas # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts ---- www:~# pico /etc/fstab ---- # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/hda1 / ext3 errors=remount-ro 0 1 /dev/hda5 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0 nas:/srv/nfs/www-000 /mnt/varasto-000 nfs defaults 0 0 ---- www:~# umount 192.168.1.156:/srv/nfs/www-000 www:~# ping -c1 nas PING nas (192.168.1.156) 56(84) bytes of data. 64 bytes from nas (192.168.1.156): icmp_seq=1 ttl=64 time=1.23 ms --- nas ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.234/1.234/1.234/0.000 ms www:~# pico /etc/fstab www:~# mount -a www:~#
Varmistetaan toiminta vielä käynnistämällä järjestelmä
www:~# reboot ---- www:~# cat /etc/mtab /dev/hda1 / ext3 rw,errors=remount-ro 0 0 tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0 proc /proc proc rw,noexec,nosuid,nodev 0 0 sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0 udev /dev tmpfs rw,mode=0755 0 0 tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0 devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0 nas:/srv/nfs/www-000 /mnt/varasto-000 nfs rw,addr=192.168.1.156 0 0 www:~#
Tässä oli siis NFS-palvelimen käyttöönoton alkeet. NFS on erittäin monipuolinen, mutta konfigurointi vaikeutuu tästä eteepäin mentäessä!
Ensimmäisenä määritellään, että mistä osoitteista palvelukutsuja voidaan tehdä, eli alla on kielletty kaikki.
nas:/etc# pico hosts.deny ---- # /etc/hosts.deny: list of hosts that are _not_ allowed to access the system. # See the manual pages hosts_access(5) and hosts_options(5). # # Example: ALL: some.host.name, .some.domain # ALL EXCEPT in.fingerd: other.host.name, .other.domain # # If you're going to protect the portmapper use the name "portmap" for the # daemon name. Remember that you can only use the keyword "ALL" and IP # addresses (NOT host or domain names) for the portmapper, as well as for # rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8) # for further information. # # The PARANOID wildcard matches any host whose name does not match its # address. # You may wish to enable this to ensure any programs that don't # validate looked up hostnames still leave understandable logs. In past # versions of Debian this has been the default. # ALL: PARANOID portmap: ALL lockd: ALL mountd: ALL rquotad: ALL statd: ALL ---- nas:/etc# invoke-rc.d nfs-common restart Stopping NFS common utilities: idmapd statd. Starting NFS common utilities: statd idmapd. nas:/etc#
Asiakaskoneella homma näyttää seuraavalta
www:~# rpcinfo -p nas
ohjelmaversio proto portti
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 51204 status
100024 1 tcp 49318 status
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 40264 nlockmgr
100021 3 udp 40264 nlockmgr
100021 4 udp 40264 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 33949 nlockmgr
100021 3 tcp 33949 nlockmgr
100021 4 tcp 33949 nlockmgr
100005 1 udp 47517 mountd
100005 1 tcp 44847 mountd
100005 2 udp 47517 mountd
100005 2 tcp 44847 mountd
100005 3 udp 47517 mountd
100005 3 tcp 44847 mountd
Käynnistämisen jälkeen
www:~# rpcinfo -p nas
Etäohjelmia ei ole rekisteröity.
Seuraavaksi sallitaan WWW-koneesta tulevat pyynnöt.
nas:/etc# pico hosts.allow ---- # /etc/hosts.allow: list of hosts that are allowed to access the system. # See the manual pages hosts_access(5) and hosts_options(5). # # Example: ALL: LOCAL @some_netgroup # ALL: .foobar.edu EXCEPT terminalserver.foobar.edu # # If you're going to protect the portmapper use the name "portmap" for the # daemon name. Remember that you can only use the keyword "ALL" and IP # addresses (NOT host or domain names) for the portmapper, as well as for # rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8) # for further information. # portmap: 192.168.1.152 lockd: 192.168.1.152 mountd: 192.168.1.152 rquotad: 192.168.1.152 statd: 192.168.1.152 ---- nas:/etc# invoke-rc.d nfs-common restart Stopping NFS common utilities: idmapd statd. Starting NFS common utilities: statd idmapd. nas:/etc#
Tämän jälkeen homma toimii normaalisti. Seuraavana muokataan liittämisen asetuksia.
nas:/etc# pico exports ---- # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /srv/nfs/www-000 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash) ---- nas:/etc# exportfs -rv exporting 192.168.1.0/24:/srv/nfs/www-000 nas:/etc#
Tämän jälkeen kansio on liitettävissä kyseisen aliverkon koneille
apache:~# mkdir /mnt/varasto-000 apache:~# mount 192.168.1.156:/srv/nfs/www-000 /mnt/varasto-000 apache:~#
NFS-palvelimessa tietoturvaa voidaan parantaa lukemattomilla eri tavoilla! Itse NFS on oletusasetuksillakin turvallinen!
Linuxissa voidaan varmuuskopiointi toteuttaa usealla eri tavalla. Yksi parhaimmista on Rsync, joka huolehtii SSH-yhteyden läpi tapahtuvan kansio- ja tiedostorakenteen kopioinnista. Seuraavassa aiheesta esimerkki, jossa oletuksena on, että jokaisessa koneessa on asennettuna paketit openssh-server ja rsync. Tehdään ensimmäisenä SSH-yhteyteen käytettävä avainpari.
debian:~# mkdir .ssh debian:~# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: f6:de:32:59:43:7f:49:0b:c2:78:bf:90:6a:31:0e:9d root@debian The key's randomart image is: +--[ RSA 2048]----+ | | | | | o | | . +.. . | | S o.+.o o| | o E oo..o.| | o =o.... | | =+. . | | . .o. | +-----------------+ debian:~#
Siirretään avainparin julkinen avain kohdekoneella ja varmistetaan yhteyden toimivuus. Lopputuloksena on, että koneeseen pääse kirjautumaan ilman salasanaa.
debian:~# scp .ssh/id_rsa.pub root@192.168.1.160:/root/debian-avain The authenticity of host '192.168.1.160 (192.168.1.160)' can't be established. RSA key fingerprint is 94:09:a7:fc:7f:e4:2f:d2:66:b3:38:59:d6:2b:b7:a4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.160' (RSA) to the list of known hosts. root@192.168.1.160's password: id_rsa.pub 100% 393 0.4KB/s 00:00 debian:~# ssh root@192.168.1.160 root@192.168.1.160's password: Linux www 2.6.26-2-686 #1 SMP Thu Mar 26 01:08:11 UTC 2009 i686 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Sep 8 00:20:24 2009 www:~# www:~# ls debian-avain www:~# cd .ssh/ www:~/.ssh# ls known_hosts www:~/.ssh# cat /root/debian-avain > authorized_keys www:~/.ssh# ls authorized_keys known_hosts www:~/.ssh# exit logout Connection to 192.168.1.160 closed. debian:~# ssh root@192.168.1.160 Linux www 2.6.26-2-686 #1 SMP Thu Mar 26 01:08:11 UTC 2009 i686 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Mon Sep 7 22:08:26 2009 from 192.168.1.117 www:~#
Varmuuskopioidaan WWW-palvelimen kansion /srv/www sisältö seuraavalla komennolla.
debian:~# rsync -avz root@192.168.1.160:/srv/www/ /root/www-0/ receiving incremental file list created directory /root/www-0 ./ mediawiki-1.14.0/ mediawiki-1.14.0/AdminSettings.sample mediawiki-1.14.0/COPYING mediawiki-1.14.0/CREDITS mediawiki-1.14.0/FAQ ---- wordpress/wp-includes/js/tinymce/utils/form_utils.js wordpress/wp-includes/js/tinymce/utils/mclayer.js wordpress/wp-includes/js/tinymce/utils/mctabs.js wordpress/wp-includes/js/tinymce/utils/validate.js sent 39032 bytes received 12497368 bytes 455869.09 bytes/sec total size is 42908719 speedup is 3.42 debian:~# ls www-0
Ajoitetaan kopiointi tapahtumaan puolen tunnin välein. Varmistetaan, että tiedot kopioinnista tallennetaan lokitiedostoon.
debian:~# cd /etc/cron.d debian:/etc/cron.d# echo "*/30 * * * * rsync -avz root@192.168.1.160:/srv/www/ /root/www-0/ >> /var/log/rsync/www-0.log" > rsync-www-0 debian:/etc/cron.d# mkdir /var/log/rsync debian:/etc/cron.d# touch /var/log/rsync/www-0.log debian:/etc/cron.d#
Pakataan kansio tiedostoksi kerran päivässä kolmelta yöllä. Huomaa. että bzip2-paketti on asennettu!
debian:/etc/cron.d# echo "0 3 * * * tar -cjf /root/WWW-0-backup-files-$(date +\%y\%m\%d).tar.bz2 -C / root/www-0 > /dev/null" > backup-www0 debian:/etc/cron.d#
Edellä oli esitetty vain yksi tapa varmuuskopiointiin! Muita vaihtoehtoja on paljon, eli varmuuskopiointi ympäristön mukaan!
Linux on äärettömän monipuolinen käyttöjärjestelmä. Saatavilla olevien ohjelmien määrä on niin valtava, että jokaiselle löytyy varmasti mieleisensä. Seuraavassa on toteutettu kätevä siirtonopeuden näyttävä sovellus. Tähän tarkoitukseen käytetään Iperf-ohjelmaa.
Aloitetaan sovelluksen rakentaminen asentamalla kahdelle koneelle kyseinen ohjelma
nas:~# apt-get install iperf Luetaan pakettiluetteloita... Valmis Muodostetaan riippuvuussuhteiden puu Luetaan tilatiedot... Valmis Seuraavat UUDET paketit asennetaan: iperf 0 päivitetty, 1 uutta asennusta, 0 poistettavaa ja 10 päivittämätöntä. Noudettavaa arkistoa 52,7kt. Toiminnon jälkeen käytetään 156k t lisää levytilaa. Nouda:1 http://213.250.106.7 lenny/main iperf 2.0.4-1 [52,7kB] Noudettiin 52,7kt ajassa 0s (203kt/s) Selecting previously deselected package iperf. (Reading database ... 27002 files and directories currently installed.) Unpacking iperf (from .../iperf_2.0.4-1_i386.deb) ... Processing triggers for man-db ... Setting up iperf (2.0.4-1) ... nas:~# ---- www:~# apt-get install iperf Luetaan pakettiluetteloita... Valmis Muodostetaan riippuvuussuhteiden puu Luetaan tilatiedot... Valmis Seuraavat UUDET paketit asennetaan: iperf 0 päivitetty, 1 uutta asennusta, 0 poistettavaa ja 0 päivittämätöntä. Noudettavaa arkistoa 52,7kt. Toiminnon jälkeen käytetään 156k t lisää levytilaa. Nouda:1 http://ftp.fi.debian.org lenny/main iperf 2.0.4-1 [52,7kB] Noudettiin 52,7kt ajassa 0s (135kt/s) Selecting previously deselected package iperf. (Reading database ... 20631 files and directories currently installed.) Unpacking iperf (from .../iperf_2.0.4-1_i386.deb) ... Processing triggers for man-db ... Setting up iperf (2.0.4-1) ... www:~#
Käynnistetään ohjelma toisessa koneessa, ja otetaan yhteys toisella koneella.
nas:~# iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ------------------------------------------------------------ [ 4] local 192.168.1.156 port 5001 connected with 192.168.1.152 port 35412 [ ID] Interval Transfer Bandwidth [ 4] 0.0-10.0 sec 544 MBytes 456 Mbits/sec ---- www:~# iperf -c nas ------------------------------------------------------------ Client connecting to nas, TCP port 5001 TCP window size: 16.0 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.1.152 port 35412 connected with 192.168.1.156 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 544 MBytes 456 Mbits/sec www:~#
Näin.. Nyt ei tarvi huolehtia muuta kuin siitä, että ohjelma lähtee käyntiin koneen käynnistyessä. Tämä voidaan tehdä monellakin tapaa, joista seuraavassa esitetty yksi:
Ohjelman manuaalista löytyy, että kun käynnistetään ohjelman komennolla iperf -sD, niin se suoritetaan taustalla. Testataan
Tässä UDP-serveri nas:~# iperf -sD -u Running Iperf Server as a daemon The Iperf daemon process ID : 3013 Tässä TCP-serveri nas:~# iperf -sD Running Iperf Server as a daemon The Iperf daemon process ID : 3017 nas:~#
Hyvä.. paitsi että käytännön testauksessa kävi ilmi daemon-moden toimimattomuus. Vika ilmenee prosessorin kuormittamisella, jolloin kyseiset prosessit haukkaavat koneesta tehoja. No.. Linuxin hienous on siinä, että vaihtoehtoisia ratkaisuja löytyy aina. Pitää vain valita pienimmän riesan tie. Käytetään tähän tarkoitukseen Linuxin taustaprosessi-ominaisuutta.
nas:~# iperf -s -u 2>&1 > /dev/null & [1] 3167 nas:~# iperf -s 2>&1 > /dev/null & [2] 3170 nas:~#
Ohjelmat pyörivät taustalla, joten tämä on se mitä haetaankin. Lopuksi laitetaan ohjelmat käynnistymään koneen yhteydessä. Testataan lopuksi toiminta.
nas:~# pico /etc/rc.local
----
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
iperf -s -u 2>&1 > /dev/null &
iperf -s 2>&1 > /dev/null &
exit 0
----
nas:~# reboot
Broadcast message from root@nas (pts/0) (Thu Sep 3 11:54:12 2009):
The system is going down for reboot NOW!
----
nas:~# ps xa
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 init [2]
2 ? S< 0:00 [kthreadd]
----
2066 ? S<s 0:00 /usr/sbin/sshd
2069 ? S 0:00 iperf -s -u
2073 ? S 0:00 iperf -s
2090 tty1 Ss+ 0:00 /sbin/getty 38400 tty1
2091 tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2095 ? S<s 0:00 sshd: root@pts/0
2098 pts/0 S<s 0:00 -bash
2102 pts/0 R<+ 0:00 ps xa
nas:~#
Testataan toiminta asiakaskoneella.
www:~# iperf -c nas ------------------------------------------------------------ Client connecting to nas, TCP port 5001 TCP window size: 16.0 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.1.152 port 35998 connected with 192.168.1.156 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 563 MBytes 473 Mbits/sec
Tämä on vain yksi esimerkki käytännöllisestä ja tarpeellisesta sovelluksesta! Vastaavia esimerkkejä löytyy pilvin pimein!
Verkon käytön kasvaessa palveluiden saatavuus on yhä tärkeämmässä roolissa. Ajatellaanpa vaikka puhelinliikennettä, joka siirtyy muutaman vuoden kuluessa täysin IP-pohjaisiksi. Tyypillisessä ratkaisussa puhelin ottaa yhteyden SIP-protokollalla palvelimeen, joka ohjaa puhelun oikeaan paikkaan. Puhelut eivät siis onnistu, jos palvelin on nurin. Vastaavia tilanteita on verkko pullollaan, eli esimerkiksi WWW-, SQL-, DNS-, DHCP-palvelimet ovat käyttäjän kannalta erittäin kriittisessä asemassa. Jos jokin palveluista on polvillaan, käyttäjän aika kuluu pasianssin pelaamisen tai muuhun vastaavaan mieltä ja kehoa rauhoittavaan toimintaan.
Allekirjoittaneen empiiriseen tutkimukseen perustuvat havainnot osoittavat, että palvelimien uptime-arvot ovat erittäin heikot. Huonot uptimet ovat osoitus järjestelmien jatkuvasta, erittäin suuresta, käynnistystarpeesta, ja heijastaa suoraan käyttäjille näkyvään palvelun saatavuuteen. Jos pidetään siedettävän palvelun referenssinä vaikkapa 97% saatavuutta, eli palvelu olisi alhaalla noin yhden päivän kuukaudesta, on valitettavan iso tavoite monille palveluntuottajille. Täytyy löytyä keinot, joilla ennalta arvaattomat tilanteet, kuten palvelimien boottaamiset, eivät vaikuta merkittävästi palvelun saatavuuteen. Käsite High Availability on monessa tapauksessa vielä täysin vieras.
Palvelu on kokonaisuus, johon vaikuttavat erittäin monet tekijät. Yksittäisen palvelimen virtalähteen hajoaminen, palvelimen kovalevyn vioittuminen, sähkökatkot, tietoliikenneyhteyksien häiriöt ja muut yksittäiset asiat vaikuttavat suoraan palvelun saatavuuteen. On tekijöitä, joille yleisesti ei voida mitään, ja se asia on vain hyväksyttävä. Ei voida tietää, milloin ulkopuolisen palveluntarjoajan tuotteet eivät toimi. Tälle asialle ei yksinkertaisesti voida mitään. Mutta kokonaisuudessa on paljon asioita, joita parantamalla voidaan vaikuttaa suoraan palvelun laatuun.
Klusteroinnin tarkoituksena on pienentää yksittäisen palvelimen vaikutusta palvelun tuottamiseen. Palvelimen uudelleenkäynnistäminen tai vioittuminen ei vaikuta hyvin toteutetussa klusterissa palvelun saatavuuteen millään tavoin. Käyttäjän ei parhaassa tilanteessa huomaa mitään eroa normaaliin tilanteeseen verrattuna, ja jatkaa käyttämistä täysin tietämättä taustalla tapahtuneista asioista. Näinhän se pitäisi olla, ja tällaista tilannetta pitäisi tavoitella.
Seuraavassa toteutetaan pienimuotoinen klusteri käyttäen kahta Debianilla varustettua VirtualBox-alustalla tehtyä virtuaalikonetta. Oletuksena on, että koneet ovat perusasennettuja, ilman graafista työpöytää olevia koneita. Koneiden resurssivaatimukset ovat hyvin pieniä, sillä esimerkiksi toteutuksessa niille on varattu käyttöön ainoastaan 256 MB keskusmuistia. Koneiden kovalevytiedostojen (vdi) koko on alle giga. Näillä varmistetaan koneiden helppo siirreltävyys, ja useiden samanaikaisten koneiden aktiivinen käyttö. Koneiden hallinta tapahtuu SSH-yhteyden kautta. Koneiden nimet ovat jatkossa majakka ja perävaunu. Majakka on niin sanottu ensisijainen kone ja perävaunu toissijainen.
Asetetaan ensimmäiseksi koneiden IP-asetukset ja muut verkossa olemiseen liittyvät asiat kuntoon. Ensimmäisenä IP-osoite, jonka muuttamisesta alla esimerkki.
third:~# cd /etc/network
third:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:45:03:39
inet addr:213.250.105.61 Bcast:213.250.105.127 Mask:255.255.255.128
inet6 addr: fe80::a00:27ff:fe45:339/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15800 errors:1 dropped:0 overruns:0 frame:0
TX packets:4992 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10819445 (10.3 MiB) TX bytes:412933 (403.2 KiB)
Interrupt:11 Base address:0xc020
third:/etc/network# ifdown eth0
----
third:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:45:03:39
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:15800 errors:1 dropped:0 overruns:0 frame:0
TX packets:4992 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10819445 (10.3 MiB) TX bytes:412933 (403.2 KiB)
Interrupt:11 Base address:0xc020
third:/etc/network# pico interfaces
----
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.20.20
netmask 255.255.255.0
gateway 192.168.20.1
----
third:/etc/network# ifup eth0
third:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:45:03:39
inet addr:192.168.20.20 Bcast:192.168.20.255 Mask:255.255.255.128
inet6 addr: fe80::a00:27ff:fe45:339/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16605 errors:1 dropped:0 overruns:0 frame:0
TX packets:5081 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10878601 (10.3 MiB) TX bytes:423631 (413.7 KiB)
Interrupt:11 Base address:0xc020
third:/etc/network# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.20.1 0.0.0.0 UG 0 0 0 eth0
third:/etc/network#
Näin on siis vaihdettu IP-osoite. Seuraavaksi vaihdetaan koneen nimi ja esitellään klusterikaveri.
third:~# hostname peravaunu third:~# cd /etc/ third:/etc# pico hostname ---- peravaunu ---- third:/etc# pico hosts ---- 127.0.0.1 localhost 127.0.1.1 peravaunu.testiverkko.info peravaunu 192.168.20.10 majakka.testiverkko.info majakka ---- third:/etc# hostname peravaunu third:/etc# hostname --fqdn peravaunu.testiverkko.info third:/etc# reboot
Toiselle koneelle vastaavasti
second:~# cd /etc/network
second:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:45:03:55
inet addr:213.250.105.55 Bcast:213.250.105.127 Mask:255.255.255.128
inet6 addr: fe80::a00:27ff:fe45:339/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15800 errors:1 dropped:0 overruns:0 frame:0
TX packets:4992 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10819445 (10.3 MiB) TX bytes:412933 (403.2 KiB)
Interrupt:11 Base address:0xc020
second:/etc/network# ifdown eth0
----
second:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:45:03:55
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:15800 errors:1 dropped:0 overruns:0 frame:0
TX packets:4992 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10819445 (10.3 MiB) TX bytes:412933 (403.2 KiB)
Interrupt:11 Base address:0xc020
second:/etc/network# pico interfaces
----
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.20.10
netmask 255.255.255.0
gateway 192.168.20.1
----
second:/etc/network# ifup eth0
second:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:45:03:55
inet addr:192.168.20.20 Bcast:192.168.20.255 Mask:255.255.255.128
inet6 addr: fe80::a00:27ff:fe45:339/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16605 errors:1 dropped:0 overruns:0 frame:0
TX packets:5081 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10878601 (10.3 MiB) TX bytes:423631 (413.7 KiB)
Interrupt:11 Base address:0xc020
second:/etc/network# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.20.1 0.0.0.0 UG 0 0 0 eth0
second:/etc/network#
second:~# hostname peravaunu
second:~# cd /etc/
second:/etc# pico hostname
----
peravaunu
----
second:/etc# pico hosts
----
127.0.0.1 localhost
127.0.1.1 majakka.testiverkko.info majakka
192.168.20.20 peravaunu.testiverkko.info peravaunu
----
second:/etc# hostname
majakka
second:/etc# hostname --fqdn
majakka.testiverkko.info
second:/etc# reboot
Lopuksi pitäisi vielä muokata tiedostoa resolv.conf kansiosta /etc. Tiedoston pitäisi sisältää vähintään seuraava rivi, jolla esitellään koneen käyttämä nimipalvelin.
nameserver 192.168.20.1
Asennetaan ensimmäiseksi molemmille koneille Heartbeat, jolla klusterointi toteutetaan. Lisäksi asennettaan klusteroitava palvelu eli Lighttpd, joka toimi WWW-palvelinohjelmistona.
apt-get install heartbeat-2 lighttpd
Heartbeat on palvelinohjelma, joka kirjaimellisesti sykkii määrätyin aikavälein klusterissa olevien laitteiden kanssa. Tuloksien mukaisesti klusterissa olevien laitteiden ja niiden palveluiden tiloissa tapahtuu muutoksia. Ensimmäisenä pitää konfiguroida tiedostoa ha.cf, jossa määritellään klusterin jäsenet ja muita yleisiä asioita.
majakka:~# pico /etc/ha.d/ha.cf
node majakka node peravaunu keepalive 2 warntime 5 deadtime 10 initdead 60 ucast eth0 192.168.20.20 ping 192.168.20.1 auto_failback on use_logd yes debug 1 logfile /var/log/hb.log debugfile /var/log/heartbeat-debug.log respawn hacluster /usr/lib/heartbeat/ipfail
majakka:~#
peravaunu:~# pico /etc/ha.d/ha.cf
node majakka node peravaunu keepalive 2 warntime 5 deadtime 10 initdead 60 ucast eth0 192.168.20.10 ping 192.168.20.1 auto_failback on use_logd yes debug 1 logfile /var/log/hb.log debugfile /var/log/heartbeat-debug.log respawn hacluster /usr/lib/heartbeat/ipfail
peravaunu:~#
Seuraavaksi luodaan klusteriin salasana, jonka tietävät laitteet voivat pysyä klusterin jäseninä. Avaimen täytyy olla siis jokaisessa klusterin laitteessa sama.
majakka:~# apt-get install xsel majakka:~# dd if=/dev/urandom count=128 bs=1 2>&1 | md5sum | cut -b-32 7ecac2a140791d4fe291ee3b72d08ffd majakka:~# pico /etc/ha.d/authkeys
auth 1 1 md5 7ecac2a140791d4fe291ee3b72d08ffd
majakka:~# chmod 500 /etc/ha.d/authkeys majakka:~#
peravaunu:~# pico /etc/ha.d/authkeys
auth 1 1 md5 7ecac2a140791d4fe291ee3b72d08ffd
peravaunu:~# chmod 500 /etc/ha.d/authkeys
Lopuksi määritellään klusteroitavat palvelut ja niiden toiminta. Ensimmäisenä otetaan WWW-palvelu pois päältä.
majakka:~# invoke-rc.d lighttpd stop Stopping web server: lighttpd. majakka:~# update-rc.d -f lighttpd remove Removing any system startup links for /etc/init.d/lighttpd ... /etc/rc0.d/K20lighttpd /etc/rc1.d/K20lighttpd /etc/rc2.d/S20lighttpd /etc/rc3.d/S20lighttpd /etc/rc4.d/S20lighttpd /etc/rc5.d/S20lighttpd /etc/rc6.d/K20lighttpd majakka:~# pico /etc/ha.d/haresources ---- majakka 192.168.20.30 lighttpd ---- majakka:~#
peravaunu:~# invoke-rc.d lighttpd stop Stopping web server: lighttpd. peravaunu:~# update-rc.d -f lighttpd remove Removing any system startup links for /etc/init.d/lighttpd ... /etc/rc0.d/K20lighttpd /etc/rc1.d/K20lighttpd /etc/rc2.d/S20lighttpd /etc/rc3.d/S20lighttpd /etc/rc4.d/S20lighttpd /etc/rc5.d/S20lighttpd /etc/rc6.d/K20lighttpd peravaunu:~# pico /etc/ha.d/haresources ---- majakka 192.168.20.30 lighttpd ---- peravaunu:~#
Yhteensopivuuden lisäämiseksi pitää ottaa järjestelmään seuraava asetus käyttöön
majakka:~# cp /etc/sysctl.conf /etc/sysctl.conf.bak majakka:~# echo "kernel.core_uses_pid = 1" >> /etc/sysctl.conf majakka:~# sysctl -p kernel.core_uses_pid = 1 majakka:~#
peravaunu:~# cp /etc/sysctl.conf /etc/sysctl.conf.bak peravaunu:~# echo "kernel.core_uses_pid = 1" >> /etc/sysctl.conf peravaunu:~# sysctl -p kernel.core_uses_pid = 1 peravaunu:~#
Lopuksi käynnistetään heartbeat uudestaan ja tutkitaan järjestelmän toimivuutta.
majakka:~# invoke-rc.d heartbeat restart Stopping High-Availability services: Done. Waiting to allow resource takeover to complete: Done. Starting High-Availability services: 2009/04/02_17:10:00 INFO: Resource is stopped Done. majakka:~#
peravaunu:~# invoke-rc.d heartbeat restart Stopping High-Availability services: Done. Waiting to allow resource takeover to complete: Done. Starting High-Availability services: 2009/04/02_17:10:03 INFO: Resource is stopped Done. peravaunu:~#
Ennen testaamista, lisätään palvelulle sisältöä eli laitetaan sivu näkyviin.
majakka:~# mv /var/www/index.lighttpd.html /var/www/old.index.html majakka:~# echo "Tämä on $(uname -n)" > /var/www/index.html majakka:~#
peravaunu:~# mv /var/www/index.lighttpd.html /var/www/old.index.html peravaunu:~# echo "Tämä on $(uname -n)" > /var/www/index.html peravaunu:~#
Testaamista ja lisää testaamista... selaimella osoitteeseen http://192.168.20.30/
Edellisen klusterin ongelma on se, ettei niiden välillä ole muuta kuin heartbeat-yhteys. Jos klusteroidulla palvelulla tehdään sellaista, joka vaikuttaa järjestelmän kansio- ja tiedostorakenteeseen, se ei ole automaattisesti molemmilla palvelimilla sama. Tähän täydyy tehdä erillinen rajapinta, joka seuraavassa ratkaisussa on mahdollisimman reaaliaikainen. Lisäksi järjestelmään pitää lisätä uusi osio, jossa jaettava data tulee sijaitsemaan.
Rajapinta on toteutettu DRBD-tekniikalla, joka käytännössä on kuin RAID 1, mutta yhteys on verkon yli. Aloitetaan rakentaminen asentamalla tarvittavat paketit.
apt-get install drbd8-modules-2.6.26-1-686 drbd8-utils mysql-server
Lisätään levy ja tehdään sille osio. Sama operaatio molemmille koneille. Alla esimerkki perävaunusta.
peravaunu:~# fdisk -l Disk /dev/hda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x0003ded7 Device Boot Start End Blocks Id System /dev/hda1 * 1 998 8016403+ 83 Linux /dev/hda2 999 1044 369495 5 Extended /dev/hda5 999 1044 369463+ 82 Linux swap / Solaris Disk /dev/hdb: 536 MB, 536870912 bytes 16 heads, 63 sectors/track, 1040 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Disk identifier: 0x00000000 Disk /dev/hdb doesn't contain a valid partition table peravaunu:~# fdisk /dev/hdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xa90e7961. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. The number of cylinders for this disk is set to 1040. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1040, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-1040, default 1040): Using default value 1040 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. peravaunu:~# fdisk -l Disk /dev/hda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x0003ded7 Device Boot Start End Blocks Id System /dev/hda1 * 1 998 8016403+ 83 Linux /dev/hda2 999 1044 369495 5 Extended /dev/hda5 999 1044 369463+ 82 Linux swap / Solaris Disk /dev/hdb: 536 MB, 536870912 bytes 16 heads, 63 sectors/track, 1040 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Disk identifier: 0xa90e7961 Device Boot Start End Blocks Id System /dev/hdb1 1 1040 524128+ 83 Linux peravaunu:~#
Muokataan drbd:n käyttämää konfiguraatiotiedostoa. Tämän tiedoston tulee olla täysin samanlainen molemmissa koneissa, eli tässä tapauksessa majakassa ja perävaunussa. Seuraavassa esimerkki perävaunusta.
peravaunu:/etc# invoke-rc.d drbd stop peravaunu:/etc# mv drbd.conf drbd.conf.bak peravaunu:/etc# pico drbd.conf
global { minor-count 1; } resource mysql { protocol C; on majakka { device /dev/drbd0; disk /dev/hdb1; address 192.168.20.10:7788; meta-disk internal; } on peravaunu { device /dev/drbd0; disk /dev/hdb1; address 192.168.20.20:7788; meta-disk internal; } disk { on-io-error detach; } net { max-buffers 2048; ko-count 4; } syncer { rate 10M; al-extents 257; } startup { wfc-timeout 0; degr-wfc-timeout 120; } }
peravaunu:/etc# invoke-rc.d drbd start
Tehdään drbd:n resurssi, joka on molemmissa koneissa sama. Erona on se, että majakka on ensisijainen eli johtaa aluksi kirjoittamista.
peravaunu:/etc# drbdadm create-md mysql peravaunu:/etc# watch -n 1 cat /proc/drbd
majakka:/etc# drbdadm create-md mysql
majakka:/etc# drbdadm -- --overwrite-data-of-peer primary mysql
majakka:/etc# watch -n 1 cat /proc/drbd
majakka:/etc# mkfs.ext3 -L mysql /dev/drbd0
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=mysql
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
131072 inodes, 524076 blocks
26203 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
64 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
majakka:/etc#
Seuraavaksi tehdään itse jaettava kansio. Se mountataan osaksi majakka-koneen tiedostojärjestelmää ja MySQL ohjataan käyttää kyseistä kansiota.
majakka:/etc# mkdir /mnt/drbd-0 majakka:/etc# mount /dev/drbd0 /mnt/drbd-0/ majakka:/etc# cd /var/lib/ majakka:/etc/mysql# invoke-rc.d mysql stop Stopping MySQL database server: mysqld. majakka:/var/lib# cp -pr mysql /mnt/drbd-0/ majakka:/var/lib# cd /mnt/drbd-0/mysql majakka:/mnt/drbd-0/mysql# ls ---- majakka:/mnt/drbd-0/mysql# cd /etc/mysql/ majakka:/etc/mysql# pico my.cnf ---- datadir = /mnt/drbd-0/mysql ----
peravaunu:/etc/mysql# mkdir /mnt/drbd-0 peravaunu:/etc/mysql# invoke-rc.d mysql stop Stopping MySQL database server: mysqld. peravaunu:/etc/mysql# pico my.cnf ---- datadir = /mnt/drbd-0/mysql ----
Varmistetaan, että MySQL ei lähde käynnistyksessä päälle. Sitä kontrolloi tästä eteenpäin heartbeat. Sama temppu molemmille koneille. Esimerkki majakasta.
majakka:/etc/mysql# update-rc.d -f mysql remove Removing any system startup links for /etc/init.d/mysql ... /etc/rc0.d/K21mysql /etc/rc1.d/K21mysql /etc/rc2.d/S19mysql /etc/rc3.d/S19mysql /etc/rc4.d/S19mysql /etc/rc5.d/S19mysql /etc/rc6.d/K21mysql
Jotta MySQL voidaan käynnistää, tulee alla olevan tiedoston debian.cnf olla molemmilla koneilla sama. Tämä siksi, että koneet käyttävät samaa tietokantaa.
majakka:/etc/mysql# cat debian.cnf # Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = debian-sys-maint password = yoh1c2Zfvrw3jOWK socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] user = debian-sys-maint password = yoh1c2Zfvrw3jOWK socket = /var/run/mysqld/mysqld.sock basedir = /usr
peravaunu:/etc/mysql# cat debian.cnf # Automatically generated for Debian scripts. DO NOT TOUCH! [client] host = localhost user = debian-sys-maint password = yoh1c2Zfvrw3jOWK socket = /var/run/mysqld/mysqld.sock [mysql_upgrade] user = debian-sys-maint password = yoh1c2Zfvrw3jOWK socket = /var/run/mysqld/mysqld.sock basedir = /usr
Lopuksi muokataan heartbeattia. Erittäin tärkeä asia tässä tapauksessa on asetus auto_failback off. Asetuksella varmistetaan, ettei vikatilanteessa vastuun siirtyessä majakalta perävaunulle, se majakan palaudutta siirry takaisin. Näin syntyisi ristiriita siitä, että missä sijaitsee viimeisin tietokanta. Alla olevat muutokset ovat molemmilla koneilla täysin samat, lukuun ottamatta ucast eth0 192.168.20.10 asetusta.
majakka:/etc/mysql# invoke-rc.d heartbeat stop Stopping High-Availability services: Done. majakka:/etc/mysql# cd /etc/ha.d/ majakka:/etc/ha.d# cat ha.cf
node majakka node peravaunu keepalive 2 warntime 5 deadtime 10 initdead 60 ucast eth0 192.168.20.10 ping 192.168.20.1 auto_failback off use_logd yes debug 1 logfile /var/log/hb.log debugfile /var/log/heartbeat-debug.log respawn hacluster /usr/lib/heartbeat/ipfail
majakka:/etc/ha.d# pico haresources ---- majakka 192.168.20.30 drbddisk::mysql Filesystem::/dev/drbd0::/mnt/drbd-0::ext3::defaults lighttpd mysql ---- majakka:/etc/ha.d# invoke-rc.d heartbeat start
Sitten testaamaan. Perinteinen vikaselvitys ja toimintojen kartoitus, eli tarkistetaan lokit, prosessit ja portit. Esiin tulevia ongelmia on aivan varmasti ainakin seuraava Split-Brain detected, dropping connection!. Tämä on ongelma, joka juontaa juurensta verkon yli tehtävään raidiin. Verkkoyhteys katkeaa, eli vastaa tilannetta, jossa kovalevyn datajohto irroitetaan kesken siirron. Ratkaisu tähän löytyy tästä linkistä.
Jos edellä mainittu ongelma ilmentyy, se poistetaan seuraavilla komennoilla.
peravaunu:~# invoke-rc.d heartbeat stop peravaunu:~# drbdadm -- --discard-my-data connect mysql peravaunu:~# drbdadm get-gi mysql peravaunu:~# cat /proc/drbd peravaunu:~# invoke-rc.d heartbeat start
majakka:~# invoke-rc.d heartbeat stop majakka:~# drbdadm connect mysql majakka:~# drbdadm get-gi mysql majakka:~# cat /proc/drbd majakka:~# drbdadm invalidate mysql majakka:~# drbdadm primary mysql majakka:~# invoke-rc.d heartbeat start
Perusklusteroinnin on se, että yksi osapuoli on aktiivinen ja loput jäsenet ovat reservissä. Laitteiden käyttöaste pienenee, koska vikojen esiintyminen saattaa olla hyvinkin harvinaista. Reservissä olevat laitteet kuluttavat turhaan sähköä ollessaan niin sanotusti joutokäynnillä. Pitää siis pystyä tehostamaan palvelinkokonaisuuden tehokkuutta.
Kuormantasaaja on laite, jolla voidaan jakaa palvelimille tulevaa kuormaa. Tässä tehtävässä tullaan käyttämään LVS-projektin työkaluja ja ohjelmistoja. Tehtävä lähtee liikkeelle asentamalla tarvittavat ohjelmistot. Ensimmäisenä yksinkertaisin mahdollinen kuormantasausesimerkki:
balancer:~# apt-get install ipvsadm
balancer:~# cd /etc/network
balancer:/etc/network# ifdown eth0
balancer:/etc/network# pico interfaces
----
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.20.30
netmask 255.255.255.0
gateway 192.168.20.1
auto eth0:0
iface eth0:0 inet static
address 192.168.20.40
netmask 255.255.255.255
----
balancer:/etc/network# ifup eth0
----
balancer:/etc/network# ifup eth0:0
----
balancer:/etc/network# ipvsadm -A -t 192.168.20.40:80
balancer:/etc/network# ipvsadm -a -t 192.168.20.40:80 -r 192.168.20.10
balancer:/etc/network# ipvsadm -a -t 192.168.20.40:80 -r 192.168.20.20
balancer:/etc/network# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.20.40:80 wlc
-> 192.168.20.10:80 Route 1 0 0
-> 192.168.20.20:80 Route 1 0 0
balancer:/etc/network#
majakka:~# cd /etc/network
majakka:/etc/network# pico interfaces
----
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.20.10
netmask 255.255.255.0
gateway 192.168.20.1
iface lo:0 inet static
address 192.168.20.40
netmask 255.255.255.255
up sysctl -p > /dev/null
----
majakka:/etc/network# ifup lo:0
peravaunu:~# cd /etc/network
peravaunu:/etc/network# pico interfaces
----
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.20.20
netmask 255.255.255.0
gateway 192.168.20.1
iface lo:0 inet static
address 192.168.20.40
netmask 255.255.255.255
up sysctl -p > /dev/null
----
peravaunu:/etc/network# ifup lo:0
Tässä tehtävässä ei tarvita heartbeat-ohjelmaa mihinkään, joten poistetaan se käytöstä. Lisäksi käynnistetään lighttpd, joka toimii palvelujen tarjoajana.
peravaunu:~# invoke-rc.d heartbeat stop Stopping High-Availability services: Done. peravaunu:~# invoke-rc.d lighttpd start Starting web server: lighttpd. peravaunu:~#
majakka:~# invoke-rc.d heartbeat stop Stopping High-Availability services: Done. majakka:~# invoke-rc.d lighttpd start Starting web server: lighttpd. majakka:~#
Seuraavaksi tehdään sisältöä WWW-palvelun tarjottavaksi. Tämän sisällön perusteella kuormantasaaaja päättää, kenelle tuleva kuorman siirtää.
majakka:~# cd /var/www/ majakka:/var/www# echo "Testisivu" > test.html
peravaunu:~# echo "Testisivu" > /var/www/test.html
Lopuksi pitää muokata koneiden ARP- ja IP-asetuksia.
balancer:/etc/default# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf balancer:/etc/default# sysctl -p
majakka:~# echo "net.ipv4.conf.eth0.arp_ignore = 1" >> /etc/sysctl.conf majakka:~# echo "net.ipv4.conf.eth0.arp_announce = 2" >> /etc/sysctl.conf majakka:~# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf majakka:~# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf majakka:~# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf majakka:~# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf majakka:~# sysctl -p net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
peravaunu:~# echo "net.ipv4.conf.eth0.arp_ignore = 1" >> /etc/sysctl.conf peravaunu:~# echo "net.ipv4.conf.eth0.arp_announce = 2" >> /etc/sysctl.conf peravaunu:~# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf peravaunu:~# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf peravaunu:~# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf peravaunu:~# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf peravaunu:~# sysctl -p net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
Sitten testaamaaan.
balancer:~# apt-get install ldirectord-2 ---- balancer:/etc/ha.d# mkdir conf balancer:/etc/ha.d# cd conf balancer:/etc/ha.d/conf# pico ldirectord.cf
checktimeout=10 checkinterval=5 autoreload=no quiescent=no virtual = 192.168.20.40:80 protocol = tcp scheduler = rr real = 192.168.20.10:80 gate real = 192.168.20.20:80 gate request = "test.html" receive = "Testisivu" checktype=negotiate service=http
balancer:/etc/ha.d/conf# invoke-rc.d ldirectord start balancer:/etc/ha.d/conf# watch -n 1 ipvsadm -Ln ---- Every 1,0s: ipvsadm -Ln Tue Apr 7 18:41:47 2009 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 213.250.86.90:80 rr -> 213.250.86.82:80 Route 1 0 2 -> 213.250.86.81:80 Route 1 0 0
Ja testaamaan...