Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability

Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability

Σε προηγούμενο άρθρο είχαμε δει πώς ενεργοποιούμε το Oracle Data Guard σε physical standby. Τώρα θα προχωρήσουμε την εγκατάσταση ένα βήμα παρακάτω με σύγχρονο commit που θα μας επιτρέψει να ενεργοποιήσουμε το automatic failover από το primary στο standby και αντίστροφα, χωρίς την δική μας παρέμβαση.

Η τεχνολογία αυτή ονομάζεται Oracle Data Guard Fast Start Failover και παρακάτω φαίνεται το διάγραμα της υποδομής της:

Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
01 (docs.oracle.com)

Η διαφορά με το απλό Oracle Data Guard σε physical standby είναι ότι το commit γίνεται σύχρονα, δηλαδή για να περαστεί επιτυχώς μια συναλλαγή στο primary θα πρέπει πρώτα να έχει περαστεί στο standby. Επίσης για να ενεργοποιηθεί η δυνατότητα του automatic failover πρέπει σε κάποιο site να τρέχει ένας observer ο οποίος καταγράφει την επικοινωνία και προς τα δύο sites (primary, standby).

Προαπαιτούμενα

Για αρχή θα πρέπει να έχουμε ακολουθήσει όλα τα βήματα για την δημιουργία ενός Oracle Data Guard με physical standby. Το πώς μπορούμε να το κάνουμε, θα το δούμε βήμα βήμα στο άρθρο εδώ.

Επίσης αν το μηχάνημα που εγκατασταθεί ο observer είναι διαφορετικό θα πρέπει να έχει γίνει εγκατάσταση του Oracle Database Software ή του Oracle Database Client. Όπως επίσης να περαστούν οι εγραφές στο tnsnames.ora όπως έχουν περαστεί στα άλλα δύο sites.

Η εγκατάσταση

Συνδεόμαστε από το primary (oradev1) στον broker:

dgmgrl "sys/Kwdikos1!"@ORADEV

Κάνουμε disable το configuration του Data Guard αν δεν είναι ήδη:

disable configuration;

Αλλάζουμε το log transport σε σύγχρονο και τον χρόνο που περιμένει να ενημερωθεί η standby (net timeout) από 30 σε 10 δευτερόλεπτα.

edit database oradev set property 'LogXptMode'='sync';

edit database oradevdr set property 'LogXptMode'='sync';

edit database oradev set property 'Nettimeout'=10;

edit database oradevdr set property 'Nettimeout'=10;

Στη συνέχεια αλλάζουμε το protection mode από Max Performance σε Max Availability.

edit configuration set protection mode as maxavailability;

Ενεργοποιούμε το configuration, αφού πρώτα δούμε ότι το configuration δεν μας εμφανίζει κάποιο error:

show configuration verbose;

enable configuration;

Έπειτα ενεργοποιούμε το Fast Start failover:

enable fast_start failover;

Στο τέλος συνδεόμαστε από τον server που θα τρέχει τον observer:

dgmgrl "sys/Kwdikos1!"@ORADEVDR

Και ξεκινάμε τον observer:

start observer;

Μπορούμε να τον τρέξουμε σαν background process στο Unix με την παρακάτω εντολή:

nohup dgmgrl "sys/Kwdikos1!"@ORADEVDR "start observer file='$HOME/fsfo.dat'" -logfile $HOME/observer.log &

Όπως επίσης μπορούμε να παρακολουθούμε το log του observer για τις ενέργειες του και σφάλματα:

tail -f $HOME/observer.log
Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
02

Αν τώρα δούμε το configuration θα δούμε ότι τρέχει δίχως προβλήματα:

dgmgrl "sys/Kwdikos1!"@ORADEV
show configuration verbose;
Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
03

Πώς δοκιμάζουμε αν λειτουργεί το automatic failover

Πολύ απλά μπορούμε να πάμε στον primary και να κάνουμε kill το service του process monitor της Oracle:

ps -ef |grep pmon

Αφού βρούμε το process number το κάνουμε kill:

kill -9 6188
Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
04

Εναλλακτικά τρέχουμε από sqlplus το παρακάτω command:

shutdown abort;

