Shib2IdpCluster

= Shibboleth 2.1 IdP klaszterezése =

Klaszter terminológia

 * Node
 * egy, a szolgáltatást futtató csomópont


 * Klaszter
 * kívülről nem megkülönböztethető nodeok összessége


 * Szerver
 * fizikai (vagy virtuális) gép, amely a nodeokat futtatja (egy gépen lehet több node is)


 * Failover
 * amennyiben egy csomópont kiesik, egy másik csomópont automatikusan és transzparensen átveszi a munkáját


 * High availability
 * amennyiben egy csomópont kiesik, nem veszhet el adat, a kliensek nem veszik észre a kiesést


 * Load balancing
 * a terhelés elosztása az egyes csomópontok között

Terracotta
A Shibboleth2 IdP a Terracotta szoftvert támogatja a klaszter építéséhez. A Terracotta képes arra, hogy a különböző nodeokon futó Shibboleth IdP-k között a session és egyéb információkat (például artifact map, authnrequest replay map, stb.) szinkronban tartsa.

A Terracotta kliens-szerver architektúrában működik. A kliensek a JVM-ben futó instrumentált osztályokból, osztálybetöltőből és zármenedzserből állnak, a szerverek pedig biztosítják a klaszterezett adatok perzisztens tárolását és a csomópont-független elérést. Amennyiben egy JVM-ben szükség van egy távoli JVM-ben létrehozott klaszterezett objektumra, akkor ezt az első elérésnél a Terracotta kliens elkéri a távoli szervertől. Emiatt teljesítmény okokból érdemes az azonos felhasználóhoz tartozó kéréseket mindig ugyanahhoz a csomóponthoz küldeni. A HTTP-Artifact profil használata esetén ez nem garantálható, ezért ajánlott a HTTP-Post profil használata.

Shibboleth IdP és Terracotta
A Shibboleth IdP-ben a következő adatok klaszterezését kell megvalósítani: artifact, session, replay, transientId, loginContext. Ezeket az adatokat a Shibboleth StorageService tárolja.

A Terracotta telepítéséhez és beállításához ez a wikioldal nyújt segítséget.


 * 1) Terracotta letöltése, kicsomagolása
 * 2) tűzfalbeállítások (TCP/9510 kliens->szerver és TCP/9530 szerver->szerver portok engedélyezése)
 * 3) minden csomóponton azonos JVM verziót használjunk a Terracotta szerverben és kliensben is
 * 4) tim-vector integrációs modul telepítése
 * 5) Shibboleth IdP-hez Terracotta konfiguráció szerkesztése Shib2IdpTerracottaConfiguration alapján
 * 6) * csomópontok definiálása (szervernév, hosztnév, logok helye)
 * 7) terracotta szerver futtatása
 * 8) boot jar készítése (Terracotta kliens)
 * 9) boot jar használata a webkonténer JVM-nél
 * 10) FONTOS: JVM frissítés után újra kell generálni a boot jart!

JVM beállítások:

2.1.2 -es IdP verzióhoz a következő konfigurációs rész is szükséges az instrumented-classes szekcióba:

A Terracotta log- és adatfájljainak /var alatti tárolását a következőképpen végezhetjük el:

Könyvtárak létrehozása megfelelő jogosultságokkal

Terracotta tc-config.xml -ben a data,stats,logs opciók átírása értelem szerint.

Magas rendelkezésre állás beálítása
A következő konfigurációs részt a tc-config.xml elején kell elhelyezni. Ez engedélyezi a kliens-szerver és szerver-szerver újrakapcsolódást, ezzel kivédve az apró hálózati kimaradások okozta problémákat. Sajnos mindkét beállítás megnöveli a failover idejét.

Debian initszkript a Terracotta szerver indításához

 * /etc/init.d/terracotta néven mentsük el root tulajdonossal a következő szkriptet, majd adjunk rá execute jogot:


 * A konfiguráció az /etc/default/terracotta fájlban található:

