Η καθυστέρηση εγγραφής εκτοξεύτηκε αφού ένα αντίγραφο μετακινήθηκε στη δεύτερη τοποθεσία, και η σήραγγα είναι το νεότερο συστατικό, οπότε παίρνει την ευθύνη. Η σήραγγα μπορεί να είναι αθώα: μέσα σε μια ομάδα διαθεσιμότητας με σύγχρονη δέσμευση το κύριο δεν μπορεί να επιβεβαιώσει μια δέσμευση πριν ολοκληρωθεί μια απομακρυσμένη εγγραφή καταγραφής, άρα κάθε συναλλαγή πληρώνει μια διαδρομή μετ' επιστροφής όσα megabit κι αν μεταφέρει ο σύνδεσμος. Η ρυθμαπόδοση μετρά byte ανά δευτερόλεπτο, η καθυστέρηση μετρά πόσο διαρκεί μια ανταλλαγή, και μια δέσμευση χρειάζεται μόνο μια μικρή ανταλλαγή για να ολοκληρωθεί. Ένας αριθμός λύνει τη διαφωνία: η διάρκεια δέσμευσης μιας μικρής συναλλαγής, μετρημένη μέσα στη βάση δεδομένων διαθεσιμότητας και ξανά απέναντι σε έναν τοπικό πίνακα στο ίδιο στιγμιότυπο.

Τι περιμένει πραγματικά το κύριο

Με σύγχρονη δέσμευση το κύριο κρατά την επιβεβαίωση της δέσμευσης μέχρι ο συνεργάτης να επιβεβαιώσει ότι οι εγγραφές καταγραφής του έχουν σκληρυνθεί. Σκληρυμένες σημαίνει γραμμένες διαρκώς στο αρχείο καταγραφής συναλλαγών του δευτερεύοντος, όχι ξαναεκτελεσμένες στις σελίδες δεδομένων του. Το redo μπορεί να μείνει πίσω κατά λεπτά χωρίς να προσθέσει ούτε ένα χιλιοστό του δευτερολέπτου στη δέσμευση του κύριου.

Η τεκμηρίωση της Microsoft για τους τρόπους διαθεσιμότητας περιγράφει αυτή τη χειραψία και τι κάνει η πλατφόρμα όταν ένας συνεργάτης πέσει έξω. Ένα αντίγραφο που έχει σημανθεί ως σύγχρονο είναι ένας κανόνας για την αναμονή, όχι μια μόνιμη υπόσχεση ότι υπάρχει υγιές απομακρυσμένο αντίγραφο για κάθε δέσμευση. Η αποσυνδεδεμένη διαδρομή ορίζεται χωριστά, και δεν είναι απλώς ότι η δέσμευση αποτυγχάνει.

Άρα η αναμονή που βλέπετε είναι άθροισμα: μεταφορά καταγραφής, χρονοπρογραμματισμός στους δύο hosts και η εγγραφή στον απομακρυσμένο χώρο αποθήκευσης. Ένα δευτερεύον με κορεσμένο όγκο καταγραφής προσθέτει χρόνο που κανένα τεστ ταχύτητας δεν θα δείξει. Αυτός ο δίσκος σπάνια μετριέται όταν η καταγγελία αναφέρει το VPN.

Το εύρος ζώνης δεν είναι καθυστέρηση διαδρομής μετ' επιστροφής

Ένα τεστ ταχύτητας πλημμυρίζει προσωρινά τη διαδρομή και αναφέρει έναν ρυθμό. Μια δέσμευση ζητά κάτι στενότερο: πόσο χρόνο χρειάζεται ένα μικρό μήνυμα για να φτάσει στην άλλη πλευρά, να αποθηκευτεί και να επιστρέψει. Το μήκος της διαδρομής, η ουρά και η απώλεια πακέτων καθορίζουν αυτόν τον αριθμό, και κανένα από αυτά δεν βελτιώνεται όταν ο πάροχος ανεβάζει το όριο.

Μια «γρήγορη» σήραγγα μπορεί επομένως να προσθέσει ορατό πρόστιμο σε ένα φορτίο εργασίας βαρύ σε εγγραφές, φτιαγμένο από πολλές μικρές διαδοχικές συναλλαγές. Το ίδιο σύνολο byte μοιρασμένο σε χίλιες δεσμεύσεις πληρώνει τη διαδρομή μετ' επιστροφής χίλιες φορές· μια μαζική μεταφορά την πληρώνει μία φορά.

