Πώς μπορούμε να αυξήσουμε την απόδοση στο target Replicat του Oracle GoldenGate με παραλληλία

- Πώς να γυρίσουμε μία Oracle Database πίσω στον χρόνο με χρήση restore point σε περιβάλλον Data Guard - 28 Απρίλιος 2025
- Πώς μπορούμε να αυξήσουμε την απόδοση στο target Replicat του Oracle GoldenGate με παραλληλία - 19 Μάρτιος 2025
- Πώς φτιάχνουμε χρήστες σε βάσεις δεδομένων που ανήκουν σε Always On Availability Group του SQL Server - 10 Φεβρουάριος 2025
Αν επιλέξουμε να κάνουμε το Initial Load πριν τον συγχρονισμό μέσω Replicat του GoldenGate είτε απλά το Replicat έχει να συγχρονίσει μεγάλο όγκο δεδομένων ένα Replicat thread δεν είναι αρκετό.
Σε αυτό το άρθρο θα δούμε δύο τρόπους ώστε να τρέξουμε το Replicat process με παραλληλία. Ο ένας τρόπος είναι μέσω Classic Replicat με RANGE FILTER ο οποίος έχει πολύ καλή απόδοση στο Initial Load. Ο άλλος τρόπος είναι μέσω Coordinated Replicat που προτείνεται για τον συγχρονισμό των συναλλαγών διότι προστατεύει από conflicts, blocks και deadlocks καθώς το head Coordinator process συντονίζει με την σωστή σειρά την εκτέλεση των DDL (ALTER, CREATE) και DML(UPDATE,INSERT,DELETE) actions
Classic Replicat με RANGE FILTER
Σε αυτή την λειτουργία μπορούμε κάνοντας MAP
και βάζοντας RANGE FILTER
στους πίνακες που βρίσκονται στο parameter file του κάθε Replicat να τους χωρίσουμε σε πολλαπλά partitions. Έτσι μπορούμε να φτιάξουμε πολλαπλά διαφορετικά Replicat processes που το καθένα από αυτά είναι υπεύθυνο στο να κάνει apply το συγκεκριμένο partition του πίνακα.

Αυτή η μέθοδος έχει εξαιρετική απόδοση για χρήση σε Initial Load καθώς αποτελείται από μαζικά INSERTS
. Όμως θα πρέπει να προσέξουμε γιατί αυτή η μέθοδος δεν μπορεί να χρησιμοποιηθεί στην δεύτερα φάση του συγχρονισμού που θα περνάμε συναλλαγές καθώς ότι DDL (ALTER, CREATE) και DML(UPDATE,INSERT,DELETE) action γίνεται δεν μας εγγυάται οτι θα περάσουν με την σωστή σειρά. Για αυτόν τον λόγο αν προσπαθήσουμε να περάσουμε συναλλαγές με αυτή την μέθοδο θα έχουμε conflicts, blocks, deadlocks και errors.
Coordinated Replicat
Σε αυτή την λειτουργία ορίζοντας κατά την δημιουργία του ότι πρόκειται για coordinated replicat και κάνοντας MAP
βάζοντας THREADRANGE
στους πίνακες που βρίσκονται στο parameter file του Replicat , δημιουργείτε ένα μόνο processes που ονομάζεται Replicat Coordinator, αυτό με την σειρά του δημιουργεί threads αναλόγος το THREADRANGE
που έχουμε ορίσει και αναλαμβάνει να συντονίζει την σειρά που πρέπει να τρέξει το κάθε thread ώστε οι συναλλαγές να μην έχουν conflicts, blocks, deadlocks και errors.

Οι διαφορές μεταξύ των Replicat modes

Τα προαπαιτούμενα
Για το άρθρο αυτό θεωρούμε ότι έχουμε ήδη μία ολοκληρωμένη εγκατάσταση GoldenGate.
Το πώς γίνεται η εγκατάσταση και παραμετροποίηση μπορούμε να το διαβάσουμε στο άρθρο εδώ.
Έπειτα για το παράδειγμα μας θα θεωρήσουμε ότι έχουμε κάνει τις παρακάτω ρυθμίσεις στο target για τα Extracts.
Έχουμε φτιάξει και ξεκινήσει το extract για τον συγχρονισμό τον συναλλαγών:
edit param MIS_EXT
EXTRACT MIS_EXT
USERIDALIAS GGADMIN
RMTHOST sqlserverdb.mshome.net, MGRPORT 7809
RMTFILE ./dirdat/mi, PURGE
TABLE STRATOS.CUSTOMERS;
add extract mis_ext, integrated tranlog, exttrail ./dirdat/mi, BEGIN NOW
start mis_ext
Έχουμε φτιάξει και ξεκινήσει το extract για το Initial Load:
edit param INI_EXT
EXTRACT INI_EXT
USERIDALIAS GGADMIN
RMTHOST sqlserverdb.mshome.net, MGRPORT 7809
RMTFILE ./dirdat/fe, PURGE
TABLE STRATOS.CUSTOMERS;
add extract ini_ext, sourceistable
Η εγκατάσταση του Classic Replicat με RANGE FILTER για το Initial Load
Για την εγκατάσταση του η μόνη διαφοροποίηση από ένα Replicat είναι η προσθήκη του RANGE FILTER
μετά το MAP
με ορισμό αναλόγος του πόσα Replicat Processes θέλουμε να φτιάξουμε. Για το παράδειγμα μας θα έχουμε δύο processes:
edit param IN1_REP
REPLICAT in1_rep
TARGETDB sqlserverdb, USERIDALIAS ggadmin
SOURCECHARSET PASSTHRU
BATCHSQL
REPERROR(60,TRANSABORT, MAXRETRIES 10, DELAYSECS 60)
DISCARDFILE ./dirrpt/sql_discard.txt, APPEND, MEGABYTES 50
FUNCTIONSTACKSIZE 500
MAP STRATOS.CUSTOMERS, TARGET DBO.CUSTOMERS FILTER (@RANGE(1,2));
edit param IN2_REP
REPLICAT in2_rep
TARGETDB sqlserverdb, USERIDALIAS ggadmin
SOURCECHARSET PASSTHRU
BATCHSQL
REPERROR(60,TRANSABORT, MAXRETRIES 10, DELAYSECS 60)
DISCARDFILE ./dirrpt/sql_discard.txt, APPEND, MEGABYTES 50
FUNCTIONSTACKSIZE 500
MAP STRATOS.CUSTOMERS, TARGET DBO.CUSTOMERS FILTER (@RANGE(2,2));
Πέρα από το RANGE FILTER
έχουμε προσθέσει το BATCHSQL
, το TRANSABORT
για την επανεκτέλεση συναλλαγών από timeouts / deadlocks και έχουμε μεγαλώσει το FUNCTIONSTACKSIZE
ώστε τα insert statements να τρέχουν μαζικά σε batch αυξάνοντας το performance.
Στη συνέχεια προσθέτουμε τα δύο αυτά replicat processes:
add replicat in1_rep, exttrail ./dirdat/fe add replicat in2_rep, exttrail ./dirdat/fe
Και τα ξεκινάμε:
start in*
Η εγκατάσταση του Coordinated Replicat για τον συγχρονισμό των συναλλαγών
Για την εγκατάσταση του θα φτιάξουμε μόνο ένα Replicat στο οποίο θα προσθέσουμε το THREADRANGE
που θέλουμε μετά το MAP
με ορισμό αναλόγος του πόσα threads θέλουμε να κάνουμε χρήση. Για το παράδειγμα μας θα βάλουμε οκτώ threads:
edit param mirep
REPLICAT mirep
TARGETDB sqlserverdb, USERIDALIAS ggadmin
SOURCECHARSET PASSTHRU
REPERROR(60,TRANSABORT, MAXRETRIES 10, DELAYSECS 60)
DISCARDFILE ./dirrpt/sql_discard.txt, APPEND, MEGABYTES 50
DISCARDROLLOVER AT 03:00 ON TUESDAY
REPORTROLLOVER AT 03:00 ON TUESDAY
FUNCTIONSTACKSIZE 500
HANDLECOLLISIONS
MAP STRATOS.CUSTOMERS, TARGET DBO.CUSTOMERS THREADRANGE(1-8);
Την παράμετρο HANDLECOLLISIONS
την ορίζουμε ώστε να μην έχουμε πρόβλημα με τον αρχικό συγχρονισμό με conflicts από το Initial Load, μπορούμε να το αφαιρέσουμε μετά. Αν θέλουμε να τρέχει μόνο σε ένα thread στον συγκεκριμένο πίνακα αντί για THREADRANGE
βάζουμε THREAD(1)
.
Έπειτα προσθέτουμε και ξεκινάμε το Coordinated Replicat process:
add replicat mirep, coordinated, exttrail ./dirdat/mi start mirep
Στην περίπτωση που θέλουμε να ξεκινήσουμε από συγκεκριμένο trail file και rba:
add replicat mirep, coordinated, exttrail ./dirdat/fe, extseqno=55, extrba=1292840
Όταν το ξεκινήσουμε ορίζουμε την παράμετρο FILTERDUMPTRANSACTIONS
ώστε γίνει έλεγχος στις συναλλαγές που ήδη έχουν περάσει:
start mirep FILTERDUPTRANSACTIONS
Με το που ξεκινήσει θα δούμε ότι το Coordinated Replicat δημιούργησε από κάτω του οκτώ threads:
info mirep, detail

Σε περίπτωση abnormal stop του Coordinated Replicat
Στην περίπτωση που γίνει abort ή κλείσει απρόσμενα το Coordinated Replicat, θα πρέπει πριν το ξεκινήσουμε ξανά να το συγχρονίσουμε με την εντολή synchronize
ώστε όλα τα theads να βρίσκονται στο ίδιο χρονικό σημείο:
synchronize replicat mirep
Όταν ολοκληρωθεί ο συγχρονισμός θα δούμε ότι έχει σταματήσει, τότε μπορούμε να το ξεκινήσουμε και πάλι:
start mirep