Follow Us on Twitter

SOdA - Service Oriented data Acces

Gepubliceerd in

Dit is geen Whitebook over Fusion middleware, SOA Suite, een ander middleware product of zelfs Java. Er wordt geen enkele hippe BPEL of webservice techniek beschreven. Aangezien Whitehorses is gespecialiseerd in integratie met de Oracle en Java technologieën, is er toch een verband. In dit Whitebook laat ik zien dat een SOA-benadering prima kan worden toegepast op de database-infrastructuur.

Elke organisatie heeft een (complex) applicatielandschap (legacy, SOA, Java etc). Al deze toepassingen leggen gegevens vast in een database. Met een SOA aanpak kan flexibiliteit in het applicatielandschap worden aangebracht, zodat sneller gereageerd kan worden op veranderende omstandigheden, zoals bijvoorbeeld wijzigende wetgeving. Zou het niet prettig zijn, als de onderliggende database ook meer flexibiliteit toont?

In de Oracle database bevindt zich een waardevol en onderschat stukje techniek, dat daarbij gaat helpen. De techniek is beschikbaar sinds Oracle 8i en vanaf Oracle 10g is het ondergebracht bij Automatic Workload Management. Het gaat om de database services feature, die door Oracle wordt ingezet om workload management te realiseren in een cluster database (RAC). Maar dat betekent niet dat RAC nodig is om database services op andere manieren in te zetten.

Wat zijn database services?

Een database service is een logische abstractie in de database instance ten behoeve van het beheren van workloads en dient als de virtuele kapstok om prioriteiten, service levels en gemeenschappelijke workload attributen te groeperen. Denk aan een applicatie(module) met gemeenschappelijke attributen (bijvoorbeeld batch, oltp, query only). Services geven de mogelijkheden om een database logisch op te delen en voegt locatie transparantie toe aan de data. Neem bijvoorbeeld de SOA Suite 10g applicatie, waarin drie applicaties (BPEL, ESB en OWSM) zijn ondergebracht. De bijbehorende database kunnen opgedeeld worden in BPEL-, ESB- en OWSM-services.

Het beschikbaar stellen van de applicatie gegevens via een service maakt het mogelijk om de fysieke database en de database instance te virtualiseren. Het ontkoppelen van de applicatie van de database implementatie bewerkstelligt controle over waar en wanneer een verbinding gelegd mag worden en daarmee toegang tot de applicatiedata.

