„Shib2IdpCluster” változatai közötti eltérés

Innen: KIFÜ Wiki
a (Nagios Terracotta szerver check)
(Nagios Terracotta szerver check)
214. sor: 214. sor:
 
#!/bin/sh
 
#!/bin/sh
  
 +
export TERRACOTTA_NODES="papigw.aai.niif.hu sandbox.aai.niif.hu"
 
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
 
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
 
export TC_HOME=/usr/local/terracotta-2.7.2
 
export TC_HOME=/usr/local/terracotta-2.7.2
 +
ACTIVE_NODES=""
 +
STANDBY_NODES=""
 +
CLUSTER_STATUS=""
  
OUTPUT=`$TC_HOME/bin/server-stat.sh`
+
function check_health() {
 +
    TC_HEALTH=`echo "$1" | awk "/$2.health/{print "'$2}'`
 +
    if [ "x$TC_HEALTH" = "xOK" ]; then
 +
        return 0
 +
    else
 +
        echo TERRACOTTA CRITICAL - node $2 down
 +
        exit 2
 +
    fi
 +
}
  
TC_HEALTH=`echo "$OUTPUT" | awk '/health/{print $2}'`
+
function check_one_active() {
TC_STATE=`echo "$OUTPUT" | awk '/state/{print $2}'`
+
    ACTIVE_NODES=`echo "$1" | awk '/ACTIVE-COORDINATOR/{print $1}' | sed 's/\.state://'`
 +
    ACTIVE_COUNT=`echo "$ACTIVE_NODES" | wc -l`
 +
    CLUSTER_STATUS="$CLUSTER_STATUS, active nodes: $ACTIVE_NODES"
  
 +
    if [ "0$ACTIVE_COUNT" -le 1 ]; then
 +
        return 0
 +
    else
 +
        echo TERRACOTTA CRITICAL - multiple ACTIVE nodes $CLUSTER_STATUS
 +
        exit 2
 +
    fi
 +
}
  
if [ "x$TC_HEALTH" = "xOK" ]; then
+
function check_one_standby() {
    echo "Terracotta OK - node state: $TC_STATE"
+
    STANDBY_NODES=`echo "$1" | awk '/PASSIVE-STANDBY/{print $1}' | sed 's/\.state://'`
    exit 0
+
    STANDBY_COUNT=`echo "$STANDBY_NODES" | wc -l`
else
+
    if [ "0$STANDBY_COUNT" -eq 1 ]; then
    echo "Terracotta CRITICAL - node state: $TC_STATE"
+
        CLUSTER_STATUS="$CLUSTER_STATUS, standby nodes: $STANDBY_NODES"
     exit 2
+
        return 0
fi
+
    else
 +
        echo TERRACOTTA CRITICAL - no STANDBY node $CLUSTER_STATUS
 +
        exit 2
 +
    fi
 +
}
 +
 
 +
function check_client_count() {
 +
    CLIENTCOUNT=`echo "$1" | awk '/clientcount/{print $2}'`
 +
    CLIENT_NODES=`echo "$1" | awk '/client.*address/{print $2}'`
 +
    CLUSTER_STATUS="$CLUSTER_STATUS, client nodes: $CLIENT_NODES"
 +
     if [ "0$CLIENTCOUNT" -eq 2 ]; then
 +
        return 0
 +
    else
 +
        echo TERRACOTTA WARNING - client count is $CLIENTCOUNT $CLUSTER_STATUS
 +
        exit 1
 +
    fi
 +
}
 +
 
 +
OUTPUT=`$JAVA_HOME/bin/java -jar ./terracotta-monitoring.jar $TERRACOTTA_NODES 2>/dev/null`
 +
 
 +
check_one_active "$OUTPUT"
 +
for i in $TERRACOTTA_NODES; do
 +
    check_health "$OUTPUT" "$i"
 +
done
 +
check_one_standby "$OUTPUT"
 +
check_client_count "$OUTPUT"
 +
 
 +
