News zu Oracle

Hoch­ver­füg­bar­keit hoch­ver­füg­bar – das richtige Placement zum Überleben einer Node Eviction

Die Oracle Clus­ter­wa­re ist ein wichtiger Be­stand­teil der Oracle High Avai­la­bi­li­ty Ar­chi­tec­tu­re. Res­sour­cen, die unter Kontrolle der Clus­ter­wa­re stehen, werden überwacht, bei Sys­tem­start au­to­ma­tisch hoch gefahren und nach einem Absturz neu gestartet oder auf einen anderen Server ver­scho­ben. Der Haupt­ein­satz­zweck der Clus­ter­wa­re ist aber vor allem die Ab­si­che­rung eines Serverausfalls.

Ein Cluster ist aufgrund seiner Kom­ple­xi­tät an­fäl­li­ger für Störungen in der In­fra­struk­tur. Und eine der fatalsten Störungen ist der, auch nur vor­über­ge­hen­de, Ausfall des Netzwerk-He­art­beats zwischen den Clus­ter­ser­vern. In einem solchen Fall ist eine Kom­mu­ni­ka­ti­on zwischen allen Clus­ter­ser­vern nicht mehr möglich und die Kon­sis­tenz des Clusters po­ten­ti­ell gefährdet. Wie die Oracle Clus­ter­wa­re darauf reagiert, ist ins­be­son­de­re in Failover-Kon­stel­la­tio­nen von es­sen­ti­el­ler Bedeutung. Der heutige DBA-Tipp be­schreibt, was du in diesem Umfeld beachten musst, damit dein High-Avai­la­bi­li­ty-Ansatz nicht „nach hinten losgeht“.

Split Brain und Node Eviction

Ist die Kom­mu­ni­ka­ti­on über das In­ter­con­nect-Netzwerk länger als 30 Sekunden gestört, geht die Clus­ter­wa­re von einem so­ge­nann­ten Split-Brain-Szenario aus. Das heißt, der Cluster be­trach­tet sich als in zwei oder mehr Sub­clus­ter, so­ge­nann­te Cohorts, zerfallen, die nun zwangs­läu­fig Gefahr laufen, ein „Ei­gen­le­ben“ zu führen und damit die Kon­sis­tenz des Clusters insgesamt zu gefährden. Er reagiert darauf, indem er eine de­fi­nier­te Menge von Servern aus dem Cluster entfernt und sie erst wieder connecten lässt, wenn die Störung behoben ist. Dieses „Node Eviction“ genannte Verfahren wird durch einen Neustart des Clus­ter­stacks auf den aus­zu­schlie­ßen­den Servern oder Reboot der be­trof­fe­nen Server realisiert.

Aus­wir­kun­gen auf RAC-Datenbanken

Da die be­schrie­be­ne Node Eviction min­des­tens mit einem Neustart des gesamten Clus­ter­stacks verbunden ist, bedeutet Node Eviction auch immer den Abbruch einer Un­ter­men­ge der aktiven Da­ten­bank­ses­si­ons. Geht man jedoch davon aus, dass Cli­ent­ses­si­ons auf RAC-Da­ten­ban­ken re­gel­mä­ßig über alle Clus­ter­ser­ver verteilt sind, muss man sich hier keine Gedanken darüber machen, welche Server im Falle eines Split-Brain-Szenarios aus­ge­schlos­sen werden. Ver­hin­dern oder be­ein­flus­sen kann man es in diesem Fall sowieso nicht.

Aus­wir­kun­gen auf Failover-Da­ten­ban­ken – oder allgemein – Failover Ressourcen

