Oracle Apex Listener (ORDS) in einer Failover- und Multitenant-Architektur

By | 30. Oktober 2015

Einführung

Oracle Application Express (APEX) ist ein Entwicklungstool für datenbankbasierte Webanwendungen und Bestandteil der Oracle Datenbank. Für den Webbrowser-Zugriff auf eine APEX-Anwendung, die in der Oracle Datenbank gehalten wird, wird grundsätzlich ein Webserver benötigt, welcher als Kommunikationsvermittler zwischen dem Webbrowser und den APEX-Objekten in der Oracle Datenbank dient (Web-Listener). Neben dem Embedded PL/SQL Gateway, bei der die Datenbank selber die Aufgabe des Webservers übernimmt, kann man dafür den Oracle HTTP Server (Apache mit mod_plsql) oder die Oracle REST Data Services (ORDS) verwenden. Die Nutzung des Embedded PL/SQL Gateway, obwohl schnell einzurichten, wird aus Performancegründen nicht empfohlen. Außerdem ist das Embedded PL/SQL Gateway nicht failoverfähig.

Die Software Oracle REST Data Services (ORDS), welche diverse REST-Webservices bereitstellt, beinhaltet ebenfalls den APEX Listener, der hier die Aufgabe des Webservers übernimmt. Die Verwendung des APEX Listener für den Zugriff auf APEX Anwendungen ist die von Oracle empfohlene Methode.

Dieser Blog-Beitrag widmet sich der Beschreibung einer schlanken Installation und Konfiguration von ORDS, um einen Webserver für eine in der Oracle Datenbank befindliche APEX-Anwendung bereitzustellen. Sprich, es werden keine RESTful Web Services installiert und keine für diesen Zweck unnötigen Schemata in der Datenbank erstellt. Des Weiteren wird auf die Einrichtung einer Failoverkonfiguration eingegangen, welche bei der Verwendung von z.B. Oracle Data Guard notwendig ist, um automatisch bei Ausfall der primären Datenbank mit den Webanfragen auf die dann geöffnete Standby-Datenbank zu schwenken. Um die gegebene Funktionalität auch bei einer Oracle 12c Multitenant Database Architektur zu belegen, wird in dem unten aufgeführten Beispiel eine Oracle 12c Container Datenbank für APEX genutzt. Die übrigen REST Service Funktionalitäten, die Oracle REST Data Service sonst noch bietet, sind nicht Bestandteil dieses Artikels und eher ein Entwicklerthema.

ORDS ist eine J2EE-Anwendung, welche als WAR-Archiv zur Verfügung gestellt wird und kann grundsätzlich in jedem J2EE-konformen Application Server installiert werden. Von Oracle voll supported wird Oracle WebLogic, Oracle Glassfish und Apache Tomcat. Es besteht die Möglichkeit ORDS auch ohne die Verwendung eines Application Servers zu installierten (Standalone). Dies wird aber für produktive Umgebungen seitens Oracle nicht empfohlen. Die untersützten Versionen und Vorraussetzungen können der Oracle Dokumentation entnommen werden.

Basis-Architektur

Zielstellung

Auf eine APEX-Anwendung innerhalb der Container Datenbank CDB1 (hier Pluggable Database PDB) soll vom einem Webbrowser aus über einen Oracle REST Data Service (ORDS / Apex Listener) zugegriffen werden. Die Container Datenbank CDB1 wird mit Hilfe von Oracle Data Guard mit der Standby Datenbank CDB2 synchronisiert. Die Standby Datenbank CDB1 ist im Normalbetrieb nicht geöffnet. Im Failover-Fall, sprich bei Ausfall der Primary Datenbank CDB1 und dann anschließendes Öffnen der Standby Datenbank CDB2, soll Oracle REST Dataservices (ORDS / Apex Listener) automatisch die APEX-Anwendung in der nun geöffneten CDB2 adressieren, um Kontinuität der Anwendung gegenüber dem Benutzer sicherzustellen.

Vorgehen

  • Download der Software Tomcat, JDK und ORDS
  • Installation Tomcat und JDK
  • Vorbereitung der Oracle Datenbank, die die APEX-Anwendung beinhaltet
  • Installation und Konfiguration des ORDS
  • Deployment des konfigurierten APEX Listener im Tomcat
  • JDBC-Failover-Verbindung konfigurieren

Hinweis: Die nachfolgend geschilderte Installation wurde auf einem Linuxsystem durchgeführt. Eine Installation auf Unix oder Windows ist selbstverständlich auch möglich.

1. Download der Software Tomcat, JDK und ORDS

Die hier vorgestellte Installation wird mit folgender Software durchgeführt.

Software auf den Server, der den APEX Listener bereitstellen soll ablegen (z.B. unter /tmp).

2. Installation Tomcat und JDK

User tomcat erstellen und Passwort festlegen.