Αν μετά δούμε τον log του observer θα δούμε ότι δεν μπορεί να επικοινωνήσει με τον primary και μέσα σε 30 δευτερόλεπτα που είναι η default τιμή για timeout και failover γύρισε στο standby (oracledevdr):

Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
05

Όταν μετά πάμε και σηκώσουμε το service του primary (oracledev1) σε mount state:

sqlplus / as sysdba
startup mount;

Θα δούμε στο log του observer ότι μετά από λίγο έκανε connect στη βάση και την έκανε reinstate με τα δεδομένα από το standby που είναι προσωρινά primary:

Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
06

Όταν ολοκληρωθεί το reinstate μπορούμε άνα πάσα στιγμή να γυρίσουμε στο primary site:

dgmgrl "sys/Kwdikos1!"@ORADEVDR
switchover to oradev;

Πώς συνδεόμαστε αυτόματα σε όποιο site είναι ενεργό

Με την χρήση του Transparent Application Failover μπορούμε μέσω εγγραφής στο tnsnames.ora να συνδεθούμε αυτόματα στο standby σε περίπτωση που πέσει το primary.

Στο tnsnames.ora όμως δεν πρέπει να κάνουμε χρήση του ονόματος της βάσης ως service_name, καθώς αν το κάνουμε αυτό δεν θα συνδέεται μόνο σε όποιο instance είναι το primary αυτή τη στιγμή αλλά σε οποιοδήποτε έχει ανεβασμένο τον listener της βάσης. Αυτό θα δημιουργήσει πρόβλημα όταν η standby μπορεί να είναι ανοιχτή για ανάγνωση (Active Data Guard) ή αν γίνει cold Failover καθώς έπεσε ξαφνικά το process της Oracle με τον listener της βάσης να είναι ακόμα πάνω.

Για να ξεπεράσουμε αυτό το πρόβλημα θα πρέπει να πάμε στο primary (oracledev1) και να φτιάξουμε ένα Dynamic Service. Η δουλεία του θα είναι να ξεχωρίζει ποιά βάση έχει τον primary ρόλο και θα μας βοηθήσει ώστε να είμαστε πάντα συνδεδεμένοι στην σωστή. Είναι δυναμικό καθώς θα ανεβαίνει με trigger μόνο όποτε η βάση έχει τον primary ρολό.

Τα βήματα

Πρώτα φτιάχνουμε το service όριζοντας το όνομα του και ότι πρόκειται για high availability μέσω Fast Application Notification (FAN) με την παράμετρο aq_ha_notifications:

begin
dbms_service.create_service('oradev_primary','oradev_primary',aq_ha_notifications=>true,failover_method=>'BASIC',failover_type=>'SELECT',failover_retries=>120,failover_delay=>1);
end;

/

Δοκιμάζουμε να ξεκινήσουμε το service που φτιάξαμε:

begin
 dbms_service.start_service('oradev_primary');
end;

/

Αφού ξεκινήσει χωρίς πρόβλημα μπορούμε να φτιάξουμε και το start-up trigger που θα ξεκινάει το service:

create or replace trigger start_oradev_primary_service after startup on database
declare
	role varchar(50);
begin
	select database_role into role from v$database;
	if role='PRIMARY' then
		dbms_service.start_service('oradev_primary');
	else
		dbms_service.stop_service('oradev_primary');
	end if;
end;

/

Δεν χρειάζεται να επαναλάβουμε την διαδικασία στην standby καθώς θα μεταφέρει τις ρυθμίσεις του service μόνο του το Data Guard.

Τώρα μπορούμε να πάμε στο tnsnames.ora και να προσθέσουμε την παρακάτω εγγραφή διαμορφώνοντας ανάλογα τα hosts και το service_name με αυτό που μόλις φτιάξαμε:

ORADEV_TAF =
  (DESCRIPTION = 
    (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
    (FAILOVER = ON)
    (LOAD_BALANCE = OFF)
    (ADDRESS_LIST =    
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracledev1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracledev2)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oradev_primary)
    )
  )

Πώς αφαιρούμε το Data Guard με Fast-Start Failover

Aν θέλουμε να αφαιρέσουμε το Data Guard τελείως τότε:

dgmgrl "sys/Kwdikos1!"@ORADEV
disable fast_start failover force;
disable configuration;
remove configuration;
exit;
sqlplus / as sysdba
alter system set dg_broker_start=false;

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση