JAH180 - Linux Server - Workshop

Näkymät
Syotec Wiki
Loikkaa: valikkoon, hakuun

Sisällysluettelo

Linux

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.

Linuxin perusrakenne

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!

Sisällysluetteloon


NFS-palvelin

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ä!

NFS-palvelimen turvallisuusparannuksia

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!

Sisällysluetteloon


Varmuuskopiointiesimerkki

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!

Sisällysluetteloon


Siirtonopeuden testaussovellus

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!

Sisällysluetteloon


Perusklusteri

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.


Perusklusteri


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.

Verkkoasetukset

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

Heartbeat ja Lighttpd

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/


Sisällysluetteloon


Perusklusteri + SQL

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.


Perusklusteri ja SQL


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ä. Lisätietoa edellä tehdystä 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



Sisällysluetteloon


Kuormantasausklusteri

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.


Kuormantasaus


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.

Kuormantasaus ja failover

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...


Sisällysluetteloon


Klusteri kuormantasaajilla

Kuormantasaus



Sisällysluetteloon


Henkilökohtaiset työkalut