Monitoring (JMX, Munin, Nagios)

 * JMX: Java Management Extensions
 * A Terracotta támogatja a JMX-en keresztüli monitorozást és bevatkozást
 * alapértelmezésképp jmxmp protokollon keresztül
 * másoljuk be a jmxremote_optional.jar -t a terracotta lib/ könyvtárából egy üres könyvtárba
 * indítsuk a jconsole-t a következő paranccsal: jconsole -J-Djava.endorsed.dirs=.
 * kapcsolódjunk a service:jmx:jmxmp://:9520 url-re
 * usernév/jelszavas authentikáció esetén rmi protokollon keresztül is elérhetjük a tc szervert
 * Check_jmx szkriptek nagioshoz és muninhoz

Fontosabb Terracotta MBean attribútumok

 * org.terracotta:type=Terracotta Server,name=DSO
 * LiveObjectCount (int)
 * ClientLiveObjectCount (string)
 * org.terracotta.internal:type=DSO Client,name=Client Transactions,subsystem=Transactions,clients=Clients,node=...
 * AvgModifiedObjectsPerTransaction (int)
 * AvgNewObjectsPerTransaction (int)
 * ObjectCreationRateBySecond (int)
 * ReadTransactionCount (int)
 * WriteTransactionCount (int)
 * org.terracotta.internal:type=Terracotta Server,name=Terracotta Server
 * Active (bool)
 * PassiveStandby (bool)
 * PassiveUninitialized (bool)
 * HealthStatus (String)
 * State (string)
 * StartTime (timestamp)
 * Shutdownable (bool)

Munin plugin a terracotta szerver memóriahasználatának méréséhez
A check_jmx csomagban található jmx_ munin plugin mellé másoljuk oda a jmxremote_optional csomagot (sun.com-ról letölthető), majd végezzük el a következő módosítást:

Ezután a következő konfigurációt hozzuk létre terracotta_objectcount.conf néven:

Majd symlinkeljük be a jmx_ szkriptet a munin pluginok közé jmx_terracotta_objectcount néven, és adjuk meg a munin-node.conf -ban a jmx hozzáférési paramétereket:

Tomcat monitorozása muninnal
A Tomcat JVM JMX elérésének engedélyezéséhez az /etc/default/tomcat5.5 fájlban a következő plusz kapcsolókat kell megadni:

Ezután a 8083 -as porton jmxrmi protokollon keresztül lehet elérni a menedzsment ágenst. A check_jmx pluginhoz a következő környezeti beállítást kell hozzárendelni az /etc/munin/plugin-conf.d/munin-node fájlban:

Log file flood
Az L2 újracsatlakozás engedélyezése esetén egy elvesztett kapcsolat után hiába áll helyre a helyes működés, a szerver szemetel a logba:

2009-06-24 14:48:38,304 [ConnectionEstablisher] WARN com.tc.net.protocol.transport.ClientMessageTransport - ConnectionID(0.0e84473d1e744f4db1d539db88633a30): Timeout of 10000 milliseconds occured 2009-06-24 14:48:39,305 [ConnectionEstablisher] INFO com.tc.net.protocol.transport.ClientMessageTransport - ConnectionID(0.0e84473d1e744f4db1d539db88633a30): Attaching new connection: [...]

Ez egy ismert probléma: http://jira.terracotta.org/jira/browse/CDV-1252 a javítás elkészült, azonban a 2.7.3 -ba még nem került be.

Workaround-ként ki lehet kapcsolni az l2 újracsatlakozást a konfigurációban. Ilyenkor azonban rövid hálózati megszakadás is teljes node újraindítást fog okozni.

Terracotta 3.2.1 ismert hibák
Még nincs :)

Troubleshooting

 * Mindig ellenőrizni kell a logfájlokat! Ha egy szerver folyton írja a logfájlját, az általában rossz jel és elárvult kliensre utal ("Could not find communication stack..." üzenet).
 * A teljes klaszter újraindítása után kötelező újraindítani a klienseket (Tomcat), ugyanis a Terracotta nem fogja engedni újra csatlakozni. Ezt egyébként a szerver logfájlban jelzi is.
 * Nem érdemes egyszerre indítani a két Terracotta szervert, annak könnyen összeakadás lehet a vége, ha nem tudnak dönteni egymás között.
 * ilyenkor az egyik szerver felszólítja a másik szervert a megállásra, ilyenkor azonban a diszken tárolt állapot megmarad, amit egy start parancs kiadása után nem hajlandó felhasználni a szerver processz.
 * a megoldás az initszkript 'restart' parancsa (vagy két egymás utáni start, ugyanis második kísérletre már hajlandó elindulni 'dirty' adatokkal is).
 * Az  parancs a teljes klaszter állapotát visszaadja (szerverek és kliensek is).
 * Ha egy probléma nem oldható meg csak az egyik szerver és a kliensek újraindításával, akkor a teljes klasztert újra kell indítani: mindkét szerver leállítása és a perzisztens adatok gondos törlése után egyesével újraindíthatóak a szerverek majd az aktív szerver indulása után a kliensek (Tomcat).