Anders sieht es hingegen bei Failover Res­sour­cen aus. Sie laufen nor­ma­ler­wei­se nur auf je einem Server des Clusters und damit ist ihr Placement durchaus relevant. Es wäre ja äußerst fatal, wenn im Falle eines He­art­beat­aus­falls – der für sich gesehen gar keine Aus­wir­kung auf die Ver­füg­bar­keit einer Datenbank hat – gerade der Server rebootet, der die pro­duk­ti­ve Datenbank betreibt, während ein Server mit Test­da­ten­ban­ken oder gar ein leerer Standby überleben würde. Daher ist es wichtig, sich mit den Eviction-Regeln zu befassen.

1. Eviction Regel I

Die primäre Regel des Eviction Al­go­rith­mus besagt, dass im Split-Brain-Fall der Sub­clus­ter überlebt, in dem die meisten Server ver­blie­ben sind. Der oder die Sub­clus­ter mit Ser­ver­min­der­heit werden aus­ge­schlos­sen. Lässt sich anhand dieser Regel keine ein­deu­ti­ge Ent­schei­dung fällen, also mehr als ein Sub­clus­ter eine Ser­ver­ma­jo­ri­tät hat (im sim­pels­ten Fall, einem 2‑Node-Cluster, enthält jeder der beiden Sub­clus­ter einen Server), greift die Eviction Regel II. Und für diese müssen wir wiederum vier Fälle un­ter­schei­den, je nachdem, welche Version der Clus­ter­wa­re in­stal­liert ist. In der Grid In­fra­struc­tu­re Umgebung ermittelt ihr die Version eurer Clus­ter­wa­re mittels:

[oracle@c-tso-rac01(grid12c +ASM1) ~]$ crsctl query crs activeversion
Oracle Clusterware active version on the cluster is [12.1.0.2.0]

2. Eviction Regel bis Clus­ter­wa­re 12.1.0.1

Bis ein­schließ­lich Clus­ter­wa­re Version 12.1.0.1 überlebt der Sub­clus­ter, in dem sich der Server mit der nied­rigs­ten Noden­um­ber befindet. Diese Noden­um­ber wird fort­lau­fend an die Clus­ter­ser­ver vergeben und ergibt sich aus dem Zeitpunkt, zu dem der be­tref­fen­de Server dem Cluster hin­zu­ge­fügt wird – praktisch ent­spricht die Noden­um­ber also der In­stal­la­ti­ons­rei­hen­fol­ge, solange Server nicht aus dem Cluster gelöscht und später wieder hin­zu­ge­fügt werden. Die Noden­um­bers können in der Grid In­fra­struc­tu­re Umgebung ermittelt werden über:

[oracle@c-tso-rac01(grid12c +ASM1) ~]$ olsnodes -n
c-tso-rac01 1
c-tso-rac02 2

Eine nach­träg­li­che Änderung der Noden­um­ber ist nur durch Entfernen und Wie­der­ein­fü­gen des be­tref­fen­den Servers in den Cluster möglich. Solltet ihr also einen Cluster aus heterogen aus­ge­stat­te­ten Servern aufbauen, solltet ihr bereits die In­stal­la­ti­on der Clus­ter­wa­re ent­spre­chend planen und die Server nach ab­stei­gen­der Wich­tig­keit in­stal­lie­ren. Bei homogen aus­ge­stat­te­ten Servern ist eine solche Über­le­gung nicht er­for­der­lich. Einzige Ausnahme hiervon bildet ein Failover-Cluster, in dem von der 10-Tage-Regel Gebrauch gemacht werden soll. Hier muss zwingend und un­ver­än­der­lich genau ein Stand­by­ser­ver fest­ge­legt werden, der dann auch nur vor­über­ge­hend Da­ten­ban­ken betreiben darf. Für diese Rolle würde man folglich den Server mit der größten Noden­um­ber auswählen.

Gehen wir von obigem Beispiel, einem 2‑Node-Cluster aus den Servern c‑tso-rac01 und c‑tso-rac02 aus, wird im Fall eines He­art­beat­aus­fal­les immer der Server mit der Noden­um­ber 1, also c‑tso-rac01, überleben. Folglich sollten dort auch die wich­ti­ge­ren Res­sour­cen platziert werden.
An­dern­falls passiert folgendes:

  • Die pro­duk­ti­ve Datenbank befindet sich auf dem Server mit der höheren Noden­um­ber (c‑tso-rac02)
