Oracle sekvence u RAC bazi

Tuesday, 09.09.2008 – Dejan

Po┼íto aktivno nadgledam bazu (RAC baza sa dvije instance), primijetio sam u odre─Ĺenim situacijama u─Źestala “usporenja“, odnosno “wait events“, koja su se odnosila isklju─Źivo na RAC i interkonekciju izme─Ĺu RAC instanci.

Prvo da vas smorim suhoparnom teorijom, pa ─çu detaljno pojasniti “problem” i dati rje┼íenje…

Radi odr┼żavanja skalabilnosti i konzistentnosti podataka u bazi, obe instance ┼íalju podatke jedna drugoj preko zajedni─Źke interkonekcije (preko privatnih IP adresa), nastoje─çi da sadr┼żaj u database buffer cacheu bude gotovo identi─Źan. Zbog toga se preko interkonekcije prenose svi kori┼íteni podaci na nivou database blokova.

E ba┼í zbog tog u─Źestalog prenosa podataka sa jedne instance na drugu i obrnuto, dolazi do “zagu┼íenja”, odnosno do u─Źestalog usporenja u radu odre─Ĺenih aplikacija. Naj─Źe┼í─çi “wait events” su “global cache wait events“: “gc cr request“, “gc cr block2-way“, “gc current block 2-way” i “gc buffer busy“.

Kao ┼íto napisah, ta usporenja su najuo─Źljivija kod aplikacija, koje prilikom unosa ve─çe koli─Źine podataka koriste sekvence za generisanje jedinstvenih ID-eva (npr. logovanje pojedinih operacija ili generisanje ID-eva za vje┼íta─Źki/surogatni Primary Key).

Postoje─çe stanje
Kreirana je sekvenca za generisanje surogatnog primarnog klju─Źa u jednoj Logging-tabeli:

CREATE SEQUENCE SEQ_APPLICATION_LOG
  START WITH 1
  MAXVALUE 9999999999999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  ORDER;

Kreiran je BEFORE INSERT Trigger, koji za svaki red popunjava taj surogatni ID trenutnom vrijednošću, koju vraća gorenavedena sekvenca:

CREATE OR REPLACE TRIGGER TRG_APPLICATION_LOG
  before insert on TB_APPLICATIONS_LOG
  for each row
declare
  -- local variables here
begin
  SELECT SEQ_APPLICATION_LOG.NEXTVAL
  INTO :NEW.LOG_ID
  FROM DUAL;
end TRG_APPLICATION_LOG;
/

Kada se paralelno pokrenu aplikacije, koje se izvr┼íavaju na razli─Źitim instancama i loguju pojedina─Źne operacije, onda dolazi do ping-pong prenosa podataka preko interkonekcije.
Zna─Źi, za svaku generisanu vrijednost iz sekvence, trenutna instanca preko interkonekcije ┼íalje drugoj instanci obavijest, da je generisana ta i ta vrijednost, kako druga instanca ne bi generisala identi─Źnu vrijednost i time ugrozila konzistentnost podataka.

Npr. sekvenca na prvoj instanci generi┼íe vrijednost 2 i ┼íalje drugoj instanci obavijest, da je trenutna vrijednost 2 (CURRVAL) i da je idu─ça slobodna vrijednost na raspolaganju broj 3 (NEXTVAL). I sad zamislite da se u sekundi generi┼íe stotine takvih vrijednosti i da svaka instanca mora obavijestiti drugu o tim generisanim vrijednostima… Naravno da ─çe do─çi do zagu┼íenja i laganog usporenja…

Dakle, u ─Źemu je konkretno problem?
Klju─Ź problema le┼żi u sekvenci, odnosno u njenom atributu NOCACHE. U gorenavedenoj sekvenci stoji NOCACHE, zbog ─Źega se vrijednost generi┼íe po potrebi, a ne unaprijed. Da se generi┼íu unaprijed (npr. CACHE 500), onda bi svaka instanca generisala 500 vrijednosti odjednom i SAMO JEDNOM obavijestila drugu instancu o generisanim vrijednostima. Time se spre─Źava suvi┼íno ping-pong obavje┼ítavanje u NOCACHE slu─Źaju i smanjuje se broj “usporenja”, odnosno “global cache events”.

CACHE vrijednost defini┼íite u zavisnosti od raspolo┼żive RAM memorije. Op┼íta formula ne postoji, ali iz mog iskustva bih mogao empirijski napisati magi─Źnu formulu:

CACHE broj = RAM Gigabyte * 20

Zna─Źi za nekih 16 GB RAM-a bi trebalo postaviti CACHE na 320, tj. izme─Ĺu 300 i 400. Mi imamo 50 GB RAM-a na raspolaganju za Oracle instance, pa smo sekvence kreirali sa CACHE 1000, nakon ─Źega se broj “gc *” usporenja drasti─Źno smanjio.

CREATE SEQUENCE SEQ_APPLICATION_LOG   
  START WITH 1   
  MAXVALUE 9999999999999999999   
  MINVALUE 1   
  NOCYCLE   
  CACHE 1000
  ORDER;

  1. 4 Responses to “Oracle sekvence u RAC bazi”

  2. Pozdrav!

    Skinuo si mi sate i sate citanja…
    Do groba zahvalan ­čÖé

    By noctua4u on Sep 9, 2008

  3. @noctua: E, siguran sam da bi i ti iz svog iskustva sa Oracleom mogao da napi┼íe┼í neke korisne savjete i trikove za pobolj┼íanje performansi, pa kad bude┼í imao vremena i volje, objavi ne┼íto na svom blogu. ­čÖé

    By Dejan on Sep 11, 2008

  4. Pogledaj ovaj white paper..

    Managing Sequences in a RAC Environment by Joel Goodman …

    http://www.oracleracsig.org/pls/apex/RAC_SIG.download_my_file?p_file=1002080

    By Miladin on Feb 24, 2009

  5. @Miladin: Hvala za link! To je takodje odlican tekst o sekvencama u Oracle bazi.

    By Dejan on Feb 26, 2009

Post a Comment