|
Πρόσφατα, ένας διακομιστής MySQL αντιμετωπίστηκε λόγω ορισμένων ειδικών παραγόντων“ΣΦΑΛΜΑ 1129 (00000): Ο κεντρικός υπολογιστής 'xxx' έχει αποκλειστεί λόγω πολλών σφαλμάτων σύνδεσης. Ξεμπλοκάρετε με το 'mysqladmin flush-hosts'”Μετά την επίλυση του προβλήματος, κατά τη διαδικασία εκμάθησης περισσότερων για την παράμετρο max_connect_errors, ορισμένες αντιφατικές περιγραφές διαφορετικών δεδομένων δικτύου με μπέρδεψαν λίγο (σχετικά με αυτό το σφάλμα, ο βασικός λόγος είναι ότι η ίδια IP δημιούργησε πάρα πολλές διακοπτόμενες συνδέσεις βάσης δεδομένων (υπερβαίνοντας τη μέγιστη τιμή των max_connect_errors) σε σύντομο χρονικό διάστημα και ακολουθεί μια διαδικασία διερεύνησης των προβλημάτων μου, ανάλυσης προβλημάτων και διευκρίνισης αμφιβολιών. Πρώτα απ 'όλα, έψαξα κάποιες πληροφορίες στο Διαδίκτυο, πολλές από τις οποίες ορκίζονται να εισαγάγουν ότι εάν ο αριθμός των προσπαθειών εισαγωγής κωδικού πρόσβασης υπερβαίνει τις μεταβλητές max_connect_errors, η MySQL θα αποκλείσει αυτήν τη σύνδεση πελάτη και, στη συνέχεια, βρήκα τις επίσημες πληροφορίες σχετικά με την εισαγωγή του max_connect_errors, όπως φαίνεται παρακάτω, η MySQL 5.6/5.7 είναι η ίδια Εάν διακοπούν περισσότερες από τόσες διαδοχικές αιτήσεις σύνδεσης από έναν κεντρικό υπολογιστή χωρίς επιτυχή σύνδεση, ο εξυπηρετητής αποκλείει αυτόν τον κεντρικό υπολογιστή από περαιτέρω συνδέσεις. Μπορείτε να καταργήσετε τον αποκλεισμό αποκλεισμένων κεντρικών υπολογιστών εκκαθαρίζοντας την προσωρινή μνήμη κεντρικού υπολογιστή. Για να το κάνετε αυτό, εκδώστε μια δήλωση FLUSH HOSTS ή εκτελέστε μια εντολή mysqladmin flush-hosts. Εάν μια σύνδεση δημιουργηθεί με επιτυχία σε λιγότερες από max_connect_errors προσπάθειες μετά τη διακοπή μιας προηγούμενης σύνδεσης, το πλήθος σφαλμάτων για το κεντρικό σύστημα διαγράφεται στο μηδέν. Ωστόσο, μόλις αποκλειστεί ένας κεντρικός υπολογιστής, η έκπλυση της προσωρινής μνήμης του κεντρικού υπολογιστή είναι ο μόνος τρόπος για να τον ξεμπλοκάρετε. Η προεπιλογή είναι 100. Όπως φαίνεται παραπάνω, η μετάφραση έχει περίπου ως εξής: Εάν ο διακομιστής MySQL λαμβάνει διαδοχικά αιτήματα από τον ίδιο κεντρικό υπολογιστή και όλα αυτά τα διαδοχικά αιτήματα διακόπτονται χωρίς να δημιουργηθεί επιτυχώς σύνδεση, όταν η αθροιστική τιμή αυτών των διαδοχικών αιτημάτων είναι μεγαλύτερη από την max_connect_errors καθορισμένη τιμή, ο διακομιστής MySQL θα αποκλείσει όλα τα επόμενα αιτήματα από αυτόν τον κεντρικό υπολογιστή. Πιστεύω ότι όταν δείτε αυτές τις πληροφορίες στην αρχή, θα δεχτείτε και εσείς επίθεση“Πολλά διαδοχικά αιτήματα σύνδεσης από έναν κεντρικό υπολογιστή διακόπτονται χωρίς επιτυχή σύνδεση”Μπερδεμένος, στην πραγματικότητα, αυτό συμβαίνει επειδή η σύνδεση της βάσης δεδομένων ματαιώνεται λόγω ανωμαλιών δικτύου. Έψαξα για τέτοιες πληροφορίες στο Διαδίκτυο: Φαίνεται να υπάρχει σύγχυση γύρω από αυτή τη μεταβλητή. Δεν αποκλείει πραγματικά τους κεντρικούς υπολογιστές για επαναλαμβανόμενους μη έγκυρους κωδικούς πρόσβασης, αλλά για ματαιωμένες συνδέσεις λόγω σφαλμάτων δικτύου. Λοιπόν, τότε μπορούμε να πειραματιστούμε και να το επαληθεύσουμε μόνοι μας για να μάθουμε ποιο είναι το σωστό. Δημιουργήστε έναν δοκιμαστικό λογαριασμό στη βάση δεδομένων MySQL και, στη συνέχεια, ορίστε τη μεταβλητή max_connect_errors σε3. Στη συνέχεια, χρησιμοποιούμε μια άλλη δοκιμαστική μηχανή για να συνδεθούμε στη βάση δεδομένων MySQL με λάθος κωδικό πρόσβασης, όπως φαίνεται παρακάτω, ακόμα κι αν εισαχθούν οι προηγούμενοι τρεις λανθασμένοι κωδικοί πρόσβασης, η τέταρτη είσοδος δεν αντιμετωπίζει το παραπάνω σφάλμα.Στη συνέχεια, μπορείτε να αποκλείσετε ότι αυτή η μεταβλητή έχει να κάνει με λάθος εισαγωγή κωδικού πρόσβασης. [root@mytestlnx02 tmp]# mysql -h10.20.57.24 -utest -p Εισάγετε τον κωδικό πρόσβασης: ΣΦΑΛΜΑ 1045 (28000): Δεν επιτρέπεται η πρόσβαση για τον χρήστη 'test'@'mytestlnx02' (με χρήση κωδικού πρόσβασης: ΝΑΙ) [root@mytestlnx02 tmp]# mysql -h10.20.57.24 -utest -p Εισάγετε τον κωδικό πρόσβασης: ΣΦΑΛΜΑ 1045 (28000): Δεν επιτρέπεται η πρόσβαση για τον χρήστη 'test'@'mytestlnx02' (με χρήση κωδικού πρόσβασης: ΝΑΙ) [root@mytestlnx02 tmp]# mysql -h10.20.57.24 -utest -p Εισάγετε τον κωδικό πρόσβασης: ΣΦΑΛΜΑ 1045 (28000): Δεν επιτρέπεται η πρόσβαση για τον χρήστη 'test'@'mytestlnx02' (με χρήση κωδικού πρόσβασης: ΝΑΙ) [root@mytestlnx02 tmp]# mysql -h10.20.57.24 -utest -p Εισάγετε τον κωδικό πρόσβασης: ΣΦΑΛΜΑ 1045 (28000): Δεν επιτρέπεται η πρόσβαση για τον χρήστη 'test'@'mytestlnx02' (με χρήση κωδικού πρόσβασης: ΝΑΙ) [root@mytestlnx02 tmp] # Στην πραγματικότητα, εάν μια IP εισαγάγει λανθασμένο κωδικό πρόσβασης, η MySQL θα τον καταγράψει στον πίνακα host_cache κάτω από τη βάση δεδομένων performance_schema. Καταγράφεται σωρευτικά σε COUNT_AUTHENTICATION_ERRORS πεδία ως εξής:
Σύμφωνα με τις επίσημες πληροφορίες, το host_cache πεδίο θεωρείται στατιστικά ως“Εμφραξη”των σφαλμάτων σύνδεσης (αξιολογούνται με βάση max_connect_errors μεταβλητές του συστήματος). Υπολογίζονται μόνο τα σφάλματα χειραψίας πρωτοκόλλου και χρησιμοποιούνται μόνο για κεντρικούς υπολογιστές με έλεγχο ταυτότητας (HOST_VALIDATED = ΝΑΙ). SUM_CONNECT_ERRORS Ο αριθμός των σφαλμάτων σύνδεσης που θεωρούνται «φραγή» (αξιολογείται με βάση τοmax_connect_errorsμεταβλητή συστήματος). Υπολογίζονται μόνο τα σφάλματα χειραψίας πρωτοκόλλου και μόνο για κεντρικούς υπολογιστές που πέρασαν την επικύρωση (HOST_VALIDATED = ΝΑΙ). MySQLΟ πελάτης πρέπει να ξεκινήσει ένα πρωτόκολλο χειραψίας τρεις φορές για να δημιουργήσει μια σύνδεση με τη βάση δεδομένων, υπό κανονικές συνθήκες, αυτός ο χρόνος είναι πολύ σύντομος, αλλά μόλις εμφανιστεί η ανωμαλία δικτύου, το χρονικό όριο του δικτύου και άλλοι παράγοντες, θα προκαλέσει την αδυναμία ολοκλήρωσης του πρωτοκόλλου χειραψίας, η MySQL έχει μια παράμετρο connect_timeout, είναι η ώρα για τη διαδικασία διακομιστή MySQL mysqld να περιμένει να δημιουργηθεί η σύνδεση, σε δευτερόλεπτα. Εάν η χειραψία πρωτοκόλλου εξακολουθεί να μην έχει ολοκληρωθεί μετά το χρονικό πλαίσιο connect_timeout, ο πελάτης MySQL θα λάβει μια εξαίρεση με ένα μήνυμα εξαίρεσης παρόμοιο με: Χάθηκε η σύνδεση με τον διακομιστή MySQL στο 'XXX', σφάλμα συστήματος: Λάθος, η μεταβλητή ορίζεται από προεπιλογή στα 10 δευτερόλεπτα:
Ας κατασκευάσουμε μια περίπτωση όπου η σύνδεση της βάσης δεδομένων διακόπτεται λόγω χρονικού ορίου δικτύου, χρησιμοποιούμε τις εντολές netem και tc στο Linux για να προσομοιώσουμε την περίπτωση καθυστέρησης μετάδοσης δικτύου σε ένα πολύπλοκο περιβάλλον, μετά τις ακόλουθες ρυθμίσεις, αυτή τη στιγμή από τον δοκιμαστικό διακομιστή για πρόσβαση στον διακομιστή MySQL, θα υπάρξει καθυστέρηση 11 δευτερολέπτων: [root@gettestlnx02 ~]# ping 10.20.57.24 PING 10.20.57.24 (10.20.57.24) 56(84) byte δεδομένων. 64 byte από 10.20.57.24: icmp_seq=1 ttl=62 χρόνος=0,251 ms 64 byte από 10.20.57.24: icmp_seq=2 ttl=62 χρόνος=0,330 ms 64 byte από 10.20.57.24: icmp_seq=3 ttl=62 χρόνος=0,362 ms 64 byte από 10.20.57.24: icmp_seq=4 ttl=62 χρόνος=0,316 ms 64 byte από 10.20.57.24: icmp_seq=5 ttl=62 χρόνος=0,281 ms 64 byte από 10.20.57.24: icmp_seq=6 ttl=62 χρόνος=0,377 ms ^Γ --- 10.20.57.24 Στατιστικά στοιχεία ping --- 6 πακέτα που μεταδόθηκαν, 6 που ελήφθησαν, 0% απώλεια πακέτων, χρόνος 5716ms RTT ελάχιστο/μέσος όρος/μέγιστο/mdev = 0,251/0,319/0,377/0,047 ms [root@gettestlnx02 ~]# tc qdisc προσθήκη dev eth0 root netem καθυστέρηση 11000ms [root@gettestlnx02 ~]# ping 10.20.57.24 PING 10.20.57.24 (10.20.57.24) 56(84) byte δεδομένων. 64 byte από 10.20.57.24: icmp_seq=1 ttl=62 χρόνος=11000 ms 64 byte από 10.20.57.24: icmp_seq=2 ttl=62 χρόνος=11000 ms 64 byte από 10.20.57.24: icmp_seq=3 ttl=62 χρόνος=11000 ms 64 byte από 10.20.57.24: icmp_seq=4 ttl=62 χρόνος=11000 ms 64 byte από 10.20.57.24: icmp_seq=5 ttl=62 χρόνος=11000 ms 64 byte από 10.20.57.24: icmp_seq=6 ttl=62 χρόνος=11000 ms 64 byte από 10.20.57.24: icmp_seq=7 ttl=62 χρόνος=11000 ms
Συνδεόμαστε στη βάση δεδομένων MySQL στον δοκιμαστικό διακομιστή gettestlnx02 όπως φαίνεται παρακάτω (σημειώστε ότι εάν συνδέεστε σε αυτόν τον διακομιστή μέσω ssh, θα είναι αρκετά αργό να λειτουργήσετε στο gettestlnx02 αυτήν τη στιγμή.) Φυσικά, μπορείτε επίσης να προσομοιώσετε τον λανθάνοντα χρόνο δικτύου στον διακομιστή MySQL ή μπορείτε να μειώσετε τόσο τον λανθάνοντα χρόνο connect_timeout όσο και τον λανθάνοντα χρόνο δικτύου) [root@gettestlnx02 ~]# mysql -h10.20.57.24 -utest -p Εισάγετε τον κωδικό πρόσβασης: ΣΦΑΛΜΑ 2013 (HY000): Χάθηκε η σύνδεση με το διακομιστή MySQL στο 'πακέτο εξουσιοδότησης ανάγνωσης', σφάλμα συστήματος: 0 [root@gettestlnx02 ~] # Όπως φαίνεται παραπάνω, λόγω της καθυστέρησης δικτύου άνω των 10 δευτερολέπτων, η σύνδεση με τη MySQL απέτυχε, αυτή τη στιγμή, όταν ρωτάτε τον πίνακα host_cache στον διακομιστή MySQL, τότε θα δείτε ότι η SUM_CONNECT_ERRORS έχει γίνει 1 και η COUNT_HANDSHAKE_ERRORS έχει επίσης αλλάξει1.
Στη συνέχεια, πετάμε έτσι τρεις φορές επανειλημμένα, και θα δείτε ότι το SUM_CONNECT_ERRORS γίνεται 3 και το COUNT_HANDSHAKE_ERRORS γίνεται 3. Στη συνέχεια, χρησιμοποιούμε εντολές netem και tc για να ακυρώσουμε την προσομοίωση καθυστέρησης δικτύου στον δοκιμαστικό διακομιστή και, στη συνέχεια, πηγαίνουμε στη δοκιμαστική σύνδεση με τη βάση δεδομένων MySQL, όπως φαίνεται στην ακόλουθη δοκιμή: [root@gettestlnx02 ~]# tc qdisc del dev eth0 root netem καθυστέρηση 11000ms [root@gettestlnx02 ~]# mysql -h10.20.57.24 -utest -p Εισάγετε τον κωδικό πρόσβασης: ΣΦΑΛΜΑ 1129 (HY000): Ο κεντρικός υπολογιστής '192.168.27.180' έχει αποκλειστεί λόγω πολλών σφαλμάτων σύνδεσης. Ξεμπλοκάρετε με το 'mysqladmin flush-hosts' [root@gettestlnx02 ~] #
Αυτή τη στιγμή, μπορεί να κατασκευαστεί“ΣΦΑΛΜΑ 1129 (HY000): Ο κεντρικός υπολογιστής '192.168.27.180' έχει αποκλειστεί λόγω πολλών σφαλμάτων σύνδεσης. Ξεμπλοκάρετε με το 'mysqladmin flush-hosts'”Λανθασμένος. λύση Επιλύθηκε το ΣΦΑΛΜΑ 1129 (00000): Το κεντρικό σύστημα 'xxx' έχει αποκλειστεί λόγω πολλών σφαλμάτων σύνδεσης. Υπάρχουν πολλοί τρόποι για να λάβετε το σφάλμα Unblock με το 'mysqladmin flush-hosts', αλλά μερικοί είναι προσωρινοί. Το προσωρινό σχέδιο είναι ότι οι δείκτες δεν αντιμετωπίζουν τη βασική αιτία. Το κλειδί είναι να διορθώσετε σφάλματα δικτύου (τα οποία συχνά απαιτούν διαβούλευση με διαχειριστές δικτύου ή διαχειριστές συστήματος) Λύση: 1, ορίστε την τιμή της μεταβλητής max_connection_errors σε μεγαλύτερη τιμή
Αυτή η προσωρινή λύση είναι απλώς μια προϋπόθεση ενεργοποίησης καθυστέρησης για την απαγόρευση της IP και σε περίπλοκες περιπτώσεις ή υψηλό συγχρονισμό, είναι απαραίτητο να ορίσετε μια μεγάλη τιμή, διαφορετικά θα ενεργοποιηθεί εύκολα ξανά. Επιπλέον, οι μεταβλητές ισχύουν μόνο στο τρέχον περιβάλλον και θα λήξουν εάν επανεκκινηθούν. 2: χρήσηΦλος οικοδεσπότες mysql> κεντρικοί υπολογιστές εκκαθάρισης. Ερώτημα OK, επηρεάζονται 0 γραμμές (0,00 δευτ.) mysql> επιλέξτε * από performance_schema.host_cache. Κενό σετ (0,00 δευτ.) mysql> Φυσικά, μπορείτε επίσης να χρησιμοποιήσετε την εντολή mysqladmin flush-hosts για να καθαρίσετε τις πληροφορίες της προσωρινής μνήμης των κεντρικών υπολογιστών [root@DB-Διακομιστής ~]# mysqladmin --port=3306 -uroot -p flush-host Εισάγετε τον κωδικό πρόσβασης: Τι είναι λοιπόν η προσωρινή μνήμη κεντρικού υπολογιστή; Η επίσημη εισαγωγή έχει ως εξής: Ο διακομιστής MySQL διατηρεί μια προσωρινή μνήμη κεντρικού υπολογιστή στη μνήμη που περιέχει πληροφορίες σχετικά με τους πελάτες: διεύθυνση IP, όνομα κεντρικού υπολογιστή και πληροφορίες σφάλματος. Ο διακομιστής χρησιμοποιεί αυτό το cache για μη τοπικές συνδέσεις TCP. Δεν χρησιμοποιεί τη μνήμη cache για συνδέσεις TCP που δημιουργούνται με χρήση διεύθυνσης διασύνδεσης βρόχου επιστροφής (127.0.0.1 ή ::1) ή για συνδέσεις που δημιουργούνται με χρήση αρχείου υποδοχής Unix, επώνυμης διοχέτευσης ή κοινόχρηστης χρήσης μνήμη. Με απλά λόγια, ο διακομιστής MySQL διατηρεί μια κρυφή μνήμη στη μνήμη που περιέχει πληροφορίες πελάτη: διεύθυνση IP, όνομα κεντρικού υπολογιστή, μήνυμα σφάλματος κ.λπ. Ο διακομιστής αποθηκεύει προσωρινά μη τοπικές πληροφορίες σύνδεσης TCP. Δεν αποθηκεύει προσωρινά τις συνδέσεις TCP που πραγματοποιούνται χρησιμοποιώντας διευθύνσεις διεπαφής βρόχου επιστροφής (127.0.0.1 ή::1) ή συνδέσεις που πραγματοποιούνται χρησιμοποιώντας αρχεία υποδοχής Unix, επώνυμες διοχετεύσεις ή κοινόχρηστη μνήμη. Μπορείτε να αναζητήσετε πληροφορίες για τη μνήμη cache του κεντρικού συστήματος μέσω του πίνακα host_cache στη βάση δεδομένων performance_schema. 3: Ορίστε τη μεταβλητή host_cache_size σε0 Στην πραγματικότητα, θα έλεγα ότι αυτή είναι η πιο αναξιόπιστη λύση, μόνο και μόνο για να κάνει τον διακομιστή MySQL να μην καταγράφει τις πληροφορίες της προσωρινής μνήμης του κεντρικού υπολογιστή. Αυτή η μέθοδος μπορεί να αγνοηθεί εντελώς.
|