Oracle 12c Hochverfügbarkeit für den Anwendungsentwickler

Werbung
Oracle Database Days 12c
Alle Details zum neuen Datenbank Release aus erster Hand
<Insert Picture Here>
Dezember 2013
Januar 2014
Februar 2014
Information Lifecycle Management
Database Application Development
Database Administration
Alle Termine und weitere Informationen:
tinyurl.com/ODD12c
Hochverfügbarkeit für den Anwendungsentwickler
Oracle Datenbank 12c
Sebastian Solbach, ORACLE Deutschland B.V. Co. KG
Agenda
 HA in der Anwendungsentwicklung ?
 Basis Setup (Datenbank)
 Transaction Guard (OCI/ODP.NET/JDBC)
 Application Continuity (nur JDBC)
 Best Practices
 Diverses
Das Problem: “In-Flight” Work
Pre-12c Situation
 Netzwerk / Datenbank Ausfall führt zu
einem ungewissen Transaktionsstatus
– Neustart der Mid-Tier
– Frustration der Benutzer
– Abgebrochene Arbeit
– Doppelte Buchungen
– Entwicklungsaufwand
Maximum Application Availability (MAA2)
Mehr als 1 Problem
Datenbank Ausfall konfrontiert Entwickler mit 5 Problemen:
1. Ausfall festestellen
2. Wiederaufnahme im vorgegebenen Zeitfenster
3. Exception Handling
4. Transaktionsstatus herausfinden
5. Weiterführung der aktuellen Transaktion
Pre-12c Situation
HA Mechanismen und Einschränkungen
Ausfall
‒ Fast Application Notification (FAN) / Fast Connection Failover
 Recovery Zeitfenster? Abhängig von Ausfallzenario und Technologie
 Exception Handling? Fehler & Reaktionen nicht vollständig formalisiert
 Aktuelle Transaktion? Ungewiss…
 Weiterführen aktueller Transaktion? Nicht verfügbar!
Ausfall feststellen: Fast Application Notification
Applikationen verlieren Zeit
FAN & FCF
• Warten auf TCP/IP Timeouts
 Down – Service/Knoten down
<50ms für Failover
• Fehler bei geplanten Ausfällen
• Verbindungsabbrüche bei
Nichtverfügbarkeit des Services
• Keine Neu-Verbindungsversuche
bei Serviceverfügbarkeit
• Verbindungen auf überlastete
Knoten
 Planned Down – Entleerung des
Connectionspools ohne
Verbindungsabbrüche
 Up – Verteilung der Arbeitslast bei
Serviceverfügbarkeit
 RLB % - Informationen zur
optimalen Verteilung
 Affinity – Optimierung
Workload lokal zu halten
Alle 12c
Treiber
verwenden
FAN über
ONS
Datenbanklösungen für MAA
 Real Application Cluster
– Automatische Fehlererkennung in <30 Sekunden
– Schnelles konfigurierbares Instanz Recovery
– Geplante Übernahme ohne Downtime
 RAC One Node
– Automatische Fehlererkennung in <30 Sekunden
– Neustart der Datenbank & Instanz Recovery
– Geplante Übernahme ohne Downtime
 Active Data Guard / Data Guard
– (Automatische) Fehlererkennung in <2 Minuten
– Neustart der Datenbank in Desaster Recovery Entfernung
– Geplante Übernahme mit Downtime
Exception Handling? “Recoverable Error”
 Formalisiert:
– OracleException.IsRecoverable property
– JDBC throws SQLRecoverableException
 Applikationen brauchen keine eigene Liste mit Fehlercodes (z.B.,
ORA-1033, ORA-1034, ORA-xxx)
Lösungen für Transaktionsstatus & Fortführung
Neu in Oracle Database 12c
Transaction Guard
Application Continuity
Verlässliches Protokoll und
API den Status der letzten
Transaktionen zu überprüfen
Automatische Wiederholung
(Replay) der Benutzertransaktion nach einem
Ausfall oder während einer
Wartung
Agenda
 HA in der Anwendungsentwicklung ?
 Basis Setup (Datenbank)
 Transaction Guard (OCI/ODP.NET/JDBC)
 Application Continuity (nur JDBC)
 Best Practices
 Diverses
Verwenden eines eigenen Services !!!
... und das gilt nicht nur für RAC, Data Guard und Multitenant (PDB)
 Oracle Datenbank 12c & Oracle Client 12c