echo TERRACOTTA OK - cluster is running $CLUSTER_STATUS
 
</source>
 
</source>

A lap 2009. február 24., 11:53-kori változata

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 á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 a szerveren keresztül 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 tc-config.xml alapján
    • csomópontok definiálása (szervernév, hosztnév, logok helye)
  6. terracotta szerver futtatása
  7. boot jar készítése (Terracotta kliens)
  8. boot jar használata a webkonténer JVM-nél
  9. FONTOS: JVM frissítés után újra kell generálni a boot jart!

JVM beállítások:

 JAVA_OPTS="-Dtc.install-root=$TC_INSTALL_DIR \
           -Dtc.config=$SHIB_IDP_HOME/conf/tc-config.xml \
           -Xbootclasspath/p:$TC_INSTALL_DIR/lib/dso-boot/dso-boot-hotspot_$jvm_spec_ver.jar"

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

 <include>
   <class-expression>org.opensaml.xml.util.LazyList</class-expression>
   <honor-transient>true</honor-transient>
 </include>

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.

 <tc-properties>
  <!-- server-to-server reconnect -->
  <property name="l2.nha.tcgroupcomm.reconnect.enabled" value="true" />
  <property name="l2.nha.tcgroupcomm.reconnect.timeout" value="15000" />
  <!-- client-to-server reconnect -->
  <property name="l2.l1reconnect.enabled" value="true" />
  <property name="l2.l1reconnect.timeout.millis" value="15000" />
 </tc-properties>


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:
#!/bin/sh
TC_USER=nobody
TC_GROUP=nogroup
PIDFILE=/var/run/terracotta.pid

if [ `id -u` -ne 0 ]; then
        echo "You need root privileges to run this script"
        exit 1
fi

if [ -f /etc/default/terracotta ]; then
    . /etc/default/terracotta
fi

if [ -z "$TC_INSTALL_DIR" -o ! -d "$TC_INSTALL_DIR" ]; then
    echo "No TC_INSTALL_DIR specified or invalid TC_INSTALL_DIR"
    exit 1
fi
if [ -z "$TC_CONFIG_PATH" -o ! -f "$TC_CONFIG_PATH" ]; then
    echo "No TC_CONFIG_PATH specified or invalid TC_CONFIG_PATH"
    exit 1
fi
if [ -z "$NODENAME" ]; then
    echo "No NODENAME specified"
    exit 1
fi

export JAVA_HOME

JAVA_OPTS="-server -Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError $JAVA_OPTS"
TC_START_OPTS="$JAVA_OPTS \
   -Dcom.sun.management.jmxremote \
   -Dtc.install-root=$TC_INSTALL_DIR \
   -cp $TC_INSTALL_DIR/lib/tc.jar \
   com.tc.server.TCServerMain -n $NODENAME -f $TC_CONFIG_PATH"
TC_STOP_OPTS="-Dtc.install-root=$TC_INSTALL_DIR \
  -cp $TC_INSTALL_DIR/lib/tc.jar \
  com.tc.admin.TCStop"

. /lib/lsb/init-functions
. /etc/default/rcS

check_stopped () {
    return `/sbin/start-stop-daemon --test --start --pidfile "$PIDFILE" \
        --user $TC_USER --startas "$JAVA_HOME/bin/java" \
        >/dev/null`
}
start () {
    log_daemon_msg "Starting Terracotta server node ($NODENAME)..."

    if check_stopped; then

        /sbin/start-stop-daemon -S -v --make-pid --pidfile "$PIDFILE" \
            --chuid $TC_USER:$TC_GROUP --background \
            --exec $JAVA_HOME/bin/java -- $TC_START_OPTS

    else
        log_progress_msg "(already running)"
    fi
    log_end_msg 0
}
stop () {
    log_daemon_msg "Stopping Terracotta server node ($NODENAME)..."
    if $JAVA_HOME/bin/java $TC_STOP_OPTS; then
        log_progress_msg "(shutdown command sent)"
    else
        log_progress_msg "(could not send shutdown command)"
    fi
    sleep 5
    if check_stopped; then
        log_end_msg 0
    else
        log_progress_msg "(stopping in progress)"
    fi
}
force_stop () {
    log_daemon_msg "Killing Terracotta server node ($NODENAME)..."
    /sbin/start-stop-daemon -K --pidfile $PIDFILE -x $JAVA_HOME/bin/java
}