Ζητήστε από τον ιδιοκτήτη του δικτύου καθυστέρηση και απώλειες μετρημένες πάνω στην ίδια τη διαδρομή του αντιγράφου υπό αντιπροσωπευτικό φορτίο. Ένα ping από φορητό γραφείου προς την πύλη VPN, ή ένα τεστ ταχύτητας προς έναν κοντινό κόμβο, δεν αποδίδει σχεδόν τίποτα στη διαδρομή που πραγματικά ταξιδεύει η καταγραφή. Φροντίστε το παράθυρο μέτρησης να επικαλύπτεται με τις ώρες που η εγγραφή είναι αργή.

Διαβάστε την κατάσταση του αντιγράφου πριν αλλάξετε οτιδήποτε

Ξεκινήστε από ό,τι αναφέρουν τα στιγμιότυπα για τον εαυτό τους, γιατί οι δύο πλευρές μπορεί να διαφωνούν για το πόσο υγιής είναι η συνεργασία και ένας μέσος όρος του πίνακα ελέγχου κρύβει ποια ουρά κινείται. Τα ερωτήματα παρακάτω απαντούν σε διαφορετικά ερωτήματα: το ένα διαβάζει την κατάσταση αναπαραγωγής ανά βάση δεδομένων, το άλλο διαβάζει πώς είναι διαμορφωμένο κάθε αντίγραφο. Εκτελέστε και τα δύο πριν αγγίξετε έναν τρόπο.

SELECT ag.name AS ag_name, drs.database_id, drs.synchronization_state_desc,
       drs.log_send_queue_size, drs.redo_queue_size, drs.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states AS drs
JOIN sys.availability_groups AS ag ON ag.group_id = drs.group_id;

SELECT ar.replica_server_name, ar.availability_mode_desc, ar.failover_mode_desc
FROM sys.availability_replicas AS ar;

Το πρώτο αποτέλεσμα χωρίζει τη μεταφορά καταγραφής από το redo. log_send_queue_size ανεβαίνει ενώ το redo_queue_size μένει επίπεδο σημαίνει ότι η καταγραφή δεν έφτασε· το αντίστροφο σημαίνει ότι έφτασε και η επανάληψη μένει πίσω. Μόνο η πρώτη περίπτωση βρίσκεται στη διαδρομή της δέσμευσης.

Το δεύτερο αποτέλεσμα επιβεβαιώνει ποια αντίγραφα είναι πραγματικά διαμορφωμένα όπως υποθέτετε, γιατί ένας τρόπος που άλλαξε κατά τη διάρκεια ενός προηγούμενου περιστατικού τείνει να μένει αλλαγμένος και ατεκμηρίωτος. Διαβάστε τη γραμμή που σας ενδιαφέρει αντί για την προεπιλογή της ομάδας: availability_mode_desc και failover_mode_desc είναι ανά αντίγραφο. Το secondary_lag_seconds υπάρχει μόνο σε SQL Server 2016 και νεότερο, οπότε μια παλαιότερη έκδοση σας αφήνει μόνο τις στήλες ουράς αποστολής και redo.

Στη συνέχεια μετρήστε μια αντιπροσωπευτική εγγραφή αντί να εμπιστεύεστε έναν μέσο όρο του πίνακα ελέγχου. Εκτελέστε το μπλοκ παρακάτω στη βάση δεδομένων διαθεσιμότητας και μετά εκτελέστε το ξανά απέναντι στην ίδια μορφή πίνακα σε μια βάση δεδομένων εκτός της ομάδας στο ίδιο στιγμιότυπο. Η διαφορά μεταξύ των δύο διαρκειών είναι μια πρόχειρη τιμή για την απομακρυσμένη καταγραφή, και αντέχει σε μια συζήτηση με την ομάδα δικτύου πολύ καλύτερα από ένα γράφημα. Αλλάζετε μετά μία μεταβλητή κάθε φορά, αλλιώς η διαφορά παύει να σημαίνει κάτι.

IF OBJECT_ID('dbo.CommitProbe') IS NULL
    CREATE TABLE dbo.CommitProbe (probe_id int PRIMARY KEY, touched_at datetime2(3));