Kliens library

 * a Tomcat webkonténerben fut
 * a  fájlba logol
 * JVM váltáskor, frissítéskor újra kell generálni! Ezt a  szkripttel lehet megtenni, előtte törölni kell a   könyvtár tartalmát.

Szerver processz

 * külön processzként fut
 * a  fájlba logol
 * a  könyvtárban tárol saját adatokat, amit kézzel történő tiszta újraindítás előtt törölni kell

Nagios riasztások és megoldásuk

 * Túl kevés a kliens (client count is xxx)
 * OK: a Tomcat kliens megállt vagy megszakadt a kommunikáció a szerverrel.
 * Megoldás: a kliens listában nem szereplő Tomcat-et újra kell indítani.


 * Nincs passzív node (not enough passive node)
 * OK: az egyik Terracotta szerver épp adatot szinkronizál a másiktól és ezért  állapotban van.
 * Megoldás: pár percet érdemes várni, amíg a szinkronizáció befejeződik. Ha nem oldódik meg a probléma magától, akkor újra kell indítani a Terracotta szerver processzt.

= Adminisztrációs feladatok =
 * Nem elérhető egy node (node xxx is down)
 * OK: az egyik Terracotta szerver nem elérhető.
 * Megoldás: újra kell indítani.

JVM frissítése
A következő leírás meglehetősen az NIIF Intézet saját infrastruktúrájára specifikus, de talán más környezetekben is felhasználható.

Lépések összefoglalása

 * 1) Terheléselosztóból a frissítendő node-ot kivenni
 * 2) Tomcat, Terracotta leállítása a frissítendő node-on
 * 3) JVM beállítások (, ill. esetleg  ) elmentése. Ez fontos azért, mert bizonyos JVM upgrade-ek (legalábbis a múltban) felülírták a tanúsítvány tárat, és ez nehezen javítható hibához vezetett (pl. az LDAP-hoz nem tudott kapcsolódni az IdP)
 * 4) JVM frissítés
 * 5) Boot jar generálás
 * 6) (Ha megváltozott a jar): Tomcat konfigban a boot jar átírása az újra
 * 7) Ellenőrzés, hogy megváltozott-e a cacerts ($JAVA_HOME/lib/security/cacerts). Ha igen, akkor írjuk felül az elmentett változattal
 * 8) Terracotta, majd utána Tomcat indítás
 * 9) (Az LVS magától visszateszi a megjavuló klaszter node-ot, de erről nem árt meggyőződni)

Shell parancsok
ldir2:~# ipvsadm -d -t idp.niif.hu:8443 -r idp1.aai.niif.hu:8443 ldir2:~# ipvsadm -d -t idp.niif.hu:https -r idp1.aai.niif.hu:https ldir2:~# watch "ipvsadm -L -t idp.niif.hu:https && ipvsadm -L -t idp.niif.hu:8443"

idp1:~$ sudo /etc/init.d/tomcat6 stop idp1:~$ sudo /etc/init.d/terracotta stop idp1:~$ tar czf security.tgz /etc/java-6-openjdk/security idp1:~$ sudo aptitude safe-upgrade

idp1:~$ sudo env JAVA_HOME=/usr/lib/jvm/java-6-openjdk /usr/local/terracotta/platform/bin/make-boot-jar.sh \ -f /etc/shibboleth-idp/tc-config.xml idp1:~$ sudo vim /etc/default/tomcat6

idp1:~$ sudo /etc/init.d/terracotta start idp1:~$ sudo /etc/init.d/tomcat6 start