srvctl modify service -db ORCL -service APPCON
-failovertype TRANSACTION -replay_init_time 300
-failoverretry 30 -failoverdelay 3
-notification TRUE -commit_outcome TRUE
 Services in der Datenbank:
https://apex.oracle.com/pls/apex/GERMAN_COMMUNITIES.
SHOW_TIPP?P_ID=741
Service Konfiguration Transaction Guard
 COMMIT_OUTCOME
– Werte : TRUE oder FALSE, Default: FALSE
– Greift sofort bei neuen Sessions
 RETENTION_TIMEOUT
– Einheit: Sekunden, Default: 24 Stunden (86400)
– Maximalwert: 30 Tage (2592000)
 AQ_HA_NOTIFICATIONS
– Werte: TRUE oder FALSE, Default: FALSE (noch)
– Auf TRUE setzen für FAN !!
Service Konfiguration Application Continuity
Zusätzlich für Application Continuity
 FAILOVER_TYPE
– Werte : NONE, SESSION, SELECT, TRANSACTION, Default: NONE
– Für AC auf TRANSACTION setzen
 REPLAY_INITIATION_TIMEOUT = 300
– Zeit in Sekunden nach der ein Replay abgebrochen wird
 FAILOVER_RETRIES = 60
– Anzahl der Verbindungsversuche für einen Replay
 FAILOVER_DELAY = 3
– Verzögerung in Sekunden zwischen den Verbindungsversuchen
Rechte & Datenbank Parameter
 Applikationsbenutzer braucht Rechte auf das DBMS_APP_CONT
Package
GRANT EXECUTE ON DBMS_APP_CONT TO <app-name>;
 REMOTE_LISTENERS muss alle Listener kennen, über die die Clients
sich initial verbinden (im Normalfall nur SCAN)
alter system set
REMOTE_LISTENERS='SCAN.domain.com:1521'
Agenda
 HA in der Anwendungsentwicklung ?
 Basis Setup (Datenbank)
 Transaction Guard (OCI/ODP.NET/JDBC)
 Application Continuity (nur JDBC)
 Best Practices
 Diverses
Transaction Guard
Verlässliche Information über eine
Transaktion nach einem Ausfall

Mit Hilfe von Transaction Guard kann die
Applikation auf alle Fehler richtig reagieren

Verhindert “Logische Korruptionen” druch
Wiederholung

Application Continuity verwendet
Transaction Guard

Transaction Guard ist verfügbar mit JDBCthin, OCI/OCCI, ODP.NET
Herausforderung: Commit Ergebnis
Unterbrechung der Kommunikation während eines COMMIT
 Java/JDBC Applikation bekommt eine Fehlermeldung :”Failed”
– Keine Information über das Ergebnis dieser “in-flight” Transaktion
 Typisches Szenario
– t0: Applikation prüft Status der Transaktion und erhält “Not COMMITTED”.
Auf Basis dieser Information wird das weitere Vorgehen bestimmt
– t1: Transaktion wird doch noch abgeschlossen
– Es gibt (bis 12c) keinen verlässliche Möglichkeit den Status einer in-flight
Transaktion zu prüfen
Transaction Guard
Verlässliche Information des COMMIT Ergebnisses
1.
RDBMS assoziiert zu jeder “in-flight” Transaktion eine logische
TransaktionsID (LTXID)
LTXID wechselt NUR bei einem erfolgreichen COMMIT oder ROLLBACK
2.
3.
LTXID wird z.B. an JDBC kommuniziert
Falls die Verbindung abbricht
LogicalTransactionId ltxid = oldConn.getLogicalTransactionId();
OracleConnection newConn = getConnection();
CallableStatement cstmt = newConn.prepareCall(GET_LTXID_OUTCOME);
RDBMS: Falls GET_LTXID_OUTCOME weder Committed noch Rollback
zurückgibt, wird die Transaktion daran gehindert zu COMMITTEN
Transaction Guard – Schematische Darstellung
Applikation/Treiber - RDBMS Interaktion
Datenbank
Applikation/Treiber
getConnection()
Zeit
start transaction
SQL, PL/SQL, RPC
assign LTXID
Results
Txn.Commit();
get Last LTXID
COMMIT
Recoverable Error
<new session>
Commit outcome?
COMMIT/ROLLBACK
Get LTXID outcome
COMMIT?
Return & Preserve
COMMIT OUTCOME
TG in
Aktion
Transaction Guard
Der Komplette Java Code
...
boolean committed = false;
boolean call_completed = false;
try {
CallableStatement cstmt = conn.prepareCall(GET_LTXID_OUTCOME);
cstmt.setBytes(1, ltxid[i].getBytes());
cstmt.registerOutParameter(2, OracleTypes.BIT);
cstmt.registerOutParameter(3, OracleTypes.BIT);
cstmt.execute(); committed = cstmt.getBoolean(2);
call_completed = cstmt.getBoolean(3);
System.out.println("LTXID committed ? " + committed);
System.out.println("User call completed ? " + call_completed);
}
catch (SQLException sqlexc)
{
System.out.println("Calling GET_LTXID_OUTCOME failed");
sqlexc.printStackTrace();
}
Transaction Guard
Treiber Unterstützung mit 12.1.0.1
 Supportete Commit Modelle