useradd tomcat
passwd tomcat

JDK unter dem Benutzer tomcat installieren.

mkdir -p /u01/app/
chmod o+rwx /u01/app/
su - tomcat
cd /u01/app/
tar xzf /tmp/jdk-8u60-linux-x64.tar.gz
mv /u01/app/jdk1.8.0_60 jdk /u01/app/jdk

Tomcat unter dem Benutzer tomcat installieren.

tar xzf /tmp/apache-tomcat-8.0.27.tar.gz
mv /u01/app/apache-tomcat-8.0.27 /u01/app/tomcat

Umgebungsvariablen im OS Profil des Users tomcat anlegen und laden.

echo 'export JAVA_HOME=/u01/app/jdk' >> /home/tomcat/.bash_profile
echo 'export CATALINA_HOME=/u01/app/tomcat' >> /home/tomcat/.bash_profile
echo 'export CATALINA_BASE=$CATALINA_HOME' >> /home/tomcat/.bash_profile
source /home/tomcat/.bash_profile

Tomcat starten

/u01/app/tomcat/bin/startup.sh

3. Vorbereitung der Oracle Datenbank, die die APEX Anwendung beinhaltet

Der bereits in der Datenbank angelegte Datenbankbenutzer APEX_PUBLIC_USER muss vor der Nutzung von ORDS entsperrt und außerdem ein Passwort gesetzt werden. Bei Verwendung von Multitenant muss dies in der Container Datenbank (CDB$ROOT) passieren und nicht in der Puggable Datenbank.

User APEX_PUBLIC_USER entsperren und Passwort setzen.

SQL> CONNECT SYS AS SYSDBA
SQL> ALTER USER APEX_PUBLIC_USER IDENTIFIED BY <Password> ACCOUNT UNLOCK;

Deaktivierung des Emedded PL/SQL Gateway, falls aktiv.

SQL> EXEC DBMS_XDB.SETHTTPPORT(0);

4. Installation und Konfiguration ORDS

ORDS unter dem OS Benutzer tomcat installieren.

mkdir /u01/app/ords
cd /u01/app/ords
unzip /tmp/ords.3.0.1.177.18.02.zip

ORDS Konfigurationsverzeichnis erstellen.

mkdir /u01/app/ords/config

Anschließend müssen die Parameter und Verbindungsdaten für die Datenbank in der ORDS-Konfigurationsdatei ords_params.properties gesetzt werden. Bei einer Multitenant Datenbank muss als Wert für den Parameter db.sid die Container Datenbank gesetzt werden und als Wert für den Parameter db.servicename der Servicename der Pluggable Datenbank.

Datei /u01/app/ords/params/ords_params.properties editieren.

db.hostname=odg1srv
db.port=1521
db.servicename=pdb
db.sid=cdb1
db.username=APEX_PUBLIC_USER
migrate.apex.rest=false
rest.services.apex.add=false
rest.services.ords.add=false
schema.tablespace.default=SYSAUX
schema.tablespace.temp=TEMP
standalone.http.port=8080
standalone.static.images=
user.tablespace.default=USERS
user.tablespace.temp=TEMP

ORDS mit Hilfe der vorbereiteten Parameterdatei konfigurieren.

java -jar ords.war install simple

Nachfolgende Benutzereingaben sind daraufhin notwendig.

This Oracle REST Data Services instance has not yet been configured.
Please complete the following prompts
Enter the location to store configuration data:/u01/app/ords/config
Enter 1 if you want to use PL/SQL Gateway or 2 to skip this step [1]:1
Enter the database password for APEX_PUBLIC_USER: <Passwort>
Confirm password: <Passwort>
Oct 11, 2015 4:32:43 PM   oracle.dbtools.common.config.file.ConfigurationFilesBase update
INFO: Updated configurations: defaults, apex
Enter 1 if you wish to start in standalone mode or 2 to exit [1]:2

Hinweis: Nach der Installation werden in dem bei der Installation angegebenen Konfig-Verzeichnis folgenden Dateien angelegt:

<Konfigurationsverzeichnis>/ords/default.xml
<Konfigurationsverzeichnis>/ords/conf/apex.xml

5. Deployment des ORDS im Tomcat

Um die konfigurierte ORDS-Anwendung nun im Tomcat Applicationserver bereitzustellen, muss die Datei ords.war in das Webapps-Verzeichnis von Tomcat kopiert werden.

cp /u01/app/ords/ords.war /u01/app/tomcat/webapps/

Damit die APEX Images innerhalb von Tomcat zur Verfügung stehen, müssen vom Datenbankserver die Images in das Webapps-Verzeichnis auf den ORDS-Server in den Unterordner i kopiert werden.

Packen der Images in ein Tarball-Archiv auf dem Datenbankserver.

cd $ORACLE_HOME/apex/images
tar -zcvf images.tar.gz *