case "$1" in
  start)
      start
      ;;
  stop)
      stop
      ;;
  force-stop)
      force_stop
      ;;
  restart)
      stop
      sleep 10
      start
      ;;
  *)
    echo "Usage terracotta start|stop|force-stop|restart"
    exit 1;;
esac

exit $?
  • A konfiguráció az /etc/default/terracotta fájlban található:
NODENAME=terracotta-node-name
TC_CONFIG_PATH=/path/to/shibboleth-idp/conf/tc-config.xml
JAVA_HOME=/path/to/jvm
TC_INSTALL_DIR=/path/to/terracotta

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://<tc-szerver-node>: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)

Nagios Terracotta szerver check

#!/bin/sh

export TERRACOTTA_NODES="papigw.aai.niif.hu sandbox.aai.niif.hu"
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
export TC_HOME=/usr/local/terracotta-2.7.2
ACTIVE_NODES=""
STANDBY_NODES=""
CLUSTER_STATUS=""

function check_health() {
    TC_HEALTH=`echo "$1" | awk "/$2.health/{print "'$2}'`
    if [ "x$TC_HEALTH" = "xOK" ]; then
        return 0
    else
        echo TERRACOTTA CRITICAL - node $2 down
        exit 2
    fi
}

function check_one_active() {
    ACTIVE_NODES=`echo "$1" | awk '/ACTIVE-COORDINATOR/{print $1}' | sed 's/\.state://'`
    ACTIVE_COUNT=`echo "$ACTIVE_NODES" | wc -l`
    CLUSTER_STATUS="$CLUSTER_STATUS, active nodes: $ACTIVE_NODES"

    if [ "0$ACTIVE_COUNT" -le 1 ]; then
        return 0
    else
        echo TERRACOTTA CRITICAL - multiple ACTIVE nodes $CLUSTER_STATUS
        exit 2
    fi
}

function check_one_standby() {
    STANDBY_NODES=`echo "$1" | awk '/PASSIVE-STANDBY/{print $1}' | sed 's/\.state://'`
    STANDBY_COUNT=`echo "$STANDBY_NODES" | wc -l`
    if [ "0$STANDBY_COUNT" -eq 1 ]; then
        CLUSTER_STATUS="$CLUSTER_STATUS, standby nodes: $STANDBY_NODES"
        return 0
    else
        echo TERRACOTTA CRITICAL - no STANDBY node $CLUSTER_STATUS
        exit 2
    fi
}

function check_client_count() {
    CLIENTCOUNT=`echo "$1" | awk '/clientcount/{print $2}'`
    CLIENT_NODES=`echo "$1" | awk '/client.*address/{print $2}'`
    CLUSTER_STATUS="$CLUSTER_STATUS, client nodes: $CLIENT_NODES"
    if [ "0$CLIENTCOUNT" -eq 2 ]; then
        return 0
    else
        echo TERRACOTTA WARNING - client count is $CLIENTCOUNT $CLUSTER_STATUS
        exit 1
    fi
}

OUTPUT=`$JAVA_HOME/bin/java -jar ./terracotta-monitoring.jar $TERRACOTTA_NODES 2>/dev/null`

check_one_active "$OUTPUT"
for i in $TERRACOTTA_NODES; do
    check_health "$OUTPUT" "$i"
done
check_one_standby "$OUTPUT"
check_client_count "$OUTPUT"

echo TERRACOTTA OK - cluster is running $CLUSTER_STATUS