Screenshot Prod on 2 online
  • Eine Störung des In­ter­con­nect führt zum Aus­schluss des Servers c‑tso-rac02. Folglich wird die pro­duk­ti­ve Datenbank proddb dort gestoppt und auf dem ver­blei­ben­den Server c‑tso-rac01 neu gestartet.
Screenshot Prod on 2 offline
  • Mit Ende des Swit­cho­ver ist die pro­duk­ti­ve Datenbank zwar wieder verfügbar. Es sind aber im Zuge des Failovers sämtliche Sitzungen verloren gegangen, die Datenbank war unter Umständen mehrere Minuten nicht verfügbar und abhängig von der Anwendung können noch er­heb­li­che Wie­der­an­lauf­auf­wän­de anfallen.

  • Die ver­gleichs­wei­se un­wich­ti­gen Dev- und Test­da­ten­ban­ken hingegen waren in keiner Weise vom Ausfall des He­art­beats betroffen.
  •  

Das oben be­schrie­be­ne Aus­schluss­ver­fah­ren lässt sich dann auch im ocssd.log der Clus­ter­wa­re nachverfolgen:

2016-08-01 19:16:19.943: [ CSSD][2446112512]clssnmCheckDskInfo: My cohort: 2
2016-08-01 19:16:19.943: [ CSSD][2446112512]clssnmCheckDskInfo: Surviving cohort: 1
2016-08-01 19:16:19.943: [ CSSD][2446112512](:CSSNM00008:)clssnmCheckDskInfo: Aborting local node to avoid splitbrain. Cohort of 1 nodes with leader 2, c-tso-rac02,
is smaller than cohort of 1 nodes led by node 1, c-tso-rac01, based on map type 2

Dieses Szenario liese sich beliebig oft wie­der­ho­len. Selbst wenn sich alle drei Da­ten­ban­ken auf dem Node 2 befänden und der Node 1 damit quasi idle wäre, würde im Fall einer He­art­beatstö­rung der Node 2 aus dem Cluster aus­ge­schlos­sen und alle drei Da­ten­ban­ken auf dem Node 1 neu gestartet.

In einem Cluster mit drei oder mehr Servern ist der Ausfall nicht so einfach vor­her­seh­bar. Im un­güns­ti­gen Fall splittet sich hier viel­leicht nur der Server 1 aufgrund eines NIC-Fehlers vom Cluster ab. Dann bilden die Nodes 2 und 3 den größeren Sub­clus­ter und 1 würde aus­ge­schlos­sen. Da aber eben genau das nicht vor­her­seh­bar ist, ist man auch hier zumindest sta­tis­tisch gesehen besser auf­ge­stellt, wenn man die wich­tigs­ten Res­sour­cen auf dem Server mit der nied­rigs­ten Noden­um­ber platziert.

Das bis 12.1.0.1 im­ple­men­tier­te Verhalten hat einen we­sent­li­chen Vorteil – es ist zu einem großen Teil plan- und vor­her­seh­bar. Ins­be­son­de­re gilt das für einen 2‑Node-Cluster, einer der wahr­schein­lich am häu­figs­ten ver­wen­de­ten Clus­ter­in­stal­la­tio­nen, zumindest im Standard-Edition-Umfeld.

3. Eviction ab Clus­ter­wa­re 12.1.0.2 steuern

