Článek volně navazuje na mnou nedávno publikovaný článek o clusterech. Budu však tentokrát konkrétnější a pokusím se přímo popsat své řešení. Nechci se pouštět do polemiky, zda je toto řešení ideální či nikoliv, pouze jej popíši.
Co potřebujete
- Fungující síť. Bez ní samozřejmě nelze cluster vytvořit. Není nutné připojení do internetu, ale pokud je k dispozici, je vše samozřejmě jednodušší.
- Vhodnou linuxovou distribuci. Já jsem použil Debian Lenny, ale můžete použít libovolnou distribuci, u které si raději předem ověříte, že má všechny potřebné balíky programů k dispozici.
- Jeden počítač jako server (master clusteru). V mém řešení je lepší použít výkonnější počítač.
- Jeden až n počítačů jako pracovní stanice. To jsou počítače, u kterých sedí uživatelé clusteru.
- Jeden až m počítačů jako uzly (node) clusteru.
- Nejméně jeden, ale raději dva switche.
- Volitelně diskové pole pro ukládání dat.
Obrázek 1 – Schéma možného zapojení clusteru
Konečná topologie mého zapojení je patrná z následujícího obrázku. Zkoušel jsem několik variant, ale tato se ukázala jako nejlepší. Použití switche 2 urychlilo komunikaci mezi masterem a nody asi o 20 %.
Nastavení serveru a uživatelských počítačů
Jak server, tak uživatelské počítače mají nainstalován běžný Debian Lenny. Vyplatí se nainstalovat si nejprve server, pak jeden uživatelský počítač a jeden node. Ostatní uživatelské počítače a nody si pak vytvoříte například pomocí překopírování image nebo třeba pomocí klonování.
Pro lepší interakci uživatelských počítačů a serveru jsem použil několik řešení:
- LDAP pro sdílení hesel
- NFS pro sdílení domácích adresářů
- XDMCP pro pohodlné grafické přihlašování k serveru
- SSH přihlášení pomocí klíčů
Samozřejmě ani jedno z řešení není nutné použít, ale všechna dohromady dělají práci jednodušší a pohodlnější. Pro další text předpokládejme adresu serveru 192.68.0.1, uživatelských počítačů 192.168.0.10, 192.168.0.11 … a adresy uzlů 192.168.0.200, 192.168.0.201… Rovněž je vhodné naeditovat soubor /etc/hosts a doplnit do něj řádky:
192.168.0.1 cluster.domena.cz cluster 192.168.0.201 nod1.domena.cz nod1 192.168.0.202 nod2.domena.cz nod2 192.168.0.203 nod3.domena.cz nod3 192.168.0.204 nod4.domena.cz nod4 192.168.0.205 nod5.domena.cz nod5
a tento soubor nakopírovat na všechny uzly. Pak můžete snadno použít například ssh nod1.
LDAP
Použití LDAP není samozřejmě nutné, ale významně vám zjednoduší správu uživatelských účtů.
Pokud můžete použít již existující LDAP server, máte vše jednodušší. Já jsem si musel založit LDAP na serveru a nakonfigurovat všechny počítače jako LDAP klienty. Použil jsem variantu OpenLDAP. Návod pro instalaci můžete vzít na serveru Debian Clusters anebo ještě lépe na Debian Administration.
Zkontrolujte si zejména nastavení souboru /etc/ldap/ldap.conf (nebo např. /etc/openldap/ldap.conf podle distribuce), kde by mělo být něco jako:
BASE dc=server,dc=domena,dc=cz URI ldap//192.168.0.1:389/
dále nastavení v souboru /etc/nsswitch.conf, měl by obsahovat:
passwd: files ldap group: files ldap shadow: files ldap
a obsah souborů common-* v /etc/pam.d. Například soubor common-auth by měl obsahovat:
account sufficient pam_ldap.so account required pam_unix.so try_first_pass
Obrázek 2 – Počítače v clusteru, v pozadí nody, v popředí server a diskové pole.
NFS
Na serveru musíte nainstalovat balíky nfs-kernel-server nfs-common portmap a na klientech nfs-common portmap anebo odpovídající podle vaší distribuce. Na serveru upravíte soubor /etc/exports a doplníte do něj řádek:
/home 192.168.0.0/24(rw,no_root_squash,subtree_check)
a poté upravíte soubory /etc/fstab na klientských počítačích zhruba takto:
192.168.0.1:/home /home nfs acl,rw,user,exec 0 0
Samozřejmě můžete použít své parametry a pokud máte fungující DNS server také pravděpodobně uvedete namísto IP adresy DNS jméno serveru. Zrestartujte potřebné služby (portmap, nfs-common) a měli byste sdílet adresář ze serveru. Nezapomeňte, že toto připojení potlačí a znepřístupní všechny lokální adresáře nacházející se v adresáři /home na klientech. Další informace naleznete například na serveru Howtoforge.
XDMCP
Tento protokol zajistí vzdálené přihlašování k našemu serveru. Musíte jej na serveru povolit, ať již používáte KDM anebo GDM. Například pro KDM a KDE3 se jedná o soubor /etc/kde3/kdm/kdmrc, kde musíte zajistit nastavení následujících parametrů:
[Xdmcp] Enable=true Port=177 Willing=/etc/kde3/kdm/Xwilling
Obdobně pro Gnome musíte najít soubor gdm.conf umístěný různě dle distribuce (např. /etc/gdm/gdm.conf). Dále je třeba zajistit aby se v souboru Xaccess (bude se nacházet v /etc/X11/xdm nebo /etc/kde3/kdm nebo možná i jinde, dle distribuce) jako první nezakomentovaný parametr byla hvězdička a tak bylo povolené přihlášení k serveru odkudkoliv (pokud samozřejmě nemáte jiné přání).
Nastavení uživatelských počítačů je jednoduché. Můžete upravit soubor /etc/inittab přidáním řádku:
x:5:respawn:/usr/bin/X11/X -query 192.68.0.1
na konec souboru, což zajistí automatické přihlášení k serveru v grafickém režimu. Anebo to můžete vyřešit jako já a nic neupravovat. Oba správci přihlášení KDM i GDM obsahují v menu na úvodní obrazovce možnost Vzdálené přihlášení (Remote login), kterou lze zvolit a vybrat si server, ke kterému se přihlásíte. Výhoda tohoto řešení je, že můžete povolit vzdálené přihlášení i k jiným počítačům. Například já mám povolené přihlašování i k uzlům clusteru. Pokud někdo potřebuje spustit nějakou grafickou aplikaci, která by příliš zatížila server, domluví se s ostatními, že nemají po nějakou dobu používat některý z uzlů a tuto aplikaci si tam rozběhne. Samozřejmě to vyžaduje komunikaci mezi uživateli a schopnost se dohodnout. Další výhodou tohoto řešení je, že se uživatel může přihlásit přímo k svému počítači a rozjet si potřebnou aplikaci tam. Vzhledem k tomu, že domovské adresáře jsou sdílené, nalezne na všech počítačích svá data na stejném místě. To na druhou stranu někdy vede k situaci, že se některý uživatel přihlásí k svému počítači místo k serveru a obviní mne, že si nemůže spustit nějaký program (který je nainstalován na serveru, ale ne na lokálním počítači). Ze stejného důvodu rovněž doporučuji zakázat vypnutí a restart serveru z menu okenních manažerů běžnými uživateli, ušetříte mnoho nervů sobě i ostatním.
Kvůli problémům se zvukem při použití XDMCP je také nutné lokální přihlášení, pokud si uživatelé chtějí pustit nějakou aplikaci vyžadující zvuk. Naproti tomu, pokud si chtějí uživatelé pustit hudbu při vzdáleném přihlášení, mohou si v textové konzoli spustit mp3 soubory pomocí programu mpg123 anebo přehrát CD pomocí nějakého textového přehrávače (např. cdplay). To navíc nezatěžuje server.
Co se zatížení serveru týká, jak jsme si ověřili že aplikace, která nejvíc zatěžuje server, jsou flashové animace ve WWW prohlížečích. Podporu flashe ze serveru však odstranit nemohu, protože některé WWW aplikace důležité pro výzkum tuto podporu vyžadují.
obrázek 3 – Clusterové nody a switch číslo 2
SSH
Následující postup umožňuje pohodlné přihlašování uživatelů mezi jednotlivými počítači clusteru bez nutnosti zadávání hesla. Jedná se tedy vlastně o bezpečnostní díru, protože pokud se někdo dostane k libovolnému uživatelskému účtu na libovolném počítači, dostane se tak i na počítače ostatní, ale vzhledem k použité topologii by muselo de facto jít o útok, kdy se útočník k počítači dostane fyzicky, a pak stejně obvykle nepomůže sebelepší zabezpečení.
Tento postup je nutné zopakovat pro všechny uživatelské účty nebo použít skript popsaný na stránkách Debian Clusters. Nejprve vytvoříme na serveru v domovském adresáři klíč pomocí příkazu ssh-keygen. Místo zadání hesla dvakrát stiskneme Enter. Tento klíč je vytvořen v adresáři ./.ssh. Přepneme se do tohoto adresáře a vytvoříme klíč pro přihlášení bez hesla příkazem cat id_rsa.pub >> authorized_keys2. Z bezpečnostních důvodů je ještě dobré nastavit práva tak, aby se nám k našim klíčům nikdo nedostal příkazem chmod 600 *. Vzhledem k tomu, že domovské adresáře jsou pomocí NFS sdílené mezi všemi uzly nodu, je možné se nyní přihlašovat bez hesla například ssh nod1.
Tento způsob můžeme samozřejmě použít i pro přihlašování mezi clusterem a uživatelskými počítači, které nesdílí domácí adresáře přes NFS. Stačí pouze překopírovat do adresáře .ssh v domovských adresářích soubory id_dsa a id_dsa.pub. Též je možné použít příkaz:
ssh-copy-id -i ~/.ssh/id_dsa.pub uzivatel@pocitac.nekde.cz
pro zkopírování klíče na vzdálený počítač. Pokud nechcete z bezpečnostních důvodů bezheslové přihlašování používat, zadejte při vytváření klíčů heslo. Pak budete k zadání vyzváni vždy když se budete chtít přihlásit přes ssh. Je možné taky nejprve spustit příkaz ssh-add, který klíč zavede do paměti a heslo tak zadáte jen jednou. Tím se však dostanete do stejné situace, jako byste heslo neměli, a někteří uživatelé proto tuto možnost rovněž odmítají.
Zajímavá možnost je nainstalovat si balík ClusterSSH. Viz článek na rootu. Pak stačí nastavit soubor .csshrc v domovském adresáři na tvar obdobný následujícímu:
clusters = nody nody = nod1 nod2 nod3 nod4 nod5
Pokud nyní zadáte cssh nody otevře se vám tolik oken, kolik nodů máte zadaných v předchozím souboru, a společný příkazový řádek. Příkazy v něm zapsané se provádí na všech připojených nodech. Toto řešení je ovšem třeba používat s rozvahou, protože jakákoliv chyba se samozřejmě násobí.
Obrázek 4 – startovní stránka Ganglie
Sestavení clusteru
Základní instalace serveru a nodů
Pro správnou funkci clusteru je třeba upravit jádro u serveru i nodů pomocí dvou patchů, jak je popsáno na v dokumentu Adding Performance Counters to the Kernel a rovněž přeložit podporu pro paralelní virtuální souborový systém, jak je popsáno v dokumentu Adding support for PVFS2 to the Kernel. Jádro je samozřejmě nutné přeložit. Protože oba dokumenty jsou už staršího data, doporučuji stáhnout si nejnovější balíky a přečíst si u nich dokumentaci.
Rovněž doporučuji nainstalovat na nody podporu pro již popsané LDAP, NFS a SSH, bude se vám tak s nody lépe pracovat. Předpokládám, že přímo u nodů pracovat nebudete, ale může se stát, že budete některou úlohu potřebovat rozjet přímo na konkrétním nodu jak jsem již popsal výše. Uživatelé si pouze musí uvědomit, že stejná data mají jak na svém počítači, tak na serveru, tak na nodech. Takže není dobrý nápad zkoušet jeden soubor editovat současně na více počítačích.
Programy pro rozdělování úloh na nody
Nainstalujte si programy Torque a Maui podle návodu z Debian Clusters. Jak jsem psal výše, návod je staršího data, proto není od věci přečíst si pro jistotu dokumentaci přibalenou k programům. Dobrý manuál pro Torque je například na Cluster resources
Na serveru Debian Clusters naleznete rovněž dobrý popis užívání těchto programů. Nebudu zde popisovat instalaci ani užívání, protože bych pouze opakoval postup popsaný na Debian Clusters.
Obrázek 5 – Ganglia, vytížení za minulý týden
Ganglia
Je vynikající monitorovací nástroj, pomocí kterého můžete velmi dobře sledovat vytížení jednotlivých uzlů clusteru. Na jednotlivé uzly nainstalujte program Ganglia Monitoring Daemon (gmond). Pokud vás stejně jako mne zajímá i vytížení serveru, nainstalujte jej i na server. Na server pak ještě nainstalujte program Ganglia Meta Daemon (gmetad). Nyní na každém počítači na kterém běží program gmond naeditujte soubor /tec/gmond.conf a jeho obsah nahraďte následujícím (s vašimi úpravami):
name "Nas kluster" owner "Vlastník" mcast_channel 239.2.11.72 mcast_port 8649 mcast_if eth2 num_nodes 5 setuid ganglia
Věnujte zejména pozornost správnému nastavení síťového rozhraní (eth0, eth1, eth2…). Dále na serveru upravte soubor /etc/gmetad.conf následujícím způsobem:
data_source "server" localhost data_source "nod1" 192.168.0.201 data_source "nod2" 192.168.0.202 data_source "nod3" 192.168.0.203 data_source "nod4" 192.168.0.204 data_source "nod5" 192.168.0.205 gridname "Nas kluster" setuid_username "ganglia"
Spusťe na všech počítačích, kde je třeba, službu gmond příkazem /etc/init.d/gmond start a na serveru navíc /etc/init.d/gmetad/start. Nyní se již můžete pokochat pomocí webového prohlížeče na adrese http://server.nekde.cz/ganglia. Mně stačí se připojit z kteréhokoliv počítače k serveru a zadat http://localhost/ganglia a obdržím výsledek jako na obrázku číslo 4. Pak si mohu dát plný výpis například za týden jako na obrázku číslo 5 a vidím, že cluster nebyl tento týden (kromě jedné úlohy) zatížen.
Závěr
Je mi jasné, že mnozí z čtenářů sezdají mé řešení jako neideální, složité, nebezpečné, primitivní atd. Přesto si myslím, že by někoho mohlo alespoň navést k cíli – vytvoření vlastního clusteru. Nám tento cluster již úspěšně a spolehlivě funguje více než půl roku.
Rozhodně se nejedná o komplexní návod, popsal jsem pouze místa, kde se mé řešení odchyluje od řešení uvedených v odkazech (a snad tak čtenáři ušetřím pokusy) anebo klíčová místa.