De mogelijkheid om zelf te bepalen waar een service beschikbaar is, wordt al toegepast in Data Guard en RAC omgevingen. Maar zoals eerder al aangegeven, hoeft het gebruik hiervan niet te worden beperkt tot deze beschikbaarheidoplossingen. Stel dat de data van een applicatie verplaatst moet worden naar een andere database of zelfs een andere machine, zonder dat de applicatie of module (cq client) wordt aangepast. Het gebruik van services maakt de acties die uitgevoerd moeten worden een stuk eenvoudiger. Hieronder volgt een simpele uitwerking van de voorgestelde oplossing.

  1. Maak een service aan in de Oracle database met de DBMS_SERVICE package (vanaf 10g).

    exec dbms_service.create_service('whrocks','whrocks');
    exec dbms_service.start_service('whrocks');
    alter system register;

    De service wordt gestart in de database instance en aangemeld bij de listener.
    Als de data wordt verplaatst naar een nieuwe database op dezelfde machine, is de wijziging minimaal. Op de oude database wordt de service gestopt en verwijderd en op de nieuwe database wordt de service aangemaakt en gestart.

    De uitdaging wordt iets groter als de nieuwe database zich op een nieuwe machine bevindt. Dat impliceert dat er iets moet gebeuren aan de kant van de applicatie. Ook dat kan worden voorkomen door gebruik te maken van de mogelijkheden van services en Oracle Net. Services kunnen vanuit de database instance ook geregistreerd worden bij listeners op andere machines. Dit worden de remote listeners genoemd.

    Door in de nieuwe database aan te geven dat services ook bij de listener van de oude machine moeten worden aangemeld, zullen verzoeken die binnen komen op de oude omgeving automatisch worden omgeleid naar de nieuwe omgeving.

  2. Configureer de remote listeners in de database.

    alter system set REMOTE_LISTENER=listeners_remote;

    Neem in het Oracle Net configuratiebestand tnsnames.ora de listeners_remote beschrijving op.

    listeners_remote=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = vbox2)(PORT = 1521)))

    Nu is op de remote listener de service bekend.

    LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 20-JAN-2012 14:04:15
    Copyright (c) 1991, 2010, Oracle.  All rights reserved.

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=vbox2)(PORT=1521)))
    Services Summary...
    ...
    Service "whrocks" has 1 instance(s).
      Instance "GLNLDBP10", status READY, has 1 handler(s) for this service...
        Handler(s):
          "DEDICATED" established:0 refused:0 state:ready
             REMOTE SERVER
             (ADDRESS=(PROTOCOL=TCP)(HOST=vbox1)(PORT=1521))
    The command completed successfully

  3. Voeg de volgende service alias toe aan de Oracle Net configuratie op de remote machine (De alias verwijst naar de machine waar de service zelf niet beschikbaar is).

    whrocks =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = vbox2)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = whrocks)
        )
      )

  4. Controleer of de nieuwe service alias werkt

    [oracle@vbox2 admin]$ tnsping whrocks
    TNS Ping Utility for Linux: Version 11.2.0.2.0 - Production on 20-JAN-2012 14:06:43
    Copyright (c) 1997, 2010, Oracle.  All rights reserved.

    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = vbox2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = whrocks)))
    OK (0 msec)

  5. Kan er ook daadwerkelijk verbinding gemaakt worden via de remote listener?
    oracle@vbox2> sqlplus sys/oracle@whrocks as sysdba

    select machine, username, program, service_name from v$session;

    MACHINE USERNAME PROGRAM                     SERVICE_NAME
    ------- -------- --------------------------- --------------
    vbox1            oracle@vbox1 (MMAN)         SYS$BACKGROUND
    vbox1            oracle@vbox1 (SMON)         SYS$BACKGROUND
    vbox1            oracle@vbox1 (DMON)         SYS$BACKGROUND
    vbox2    SYS     sqlplus@vbox2 (TNS V1-V3)   whrocks
    vbox1            oracle@vbox1 (PMON)         SYS$BACKGROUND
    vbox1            oracle@vbox1 (DBW0)         SYS$BACKGROUND

De werking van de remote listener wordt beschreven in de Oracle Net Services Administration guide.

Remote listener

De bijbehorende figuur is niet helemaal correct. De suggestie wordt gewekt, dat als een connectie wordt gemaakt naar een remote listener, deze zal functioneren als een soort proxy en het verzoek doorstuurt naar de database op de andere machine. Om een connectie te kunnen maken zal er altijd een listener lokaal op de machine bij de database actief moeten zijn. De remote listener zal antwoorden dat de client (of applicatie) opnieuw dient te verbinden, maar dan met de gegevens waar de service zich op dat moment bevindt.

Nu de netwerkcomponenten zijn beschreven, zijn er nog een aantal andere zaken waar rekening mee moeten worden gehouden. Handmatige services starten pas als de database open is en als daar expliciet opdracht toe wordt gegeven. Door middel van een database startup trigger kunnen alle relevante services geactiveerd worden. Dit is de standaard methode die wordt toegepast in bijvoorbeeld Data Guard omgevingen als er geen grid infrastructuur aanwezig is. Er is de mogelijkheid om gebruik te maken van Oracle restart, dat fungeert als een stand-alone clusterware implementatie.

Een klein stukje PL/SQL-triggercode is een stuk eenvoudiger als een complete extra clusterware installatie.

Dit is een simpel voorbeeld van een startup trigger.

CREATE OR REPLACE TRIGGER manage_services after startup on database
 
DECLARE
  role V$DATABASE.DATABASE_ROLE%TYPE;
  r_service c_services%%rowtype
BEGIN
  SELECT DATABASE_ROLE INTO role FROM V$DATABASE;
  IF role = 'PRIMARY' THEN
       DBMS_SERVICE.START_SERVICE('whrocks');
END IF;
END;
/

Om het overzicht te behouden en automatisering aan te kunnen brengen is de naamgeving van services relevant. Gebruik generieke attributen om het doel van de service (business context) te duiden, zoals applicatie acroniem, OTAP, volgnummer, database state (query, read write). Zet geen verwijzingen in de naam naar de database zelf.

Grid of Cloud?

Waarom zouden we niet alle machines en listeners met elkaar verbinden? Als we nu alle listeners op alle machines met elkaar koppelen creëren we een soort Data Service Grid. Maar de term Grid is wel wat ouderwets. Misschien is de term Data Service Cloud beter.

Data Service Cloud