‒
‒
‒
‒
‒
Local TXN
Auto-commit, Commit on Success
Commit embedded in PL/SQL
DDL, DCL, Parallel DDL
Remote, Distributed
 Ausgeschlossen
XA in 12.1
‒ R/W DBLinks von Active Data Guard / Read Only
‒
Agenda
 HA in der Anwendungsentwicklung ?
 Basis Setup (Datenbank)
 Transaction Guard (OCI/ODP.NET/JDBC)
 Application Continuity (nur JDBC)
 Best Practices
 Diverses
Application Continuity
Maskiert ungeplante und geplante Ausfälle
“In-flight” Prozess läuft weiter

Wiederholt “in-flight” Prozess nach einem
Recoverable Error

Verbirgt viele Hardware, Software, Netzwerk,
Storage Fehler und Ausfälle

Unterstützt JDBC-Thin, UCP, WebLogic
Server und 3rd Party Java Applikationen

Oracle RAC, RAC One, & Active Data Guard
Die Einheit: “Datenbank Request”
Legt die Grenzen für die Wiederholung fest
Begin
Request
PoolDataSource pds = GetPoolDataSource();
Connection conn = getConnection(pds);
PreparedStatement pstmt = …
…
SQL, PL/SQL, local calls, RPC
…
conn.commit();
conn.close();
Request Body
schließt
gewöhnlich mit
COMMIT ab
End
Request
Phasen bei Application Continuity
1-Laufzeit Operationen
2-Reconnect
3-Replay
• Überwachung der
einzelnen Datenbank
Requests
• Prüft ob für den Request
Replay aktiviert wurde
• Wiederholung der
gespeicherten Aufrufe
• Verwaltung von Timeouts
• Ermittlung was / was nicht
wiederholt werden kann
• Eröffnet neue Verbindung
• Verifizierung der
Ergebnisse mit den
Vorhergehenden.
• Speichert den orginären
Aufruf inkl. Bind Variablen
und Validierung
• Validiert die
Zieldatenbank/Zielinstanz
• Verwendet Transaction
Guard zur Ermittlung des
COMMIT Ergebnisses
• Führt den Request
weiter, falls die
Wiederholung
erfolgreich ist
Konfiguration Application Continuity
JDBC / WLS
JDBC URL oder Property Datei
# Verwendung der neuen 12.1 Replay DataSource
datasource=oracle.jdbc.replay.OracleDataSourceImpl
WebLogic Console oder UCP/Weblogic Property Datei
# Auswählen der neuen 12.1
replay datasource=oracle.jdbc.replay.OracleDataSourceImpl
Setzen von ONS nicht mehr notwendig, da in 12c die ONS Server
automatisch konfiguriert werden (via. Listener)
Verwenden des Services in JDBC
 Oracle Client 12c
jdbc:oracle:thin:@(DESCRIPTION =
(TRANSPORT_CONNECT_TIMEOUT=3)(CONNECT_TIMEOUT=5)
(RETRY_COUNT=3)(FAILOVER=ON)(ADDRESS=
(PROTOCOL=tcp)(HOST=SCAN.domain.com)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=APPCON))
Ausnahmen: Replay deaktiviert
Global
• Default Datenbank
Service oder Default PDB
Service
• XA in 12.1
• Verwendung einiger
JDBC-Klassen aus dem
Package oracle.sql
Request
• Eigentlich logisch
(restricted calls):
– Alter System
– Alter Database
• Active Data Guard mit
read/write Datenbanklinks
Target Database
• Nicht verfügbar bei
– Logical Standby
– Golden Gate
Restriktionen: Wann wird nicht wiederholt?
Normal Runtime
Reconnect
Aufrufe im selben Request nach
• Fehler ist nicht “recoverable”
• Einem erfolgreichen Commit
im dynamischen Modus
• Fehler beim erneuten
Verbindungsaufbau
• Auftreten eines “restricted
call”
•Zieldatenbank nicht für Replay
geeignet
• disableReplay API
• Letzter Aufruf erfolgreich
committed im dynamischen
Modus
Replay
•Validierung erkennt
Unterschied im Ergebnis
Agenda
 HA in der Anwendungsentwicklung ?
 Basis Setup (Datenbank)
 Transaction Guard (OCI/ODP.NET/JDBC)
 Application Continuity (nur JDBC)
 Best Practices
 Diverses