Diese eben in Punkt 2 be­schrie­be­ne, statische Evic­tion­re­gel bis Version 12.1.0.1 hat jedoch gleich­zei­tig den Nachteil, dass sie keine Rücksicht auf die Anzahl der von den je­wei­li­gen Servern be­reit­ge­stell­ten Res­sour­cen nimmt. Wie bereits in Punkt 2 erwähnt, würde unter Umständen auch ein voll­kom­men leerer Server zu Lasten eines Servers überleben, auf dem zahl­rei­che Da­ten­ban­ken laufen. Vor allem im Hinblick auf den Cloud-Ansatz und policy-managed Clus­ter­res­sour­cen wurde Regel II mit Version 12.1.0.2 der Clus­ter­wa­re grund­le­gend verändert.

Der Aus­schluss aus dem Cluster wird nicht mehr nur auf Basis der Noden­um­ber ent­schie­den, sondern primär von der Anzahl der Da­ten­ban­ken und Da­ten­bank­ser­vices auf den infrage kommenden Servern abhängig gemacht. Es überlebt nun der Sub­clus­ter, auf dem in Summe mehr Services laufen. Leider zählen hierbei aber nur „echte“ RAC-Da­ten­ban­ken und ‑services und die in 12.1.0.2 ein­ge­führ­te Ma­nage­ment Database mgmtdb, also Res­sour­cen vom Typ ora.database.type, ora.service.type und ora.mgmtdb.type. Failover-Da­ten­ban­ken oder andere selbst­de­fi­nier­te Clus­ter­res­sour­cen werden nicht in die Be­rech­nung einbezogen.

Im Falle eines Gleich­stan­des der Anzahl Da­ten­ban­ken und ‑services greift weiterhin die Eviction Regel IIa, d.h. der Sub­clus­ter, in dem die nied­rigs­te Noden­um­ber vertreten ist, wird überleben.

Gehen wir davon aus, dass ihr einen reinen Failover-Cluster betreibt – also nicht auch noch RAC-Da­ten­ban­ken vertreten sind – dann wird bei der Zählung der ent­schei­dungs­re­le­van­ten Res­sour­cen also zwangs­läu­fig nur die mgmtdb be­rück­sich­tigt. Folglich sollten alle wichtigen Da­ten­ban­ken auf dem selben Node laufen, auf dem sich auch die mgmtdb befindet. Die Chance, dass diese ein split-brain-Szenario überleben, ist damit am höchsten.

Screenshot MGMTDB

Um die Ma­nage­ment Database (mgmtdb) auf den Clus­ter­node mit der nied­rigs­ten Noden­um­ber zu ver­schie­ben, setzt ihr in der Grid In­fra­struct­re Umgebung folgenden Befehl ab:

srvctl relocate mgmtdb -node $(olsnodes -n|sort -nk2,2|head -1|awk '{print $1}')

Das Ver­schie­ben der mgmtdb kann im laufenden Betrieb erfolgen und hat keine Aus­wir­kun­gen auf die übrigen Clusterressourcen.

Möchtest du deine produktive(n) Datenbank(en) auf den selben Server wie die mgmtdb ver­schie­ben, tust du das mit:

rsctl relocate resource db.proddb -n $(srvctl status mgmtdb|grep 'is running on node'|awk 'NF>1{print $NF}')

Das wäre aber mit einem Neustart der ent­spre­chen­den Datenbank verbunden, wenn sie nicht zufällig bereits auf dem richtigen Server liegt. Besser ist es daher, die Datenbank gleich auf dem richtigen Server zu starten:

crsctl start resource db.proddb -n $(srvctl status mgmtdb|grep 'is running on node'|awk 'NF>1{print $NF}')

Falls du die be­tref­fen­de Datenbank nicht ver­schie­ben kannst, weil dir kein War­tungs­fens­ter zur Verfügung steht, kannst du aber zumindest noch die mgmtdb auf diesen Server ver­schie­ben und damit seine Über­le­bens­wahr­schein­lich­keit anheben:

srvctl relocate mgmtdb -node $(crsctl status resource db.proddb|grep '^STATE'|awk 'NF>1{print $NF}')