Er is geen strikte definitie wat Cloud betekent, maar Oracle volgt de Wikipedia definitie. De mogelijkheden zijn aanwezig om elasticiteit aan te brengen.

We gaan nog een stap verder. Toegang is gevirtualiseerd, maar hoe beheren kunnnen de beschikbare resources van de database instance zelf worden beheerd?
Database services zijn geïntegreert met onder andere de Database Resource Manager, Oracle Scheduler, Edition-based Redefintion en performance tuning gereedschappen,

Resource management

Tegenwoordig kan voor een relatief klein bedrag al een zeer krachtig systeem worden aangeschaft. Plaats daarop een Linux distributie zoals Oracle Enterprise Linux, waarbij naast de Redhat kernel ook de snellere Oracle Unbreakable Enterprise kernel beschikbaar is. De Database Resource manager kan worden ingezet om de beschikbare resources naar wens te verdelen over de aanwezige database services, waardoor consolidatie van applicatiedata nog eenvoudiger wordt.

Lifecycle management

In Oracle 11g is er een nieuwe feature toegevoegd, genaamd Edition-based redefinition. Het uitrollen van een nieuwe versie van een applicatie is nu mogelijk, terwijl deze nog in gebruik is. Dit is natuurlijk een perfecte match voor integratie met services. Vanaf release 11.2.0.2 is dat ook daadwerkelijk gerealiseerd en kan aan een service een edition gekoppeld worden. Wanneer een nieuwe edition is aangemaakt en de release is uitgerold, is een aanpassing van de service voldoende om nieuwe sessies hierop te laten werken. Reeds bestaande sessies zullen blijven werken met de vorige edition.

Monitoring

Wanneer een aantal applicaties in een database is geconsolideerd, wil je bij eventuele performanceproblemen snel kunnen achterhalen waardoor het probleem wordt veroorzaakt. Per sessie wordt er een schat aan informatie bijgehouden in de Automatic Workload Repository (AWR,onderdeel van performance pack). Omdat database services centraal staan in Automatic Workload Management, zijn deze natuurlijk ook hier geïntegreerd. In Enterpise Manager kan je een overzicht krijgen van het gebruik van resources verdeeld over de services.

Service Monitoring

Onderdeel van het beheren van de database, is ook het uitvoeren van gerichte onderzoeken naar performance problemen in de database. Middels de package DBMS_MONITOR kan onder andere op het niveau van services SQL tracing worden geactiveerd. Als het lastig wordt om een individuele sessie te isoleren, dan biedt deze optie, eventueel samen met module_name en action, de mogelijkheid om diepgaande informatie te vergaren over het gedrag van de sessies gekoppeld aan de service.

EXECUTE dbms_monitor.serv_mod_act_trace_enable (service_name=>'whrocks');

In de view DBA_ENABLED_TRACES wordt getoond welke traces geactiveerd zijn. Het is wel verstandig om deze view in de gaten te houden. Vergeet een keer de trace uit te schakelen en er komt een moment dat een filesysteem gaat vollopen.

Ook kan je performancestatistieken verzamelen en aggregeren, specifiek voor bepaalde services in combinatie met modules. In plaats van de standaard verzameling statistieken in de AWR op basis van sessies, worden de statistieken gebundeld per service en module. Dit biedt de mogelijkheid om statistieken te bundelen op basis van business context. Deze statistieken zijn beschikbaar in de view v$serv_mod_act_stats. Belangrijk om te onderkennen is dat de informatie verloren gaat bij een herstart. Dat is eenvoudig op te lossen door de informatie zelf op te slaan in de database.

EXECUTE dbms_monitor.serv_mod_act_stat_enable
    (service_name=>'whrocks',module_name=>'granite');

Samenvattend

De basiselementen voor de opzetten van een data service gerichte omgeving zijn aanwezig en eenvoudig in te richten. Het is relatief simpele technologie die ook zeer goed toepasbaar is kleine en grote omgevingen. De beschreven techniek lijkt in veel aspecten op een RAC omgeving, maar dan zonder de extra complexiteit en kosten van clustering. Er zijn vele mogelijkheden te bedenken, hoe je het service concept verder kan uitbuiten (denk bijvoorbeeld aan query farms, private database clouds).

Als afsluiting nog een mooi citaat: Simplicity is a great virtue but requires hard work to achieve & education to appreciate it. To make matters worse: complexity sells better. (bron: Edsger W. Dijkstra, uit On the nature of Computing Science.

Referenties

Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.