Ποτέ restart σε ένα μυστήριο: τι να καταγράψετε πριν από μια επανεκκίνηση
Ένα restart καθαρίζει το σύμπτωμα και μαζί του τα στοιχεία· σε ένα stateful σύστημα, τα πέντε λεπτά που ξοδεύονται στην καταγραφή της κατάστασης πριν, κρίνουν αν τα δεδομένα θα επιβιώσουν.
Σε αυτό το άρθρο 6 ενότητες
- Το restart μιας stateless υπηρεσίας είναι διόρθωση. Το restart μιας stateful πριν γίνει γνωστή η αιτία είναι πείραμα που τρέχει πάνω στα δεδομένα σας, και μια ακάθαρτη διακοπή είναι ο μηχανισμός με τον οποίο κάποιοι table engines καταστρέφονται.
- Ένα reboot σβήνει την κατάσταση των διεργασιών, τους ιδιοκτήτες των sockets, το ring buffer του πυρήνα και τη διάκριση ανάμεσα σε crash και σε αποτυχημένη εκκίνηση. Καταγράψτε τα πρώτα· παίρνει λεπτά.
- Snapshot πριν την επισκευή, επισκευή πριν το restore, και επαλήθευση στο όριο που απέτυχε και όχι στο «η υπηρεσία είναι πάνω».
Πού το αντανακλαστικό είναι σωστό, και πού δεν είναι
Το «κλείσ' το κι άνοιξέ το» δουλεύει σε έναν κολλημένο web worker, σε έναν κολλημένο queue consumer, σε ένα laptop. Η κατάσταση που ήταν λάθος απορρίπτεται και ξαναχτίζεται από το μηδέν, γιατί τίποτα αξίας δεν ζούσε μέσα της. Βάσεις δεδομένων, message brokers, storage daemons και οτιδήποτε με write-ahead log είναι η αντίθετη περίπτωση. Η κατάσταση είναι το προϊόν. Ένα restart δεν απορρίπτει την κακή κατάσταση· απορρίπτει την πληροφορία για το πώς έγινε κακή, και σε κάποιους engines προσθέτει δική του ζημιά.
Τι σβήνει ένα restart
Τον πίνακα διεργασιών και τους χρόνους του: ποια διεργασία τρέχει από πότε, ποια βρίσκεται σε uninterruptible sleep και πάνω σε τι. Τον ιδιοκτήτη κάθε ανοιχτού socket και file handle, που σας λέει ποιος κρατούσε το lock ή το port. Το ring buffer του πυρήνα, που σε μια προεπιλεγμένη εγκατάσταση δεν επιβιώνει ενός reboot και είναι εκεί όπου ένα out-of-memory kill, ένα σφάλμα filesystem ή ένας δίσκος που χαλάει αναγγέλλεται. Τα περιεχόμενα της μνήμης της υπηρεσίας, που ένα core dump μπορεί να διατηρήσει και ένα restart όχι. Το χρονολόγιο τερματισμού και εκκίνησης που ξεχωρίζει ένα crash από μια αποτυχημένη εκκίνηση. Και σε έναν table engine χωρίς crash recovery, η ίδια η ακάθαρτη διακοπή είναι ο τρόπος με τον οποίο ένα index header καταστρέφεται, οπότε το restart που προοριζόταν να διορθώσει την υπηρεσία μπορεί να είναι το γεγονός που καταστρέφει τους πίνακες.
Το κιτ αποδεικτικών στοιχείων, σε λεπτά
Όλα τα παρακάτω είναι read-only. Τρέξτε τα από ένα shell στο box, ανακατευθύνετε την έξοδο σε ένα αρχείο με χρονοσφραγίδα, και αντιγράψτε αυτό το αρχείο έξω από το μηχάνημα πριν κανείς αγγίξει οτιδήποτε άλλο.
$ uptime; last -x | head -20; journalctl --list-boots | tail -3
$ dmesg -T | tail -200
$ ps -eo pid,ppid,stat,etime,wchan:24,cmd --sort=-etime | head -60
$ ss -tnp state established | head -100
$ free -m; df -h; df -i
$ vmstat 1 5
$ top -b -n 1 | head -40Για μια βάση δεδομένων, προσθέστε τη δική της εικόνα για τον εαυτό της όσο ακόμα απαντά, και την ουρά του error log της είτε απαντά είτε όχι.
mysql> SHOW FULL PROCESSLIST;
mysql> SHOW ENGINE INNODB STATUS\G
mysql> SHOW GLOBAL STATUS LIKE 'Threads_%';
$ tail -500 /var/log/mariadb/mariadb.logΤο πρώτο μπλοκ απαντά αν το box έχει ήδη κάνει reboot, αν ο πυρήνας σκότωσε κάτι, τι έχει κολλήσει και πάνω σε τι, ποιος κρατάει ποια σύνδεση, και αν το μηχάνημα είναι υπό πίεση μνήμης ή I/O. Το δεύτερο απαντά τι νομίζει η βάση ότι συμβαίνει: μια μακριά συναλλαγή που κρατάει locks, ένα νήμα replication σταματημένο, ένα deadlock, ένας πίνακας που αναφέρεται ως crashed.
Crash, ή αποτυχημένη εκκίνηση
Η πιο χρήσιμη διάκριση στο log είναι ανάμεσα σε μια υπηρεσία που κράσαρε και σε μια υπηρεσία που τερμάτισε καθαρά και μετά απέτυχε να επανέλθει. Η πρώτη χρειάζεται να βρεθεί το έναυσμα πριν γίνει restart σε οτιδήποτε, γιατί restart μέσα σε ζωντανό έναυσμα αναπαράγει το crash. Η δεύτερη είναι πρόβλημα εκκίνησης ή πολιτικής: μια αλλαγμένη διαμόρφωση, ένας γεμάτος δίσκος, ένα δικαίωμα, ένα unit που δεν ήταν enabled. Τα δεδομένα δεν κινδυνεύουν στη δεύτερη περίπτωση, και το να την αντιμετωπίσετε ως crash σπαταλά τον χρόνο που θα είχε φέρει πίσω την υπηρεσία. Η ουρά του log της υπηρεσίας δείχνει ποια από τις δύο είναι: μια γραμμή ολοκλήρωσης τερματισμού ακολουθούμενη από abort στην εκκίνηση είναι η δεύτερη περίπτωση.
Η αναστρέψιμη διαδρομή
Μόλις γίνει γνωστό το έναυσμα, η ακολουθία είναι η ίδια σε κάθε stateful σύστημα. Σταματήστε το έναυσμα, ώστε η διόρθωση να μην μπορεί να αναιρεθεί από άλλο crash στη μέση της ανάκαμψης. Πάρτε το δωρεάν snapshot: σταματήστε τις εγγραφές, μετονομάστε τον κατάλογο δεδομένων στην άκρη ή πάρτε snapshot το volume, και κρατήστε ένα αντίγραφο έξω από το box. Από αυτό το σημείο κάθε βήμα μπορεί να αναστραφεί. Επισκευάστε πριν κάνετε restore, γιατί ένα backup μεταφέρει πιστά ό,τι μετέφερε το σύστημα τη στιγμή που πάρθηκε, και αν το σφάλμα μπήκε μαζί με τα δεδομένα, το restore το ξαναφυτεύει ενώ πετάει όσα γράφτηκαν από τότε. Επαληθεύστε στο όριο που απέτυχε: το query που έκανε abort, ο πίνακας που ανέφερε μηδέν γραμμές, η θέση του replication, όχι απλώς ότι το port είναι ανοιχτό. Περάστε το προγραμματισμένο tuning μόνο αφού ο ασθενής είναι υγιής· ανάκαμψη και αλλαγή είναι δύο διαφορετικές επεμβάσεις.
| Το αντανακλαστικό | Τι πραγματικά συμβαίνει |
|---|---|
| Restart την υπηρεσία | Με το έναυσμα ακόμα ζωντανό κρασάρει ξανά, και η δεύτερη διακοπή είναι εξίσου ακάθαρτη με την πρώτη |
| Restore από χθες βράδυ | Όλα όσα γράφτηκαν από χθες βράδυ χάνονται, και ένα σφάλμα που μπήκε μαζί με τα δεδομένα επαναφέρεται μαζί τους |
| Προσθέστε μνήμη, μοιάζει με μνήμη | Αν το abort είναι λογισμικό που περπατά κατεστραμμένα metadata, το hardware δεν αλλάζει τίποτα |
| Κράσαρε, άρα κάτι χάλασε | Ένας καθαρός τερματισμός ακολουθούμενος από αποτυχημένη εκκίνηση είναι πρόβλημα restart χωρίς κίνδυνο για τα δεδομένα |
Ένας μηδενισμένος αριθμός γραμμών μετά από hard reboot είναι συνήθως ένα κατεστραμμένο index πάνω από άθικτες γραμμές. Σε engines χωρίς crash recovery, μια επισκευή ξαναχτίζει το index από τα δεδομένα· ένα restore πετάει τα δεδομένα.
Η θεραπεία, ως κάτι διαφορετικό από την ανάκαμψη
Μια επισκευή είναι ανάκαμψη. Η θεραπεία είναι η αφαίρεση όσων προκαλούν ακάθαρτες διακοπές, και η μετατροπή των πινάκων που δεν αντέχουν μία σε engine που αντέχει. Και τα δύο ανήκουν στο follow-up, όχι στην πυρόσβεση.
Ευθείες απαντήσεις
Να κάνω restart τη βάση δεδομένων μου που κράσαρε;+
Όχι μέχρι το log να σας πει αν κράσαρε ή απέτυχε να ξεκινήσει, και ποιο ήταν το έναυσμα. Restart μέσα σε ζωντανό έναυσμα αναπαράγει το crash και, σε έναν engine που δεν είναι crash-safe, μπορεί να καταστρέψει πίνακες. Καταγράψτε read-only πρώτα, μετά αποφασίστε.
Ο πίνακάς μου δείχνει μηδέν γραμμές μετά από crash. Χάθηκαν τα δεδομένα;+
Συχνά όχι. Σε table engines χωρίς crash recovery, μια ακάθαρτη διακοπή καταστρέφει το index header ενώ οι γραμμές παραμένουν στον δίσκο, και ο engine αναφέρει τον αριθμό από το header. Πάρτε snapshot τον κατάλογο δεδομένων, μετά τρέξτε την επισκευή του engine· μια επισκευή τυπικά ξαναχτίζει το index από τις γραμμές που είναι ακόμα εκεί. Restore μόνο αν η επισκευή αποτύχει.
Το restore από backup είναι η ασφαλέστερη ανάκαμψη;+
Είναι συνήθως η πιο καταστροφική. Όλα όσα γράφτηκαν από το backup και μετά απορρίπτονται, και αν το σφάλμα ήταν ήδη μέσα στα δεδομένα όταν τρέξε το backup, επιστρέφει μαζί του. Το restore είναι το τελευταίο βήμα μετά τη διάγνωση και την επισκευή.
Τι πρέπει να καταγραφεί πριν κανείς κάνει restart σε οτιδήποτε;+
Ο πίνακας διεργασιών με χρόνους, οι ιδιοκτήτες των ανοιχτών sockets, το ring buffer του πυρήνα, η πίεση μνήμης και I/O, η χρήση δίσκου και inodes, το ιστορικό εκκινήσεων, και η δική της κατάσταση και το error log της υπηρεσίας. Γραμμένα σε αρχείο και αντιγραμμένα έξω από το box. Παίρνει λεπτά, και είναι το μόνο αντίγραφο αυτών των στοιχείων που θα έχετε.
Κάτω αυτή τη στιγμή, με το δάχτυλο στο κουμπί του restart;
Μιλήστε με έναν μηχανικό· διαγιγνώσκουμε read-only πρώτα και παίρνουμε snapshot πριν από οτιδήποτε γράφει.
Μιλήστε με έναν μηχανικόΦτάσατε στο τέλος.
Βάλτε την ανάγνωση σε εφαρμογή
Τι τρέχετε;
Πείτε μας για τον φόρτο εργασίας, την κίνηση και τις απαιτήσεις ανάκαμψης. Ξεκινήστε από το εργαλείο διαμόρφωσης server ή συζητήστε τις λεπτομέρειες με έναν μηχανικό.
Γραμμένο από τους μηχανικούς που χτίζουν και λειτουργούν την υποδομή που περιγράφει.Μιλήστε με έναν μηχανικό