Transferieren des Tarball-Archiv auf den ORDS-Server nach /tmp.

Datei images.tar.gz auf dem ORDS-Server und entpacken.

mkdir $CATALINA_HOME/webapps/i/
cd $CATALINA_HOME/webapps/i/
tar xzf /tmp/images.tar.gz

Tomcat durchstarten.

/u01/app/tomcat/bin/shutdown.sh
/u01/app/tomcat/bin/startup.sh

Hinweis: Beim Start vom Tomcat wird das War-Archiv in ein neu erstellte Unterverzeichnis ords im Webapps-Verzeichnis entpackt.

Anschließend kann der Zugriff auf die Apex Login Seite getestet werden.
http://<host>:<port>/ords/apex

Beispiel:
http://app1srv:8080/ords/apex

6. JDBC-Failover-Verbindung konfigurieren

Die nun eingerichtete Verbindung zur Datenbank ist für eine Data Guard Umgebung nicht ausreichend, da die Verbindung noch nicht auf die Standby Datenbank umschwenkt, falls die primäre Datenbank ausfällt. Für diesen Zeck muss die Verbindung wie folgt auf eine Verbindung mit dem JDBC-Thin Treiber von Oracle umgestellt werden.

Hierzu die Konfigurationsdatei <Konfigurationsverzeichnis>/ords/default.xml mit einem Editor öffen und folgende Zeilen entfernen.

<entry key="db.hostname">odg1srv</entry>
<entry key="db.port">1521</entry>
<entry key="db.servicename">db1</entry>

Anschließend den Key db.connectionType und db.customURL hinzufügen.

<entry key="db.connectionType">customurl</entry>
<entry key="db.customURL">jdbc:oracle:thin:@<CONNECT STRING></entry>

Als „<CONNECT STRING>“ muss dann der gwünschte Connect String eingefügt werden, der die gewünschte Failover-Funktionalität beinhaltet. Dazu sind der FAILOVER Parameter und zwei ADRESS Einträge notwendig. In dem folgenden Konfigurationsbeispiel wird zunächst versucht eine Verbindung mit dem Pluggable Database Service PDB auf dem Primary-Host odg1srv herzustellen (Primary). Schlägt der Versuch fehl, so wird probiert den Service auf dem Standby-Host odg1srv zu erreichen.
Beispiel:

<entry key="db.connectionType">customurl</entry>
<entry key="db.customURL">jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=odg1srv)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=odg2srv)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=pdb)))</entry>

Damit die Umstellung wirkt, muss Tomcat durchstarten werden.

/u01/app/tomcat/bin/shutdown.sh
/u01/app/tomcat/bin/startup.sh

Wenn alles eingerichtet ist, sollte der Webbrowser-Zugriff auf die APEX-Anwendung vor und nach einem Failover/Switchover der Datenbank getestet werden.

Tipp 1: Customizing der URL

Der Zugriff auf eine Apex-Anwendung über ORDS erfolgt bekanntermaßen über folgende URL.

http://<host>:<port>/ords/f?p=<Application ID>

Beispiel:
http://app1srv:8080/ords/f?p=100  

Möchte man anstelle von „ords“ einen anderen Namen, z.B. den Anwendungsnamen, in der URL nutzen, so lässt sich die ganz einfach durch Umbenennung der Datei ords.war vor der Installation/Konfiguration erreichen.

mv /u01/app/ords/ords.war /u01/app/ords/myapp.war # java -jar myapp.war install simple

URL:
http://<host>:<port>/myapp/f?p=<Application ID>

Beispiel:
http://app1srv:8080/myapp/f?p=100

Tipp 2: Betrieb von mehreren ORDS auf einem Server

Ebenso ist es möglich mehrere ORDS parallel auf einem Host zu betreiben, indem man diese in Unterschiedliche Verzeichnis installiert und ebenfalls anders benennt.

ORDS 1  installieren

mkdir /u01/app/ords1
cd /u01/app/ords1
unzip /tmp/ords.3.0.1.177.18.02.zip

mv /u01/app/ords1/ords.war /u01/app/ords1/ords1.war
java -jar ords1.war install simple

ORDS 2 installieren

mkdir /u01/app/ords2
cd /u01/app/ords2
unzip /tmp/ords.3.0.1.177.18.02.zip

 mv /u01/app/ords2/ords.war /u01/app/ords2/ords2.war
java -jar ords2.war install simple

Das Deployment erfolgt analog der oben beschriebenen Vorgehensweise.

 

Hersteller-Dokumentation

Oracle REST Data Services Documentation Release 3.0

 

One thought on “Oracle Apex Listener (ORDS) in einer Failover- und Multitenant-Architektur

  1. Niels de Bruijn

    Gut geschrieben! Diese Konfiguration haben wir letzte Woche genau so implementiert. Jetzt haben wir die passende Doku dazu. Vielen Dank. 🙂

    Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.