Generell geeignet oder manuelle Anpassung?
Nein
WLS /
UCP
Ja
Return
Conn. to
Pool
Ja
Nein
Property
to
Return
Nein
Set Property
Application Continuity
möglich
Manuell:
begin &
endRequest
setzen
Ja
Was muss noch beachtet werden
Wenn
Dann
Kein Oracle Connection Pool
Markieren von Request Grenzen
oracle.sql JDBC-Klassen
Ersetzen durch Standard JDBC Interface (java.sql)
Unerwünschte Seiteneffekte
Verwenden der disable API, falls ein Aufruf nicht wiederholt werden
sollte
Mutable Funktionen
(Sysdate)
Ermöglichen (Grants) veränderliche Werte gleich zu belassen
(z.B. sequence.nextval)
Callbacks
Registrierung von Callbacks zur Änderung des Status einer
Applikation ausserhalb eines Requests
Bei WebLogic & UCP Labelling verwenden
Deaktiveren von Replay ?
Verwenden der disableReplay() API für Aufrufe, die nicht wiederholt
werden sollen/dürfen, insbesondere für Externe Aktionen:
– Autonome Transaktionen
– UTL_HTTP, UTL_URL
– UTL_FILE, UTL_FILE_TRANSFER
– UTL_SMPT, UTL_TCP
– UTL_MAIL
– DBMS_PIPE (nicht empfohlen bei RAC)
– DBMS_ALERT (Ebenfalls Vorsicht bei RAC: Community Tipp)
https://apex.oracle.com/pls/apex/
GERMAN_COMMUNITIES.SHOW_TIPP?P_ID=1621
Optinale Datenbank Konfiguration
„Mutables“ Rechte vergeben
 Damit z.B. Sysdate bei einem Replay denselben Wert zurückgibt:
GRANT [KEEP DATE TIME | KEEP SYSGUID].. [to USER]
REVOKE [KEEP DATE TIME | KEEP SYSGUID][from USER]
GRANT KEEP SEQUENCE.. [to USER] on [sequence object];
REVOKE KEEP SEQUENCE [from USER] on [sequence object];
ALTER SEQUENCE.. [sequence object] [KEEP|NOKEEP];
CREATE SEQUENCE.. [sequence object] [KEEP|NOKEEP];
Agenda
 HA in der Anwendungsentwicklung ?
 Basis Setup (Datenbank)
 Transaction Guard (OCI/ODP.NET/JDBC)
 Application Continuity (nur JDBC)
 Best Practices
 Diverses
Kill Session
Was passiert, wenn der DBA eine Session killt?
 Natürlich greift AC...
– ... nicht unbedingt immer gewollt!
SQL> alter system kill session 'sid, serial#, @inst' noreplay;
SQL> alter system disconnect session 'sid, serial#, @inst'
noreplay;
SQL> execute DBMS_SERVICE.DISCONNECT_SESSION(‘[service name]’,
DBMS_SERVICE.NOREPLAY) ;
Lizenzen für produktiven Einsatz
 Transaction Guard: Enterprise Edition
 Application Continuity: RAC oder Active Data Guard Option
 Oracle® Database Licensing Information 12c Release 1 (12.1)
http://docs.oracle.com/cd/E16655_01/license.121/e176
14/editions.htm#DBLIC116
Links & weitere Informationen
 DBA Community
https://blogs.oracle.com/dbacommunity_deutsch/
 OTN
http://www.oracle.com/technetwork/products/clustering/ac-overview-1967264.html
 Whitepapers
http://www.oracle.com/technetwork/database/database-cloud/private/transaction-guardwp-12c-1966209.pdf
http://www.oracle.com/technetwork/database/database-cloud/private/applicationcontinuity-wp-12c-1966213.pdf
 Dokumentation
 http://docs.oracle.com/cd/E16655_01/java.121/e17659/app_cont.htm#JJUCP8254
Herunterladen