In einem Failover-Cluster mit Nutzung der 10-Tage-Regel lässt du natürlich die mgmtdb nie auf dem Stand­by­ser­ver laufen. Der Stand­by­ser­ver sollte auch mit Clus­ter­wa­re 12.1.0.2 derjenige mit der höchsten Noden­um­ber sein.

4. Eviction ab Clus­ter­wa­re 12.2.0.1 steuern

Mit Clus­ter­wa­re 12.2 wurde die Ge­wich­tung nach Da­ten­ban­ken und Services aus 12.1.0.2 bei­be­hal­ten, aber die mgmtdb wird nun nicht mehr be­rück­sich­tigt. Damit ist die mgmtdb nicht mehr als Token für die Fest­le­gung des prä­fe­rier­ten Servers nutzbar. Wir behelfen uns hier mit einer Da­ten­bank­in­stanz „quorum“, die nur im nomount-Mode betrieben wird.

[oracle@c-tso-rac01 ~]$ echo -e \
"db_name=quorum\nsga_target=2G\nuse_large_pages=false" \
>$ORACLE_HOME/dbs/initquorum.ora

[oracle@c-tso-rac01 ~]$ export ORACLE_SID=quorum

[oracle@c-tso-rac01 ~]$ sqlplus -S / as sysdba <<sql
> create spfile='+DG_DATA/spfilequorum.ora' from pfile;
> sql
File created.

[oracle@c-tso-rac01 ~]$ srvctl add database \
-d quorum -o $ORACLE_HOME -p +DG_DATA/spfilequorum.ora \
-c single -x c-tso-rac02 -s nomount

[oracle@c-tso-rac01 ~]$ srvctl start database -d quorum

Ihre einzige Aufgabe ist es, als für die Eviction zählbare ora.database.type-Ressource zu fungieren. Sichtbar ist der Un­ter­schied hier auch im Res­sour­cen­na­me. Während die selbst­de­fi­nier­ten Fail­over­res­sour­cen dem Na­mens­sche­ma db.<dbname> folgen, hat die quorum-Datenbank als „echte“ Clus­ter­da­ten­bank das Na­mens­sche­ma ora.<dbname>.db. Diese Datenbank muss folglich auf der selben Seite wie die wichtigen Da­ten­ban­ken laufen.

Ebenfalls mit 12.2 wurde an Clus­ter­res­sour­cen ein neues Flag – CSS_CRITICAL – ein­ge­führt. Die Anzahl von Res­sour­cen, die dieses Flag auf yes gesetzt haben, fließt ebenfalls in die Ge­wich­tung des je­wei­li­gen Servers ein. Al­ler­dings wurde dieses Flag nach unserer Erfahrung an selbst­de­fi­nier­ten Clus­ter­res­sour­cen nicht be­rück­sich­tigt. Eine Lösung hierfür konnte auch vom Oracle Support nicht be­reit­ge­stellt werden.

Screenshot Quorum

5. Eviction ab Clus­ter­wa­re und Datenbank 19.7 steuern

Mit Release Update 19.7 wurde das Konzept „Standard Edition High Availability“1 ein­ge­führt. In seiner Wir­kungs­wei­se un­ter­schei­det es sich nicht we­sent­lich von den bereits oben be­schrie­be­nen Failover-Da­ten­ban­ken auf Basis selbst­de­fi­nier­ter Clus­ter­res­sour­cen. Drei we­sent­li­che Ver­bes­se­run­gen gehen damit dennoch einher:

  • Die Failover-Datenbank wird jetzt voll­um­fäng­lich von Oracle un­ter­stützt. Der Support für selbst­de­fi­nier­te Fail­over­re­sour­cen endete hingegen am Failoverscript.

  • Die Failover-Datenbank ist jetzt eine „echte“ Clus­ter­da­ten­bank ein­schließ­lich der Kom­mu­ni­ka­ti­on sqlplus ↔ Clus­ter­wa­re. Das heißt, ein Starten oder Stoppen per sqlplus wird nun auch von der Clus­ter­wa­re bemerkt und im Clus­ter­sta­tus widerspiegelt.

  • Eine Ge­wich­tung per CSS_CRITICAL wird nun – im Gegensatz zu selbst­de­fi­nier­ten Clus­ter­res­sour­cen – be­rück­sich­tigt. Damit ist eine Un­ter­schei­dung wichtiger von un­wich­ti­gen Da­ten­ban­ken möglich und die Eviction basiert nicht mehr (nur) auf reiner zah­len­mä­ßi­ger Über­le­gen­heit von Da­ten­ban­ken auf einem gegenüber dem anderen Server.