IF NOT EXISTS (SELECT 1 FROM dbo.CommitProbe WHERE probe_id = 1)
    INSERT INTO dbo.CommitProbe (probe_id) VALUES (1);
SET STATISTICS TIME ON;
BEGIN TRANSACTION;
UPDATE dbo.CommitProbe SET touched_at = SYSUTCDATETIME() WHERE probe_id = 1;
COMMIT TRANSACTION;
SET STATISTICS TIME OFF;

Τι αγοράζει η ασύγχρονη δέσμευση και τι κοστίζει

Με ασύγχρονη δέσμευση το κύριο σταματά να περιμένει την επιβεβαίωση της απομακρυσμένης σκλήρυνσης, οπότε η διαδρομή μετ' επιστροφής φεύγει από τη διαδρομή της δέσμευσης. Η καθυστέρηση δέσμευσης πέφτει και το δευτερεύον είναι ελεύθερο να μείνει πίσω κατά ένα ποσό που κανείς δεν ελέγχει. Αυτή είναι μια πραγματική διόρθωση για την αναμονή και μια πραγματική αλλαγή στην υπόσχεση.

Το τίμημα είναι μια απόφαση σημείου ανάκτησης. Αν το κύριο πεθάνει πριν η καταγραφή του φτάσει σε έναν στόχο failover που μπορείτε πραγματικά να χρησιμοποιήσετε, η μετακίνηση της υπηρεσίας στο ασύγχρονο αντίγραφο πετάει συναλλαγές που η εφαρμογή είχε ήδη αναφέρει ως δεσμευμένες. Κανένα παράθυρο διαμόρφωσης δεν το παρουσιάζει έτσι, γιατί είναι επιχειρηματικό ερώτημα για αποδεκτή απώλεια, όχι ρύθμιση απόδοσης. Γράψτε το ανεκτό παράθυρο απώλειας πριν από το περιστατικό, όχι κατά τη διάρκειά του.

Συμφωνήστε τον τρόπο με όποιον κατέχει τα δεδομένα, γραπτώς, μαζί με τη διαδικασία failover για την περίπτωση που ο προτιμώμενος στόχος δεν είναι διαθέσιμος. Το σύγχρονο σε ένα έγγραφο σχεδίασης δεν είναι επιχειρησιακό εγχειρίδιο, και το ασύγχρονο δεν είναι άδεια να σταματήσετε να παρακολουθείτε τις ουρές.

Διαλέξτε μια διόρθωση που μπορείτε να υπερασπιστείτε μετά

Υπάρχουν τέσσερις έντιμες επιλογές. Κόψτε τις αποφεύξιμες διαδρομές μετ' επιστροφής δέσμευσης όπου η σημασιολογία της εφαρμογής επιτρέπει ομαδοποίηση· διορθώστε ένα μετρημένο σημείο συμφόρησης μεταφοράς ή αποθήκευσης, που μπορεί να σημαίνει ταχύτερο όγκο καταγραφής στο δευτερεύον αντί για μεγαλύτερο σωλήνα· μετακινήστε το αντίγραφο πιο κοντά ώστε να συρρικνωθεί η διαδρομή μετ' επιστροφής· ή χαλαρώστε την πολιτική προστασίας και δεχτείτε ευρύτερο παράθυρο απώλειας. Κάθε μία αγοράζει καθυστέρηση ξοδεύοντας κάτι άλλο, και η τέταρτη ξοδεύει ανθεκτικότητα. Ονομάστε το έξοδο πριν διαλέξετε.

Αποφασίστε με τον στόχο καθυστέρησης του φόρτου εργασίας και την απαίτηση ανθεκτικότητας μπροστά σας ταυτόχρονα, γιατί η βελτιστοποίηση του ενός ξοδεύει ήσυχα το άλλο. Μετά εκτελέστε ξανά την ίδια συναλλαγή που μετρήσατε πριν την αλλαγή. Μια διόρθωση που δεν μπορεί να κουνήσει αυτόν τον αριθμό είναι μια εικασία που φοράει δελτίο αλλαγής.

Κρατήστε τις μετρήσεις πριν και μετά στο αρχείο αλλαγών. Αλλιώς το επόμενο άτομο που θα δει αργές εγγραφές επαναλαμβάνει την έρευνα από την αρχή και αρχίζει πάλι κατηγορώντας τη σήραγγα.

Σχετικά άρθρα