oracle@c-tso-rac01 ~]$ srvctl add database -db proddb \
-oraclehome $ORACLE_HOME -dbtype single \
-spfile +DG_DATA/PRODDB/PARAMETERFILE/spfile.383.1087569801 \
-node "c-tso-rac01,c-tso-rac02" \
-css_critical YES

[oracle@c-tso-rac01 ~]$ srvctl add database -db testdb \
-oraclehome $ORACLE_HOME -dbtype single \
-spfile SPFILE=+DG_DATA/TESTDB/PARAMETERFILE/spfile.294.1087569729 \
-node "c-tso-rac01,c-tso-rac02" \
-css_critical NO

[oracle@c-tso-rac01 ~]$ srvctl add database -db devdb \
-oraclehome $ORACLE_HOME -dbtype single \
-spfile +DG_DATA/DEVDB/PARAMETERFILE/spfile.295.1087574423 \
-node "c-tso-rac01,c-tso-rac02" \
-css_critical NO

[oracle@c-tso-rac01 ~]$ srvctl start database -db testdb -node c-tso-rac01
[oracle@c-tso-rac01 ~]$ srvctl start database -db devdb -node c-tso-rac01
[oracle@c-tso-rac01 ~]$ srvctl start database -db proddb -node c-tso-rac02
Screenshot Seha

Fazit

Der Einsatz der Oracle Clus­ter­wa­re ist ein wichtiger Be­stand­teil einer zu­ver­läs­si­gen Hoch­ver­füg­bar­keits­lö­sung. Gleich­zei­tig handelt es sich dabei aber um ein komplexes Produkt, das ins­be­son­de­re auf Störungen in seinen Kom­mu­ni­ka­ti­ons­we­gen emp­find­lich reagiert. Um die Aus­wir­kun­gen dieser Störungen auf wichtige Res­sour­cen zu mi­ni­mie­ren, müssen bei ihrer Plat­zie­rung nicht nur die Leis­tungs­fä­hig­keit der Server be­rück­sich­tigt werden – sie sollte in Clustern ohnehin homogen sein – sondern auch die Aus­wir­kun­gen einer möglichen Node Eviction.

Fail­over­sys­te­me auf Oracle Clus­ter­wa­re sind am wenigsten wahr­schein­lich von Node Evictions betroffen, wenn die wichtigen Ressourcen

  • bis Clus­ter­wa­re 12.1.0.1 auf dem Node mit der nied­rigs­ten Nodenumber,

  • ab Clus­ter­wa­re 12.1.0.2 auf dem selben Node wie die Ma­nage­ment Database (mgmtdb),

  • ab Clus­ter­wa­re 12.2.0.1 auf dem selben Node wie eine selbst­er­stell­te quorum-Ressource platziert sind.

  • für Standard Edition Da­ten­ban­ken als Fail­over­res­sour­cen ist ab Clus­ter­wa­re und Datenbank 19.7 die Nutzung von „Standard Edition High Avai­la­bi­li­ty“ die beste Lösung.
Hier findest du weitere Posts zu den Themen Oracle Database und DBA Tipps aus unserem News Bereich. 
icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email