Μετάβαση στο περιεχόμενο

Αντιμετώπιση προβλημάτων της υπηρεσίας etcd

Πληροφορίες

Ολόκληρη η διαδικασία πρέπει να εκτελεστεί ως root. Για να αυξήσετε τα προνόμιά σας σε root, μπορείτε να χρησιμοποιήσετε την εντολή su -.

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

Η υπηρεσία patroni βασίζεται στην υπηρεσία etcd για να διευθύνει την εκλογή του κόμβου-ηγέτη και να εκκινεί αυτόματα τη μετάβαση σε εφεδρικό (failover) όταν προκύψει κάποιο περιστατικό. Εγκατεστημένη σε όλους τους κόμβους, η υπηρεσία etcd εγγυάται τη συνολική συνέπεια του συμπλέγματος, χωρίς να συμμετέχει στην αποθήκευση ή την επεξεργασία των δεδομένων PostgreSQL.

Επομένως, η υπηρεσία patroni εξαρτάται από την υπηρεσία etcd και δεν μπορεί να λειτουργήσει σωστά εάν η etcd δεν λειτουργεί.

Πληροφορίες

Η διαμόρφωση της υπηρεσίας etcd είναι αποθηκευμένη στο αρχείο /etc/default/etcd σε κάθε κόμβο.

Logs

Ολόκληρη η διαδικασία βασίζεται στα αρχεία καταγραφής της υπηρεσίας etcd, τα οποία λαμβάνετε με την παρακάτω εντολή:

1
journalctl -u etcd

Συμβουλή

Για να παρακολουθείτε τα αρχεία καταγραφής σε πραγματικό χρόνο, προσθέστε την επιλογή -f στην εντολή:

1
journalctl -fu etcd

Πληροφορίες

Τα αρχεία καταγραφής της υπηρεσίας etcd είναι επίσης διαθέσιμα στο /var/log/syslog.

Επεξηγήσεις των αρχείων καταγραφής σφαλμάτων

health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout

Εάν η ροή TCP/2380 δεν είναι ανοιχτή μεταξύ δύο κόμβων, λήγει το χρονικό όριο της σύνδεσης και η υπηρεσία etcd γράφει τις ακόλουθες καταχωρήσεις στο αρχείο καταγραφής:

1
2
3
4
5
6
Apr 15 11:48:09 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:09 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:14 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:14 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:19 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout
Apr 15 11:48:19 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: i/o timeout

Όπου <PEER_PSQL_NODE_ID> είναι το αναγνωριστικό που έχει αποδώσει η υπηρεσία etcd στον κόμβο προορισμού και <PEER_IP_PSQL_NODE> η διεύθυνση IP του κόμβου προορισμού.

Παράδειγμα

Στο παράδειγμά μας, το σύμπλεγμα PostgreSQL έχει διαμορφωθεί ως εξής:

Κόμβος IP κόμβου Αναγνωριστικό etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Η εκτέλεση της εντολής journalctl -fu etcd από τον διακομιστή PSQL_1 δίνει τις ακόλουθες καταχωρήσεις στο αρχείο καταγραφής:

1
2
3
4
5
Apr 15 11:50:39 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:44 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:44 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:49 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout
Apr 15 11:50:49 PSQL_1 etcd[1342933]: health check for peer 7176dd381f583d83 could not connect: dial tcp 192.168.1.2:2380: i/o timeout

Αυτές οι καταχωρήσεις υποδεικνύουν ότι η σύνδεση από τον διακομιστή PSQL_1 προς τον διακομιστή με διεύθυνση IP 192.168.1.2 (PSQL_2) και αναγνωριστικό etcd 7176dd381f583d83, στη θύρα TCP/2380, δεν πέτυχε: έληξε το χρονικό όριο. Μπορούμε να συμπεράνουμε ότι η ροή από τον διακομιστή PSQL_1 προς τον διακομιστή PSQL_2 απορρίπτεται σιωπηλά (DROP) από ένα τείχος προστασίας.

Αυτή η ροή μπορεί να απορρίπτεται σιωπηλά (DROP) από το τοπικό τείχος προστασίας της συσκευής PostgreSQL: ελέγξτε τη διαμόρφωση του τείχους προστασίας της συσκευής στους εμπλεκόμενους κόμβους. Εάν αυτή η διαμόρφωση είναι σωστή, ένα τείχος προστασίας της υποδομής απορρίπτει σιωπηλά (DROP) τη ροή TCP/2380 μεταξύ των δύο κόμβων.

health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused

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

1
2
3
4
5
6
Apr 15 14:04:30 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:30 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:35 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:35 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:40 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused
Apr 15 14:04:40 PSQL_1 etcd[1342933]: health check for peer <PEER_PSQL_NODE_ID> could not connect: dial tcp <PEER_IP_PSQL_NODE>:2380: connect: connection refused

Όπου <PEER_PSQL_NODE_ID> είναι το αναγνωριστικό που έχει αποδώσει η υπηρεσία etcd στον κόμβο προορισμού και <PEER_IP_PSQL_NODE> η διεύθυνση IP του κόμβου προορισμού.

Η απόρριψη μπορεί να έχει διάφορες αιτίες:

  • Η υπηρεσία etcd δυσλειτουργεί ή έχει σταματήσει στον κόμβο προορισμού. Σε αυτή την περίπτωση, ελέγξτε την κατάσταση (systemctl status etcd) και τα αρχεία καταγραφής της υπηρεσίας etcd σε αυτόν τον κόμβο.
  • Ένα τείχος προστασίας απορρίπτει (REJECT) τη ροή TCP/2380 μεταξύ των δύο κόμβων. Μπορεί να πρόκειται για το τοπικό τείχος προστασίας της συσκευής ή για ένα τείχος προστασίας της υποδομής.
Παράδειγμα

Στο παράδειγμά μας, το σύμπλεγμα PostgreSQL έχει διαμορφωθεί ως εξής:

Κόμβος IP κόμβου Αναγνωριστικό etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Η εκτέλεση της εντολής journalctl -fu etcd από τον διακομιστή PSQL_1 δίνει τις ακόλουθες καταχωρήσεις στο αρχείο καταγραφής:

1
2
3
4
5
Apr 15 14:04:15 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:15 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:20 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:20 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused
Apr 15 14:04:25 PSQL_1 etcd[1342933]: health check for peer e3d5ef565a5bb46c could not connect: dial tcp 192.168.1.3:2380: connect: connection refused

Αυτές οι καταχωρήσεις υποδεικνύουν ότι η σύνδεση από τον διακομιστή PSQL_1 προς τον διακομιστή με διεύθυνση IP 192.168.1.3 (PSQL_3) και αναγνωριστικό etcd e3d5ef565a5bb46c, στη θύρα TCP/2380, απορρίφθηκε.

Στον διακομιστή PSQL_3, η εντολή systemctl status etcd δείχνει ότι η υπηρεσία etcd έχει σταματήσει:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
○ etcd.service - etcd - highly-available key value store
    Loaded: loaded (/lib/systemd/system/etcd.service; enabled; preset: enabled)
    Active: inactive (dead) since Wed 2026-04-15 16:09:34 CEST; 38s ago
Duration: 1min 36.087s
    Docs: https://etcd.io/docs
            man:etcd
    Process: 1400558 ExecStart=/usr/bin/etcd $DAEMON_ARGS (code=killed, signal=TERM)
Main PID: 1400558 (code=killed, signal=TERM)
        CPU: 49.071s

Apr 15 12:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1665243 (took 583.297µs)
Apr 15 13:26:32 PSQL_3 etcd[1197556]: store.index: compact 1665949
Apr 15 13:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1665949 (took 574.496µs)
Apr 15 14:26:32 PSQL_3 etcd[1197556]: store.index: compact 1666658
Apr 15 14:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1666658 (took 567.196µs)
Apr 15 15:26:32 PSQL_3 etcd[1197556]: store.index: compact 1667368
Apr 15 15:26:32 PSQL_3 etcd[1197556]: finished scheduled compaction at 1667368 (took 568.096µs)
Apr 15 16:09:34 PSQL_3 systemd[1]: etcd.service: Deactivated successfully.
Apr 15 16:09:34 PSQL_3 systemd[1]: Stopped etcd.service - etcd - highly-available key value store.
Apr 15 16:09:34 PSQL_3 systemd[1]: etcd.service: Consumed 49.071s CPU time.

Μόλις ξεκινήσει η υπηρεσία etcd, το πρόβλημα επιλύεται.

rejected connection from "<PEER_IP_PSQL_NODE>:35956" (error "remote error: tls: bad certificate", ServerName "PSQL_1")

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

1
2
3
4
5
6
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49274" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49294" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49288" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49316" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:49304" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "<PEER_IP_PSQL_NODE>:60958" (error "remote error: tls: bad certificate", ServerName "PSQL_1")

Όπου <PEER_IP_PSQL_NODE> είναι η διεύθυνση IP ενός από τους κόμβους του συμπλέγματος.

Αυτή η καταχώρηση υποδεικνύει ότι, όταν ο κόμβος στον οποίο είστε συνδεδεμένοι προσπάθησε να δημιουργήσει σύνδεση με τους άλλους κόμβους του συμπλέγματος (<PEER_IP_PSQL_NODE>), εκείνοι την απέρριψαν, αναφέροντας σφάλμα στο πιστοποιητικό του τρέχοντος κόμβου.

Επομένως, θα πρέπει να ελέγξετε την εγκυρότητα των πιστοποιητικών του συμπλέγματος στον κόμβο στον οποίο είστε συνδεδεμένοι.

Προειδοποίηση

Εάν η αρχή έκδοσης πιστοποιητικών που έχει διαμορφωθεί σε έναν απομακρυσμένο κόμβο (στο /etc/etcd/ca.crt) είναι εσφαλμένη, το σφάλμα εμφανίζεται επίσης στον κόμβο από τον οποίο διαβάζετε τα αρχεία καταγραφής: υποδεικνύει τότε ότι ο απομακρυσμένος κόμβος δεν μπορεί να επικυρώσει το πιστοποιητικό που παρουσιάζεται, επειδή δεν διαθέτει τη σωστή CA.

Παράδειγμα

Στο παράδειγμά μας, το σύμπλεγμα PostgreSQL έχει διαμορφωθεί ως εξής:

Κόμβος IP κόμβου Αναγνωριστικό etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Η εκτέλεση της εντολής journalctl -fu etcd από τον διακομιστή PSQL_1 δίνει τις ακόλουθες καταχωρήσεις στο αρχείο καταγραφής:

1
2
3
4
5
6
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.2:49274" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.3:49294" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:54 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.2:49288" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.2:49316" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.3:49304" (error "remote error: tls: bad certificate", ServerName "PSQL_1")
Apr 15 16:38:55 PSQL_1 etcd[1407644]: rejected connection from "192.168.1.3:60958" (error "remote error: tls: bad certificate", ServerName "PSQL_1")

Αυτές οι καταχωρήσεις υποδεικνύουν ότι οι κόμβοι PSQL_2 και PSQL_3 απέρριψαν τη σύνδεση από τον κόμβο PSQL_1, επειδή το πιστοποιητικό του κόμβου PSQL_1 δεν είναι έγκυρο σε αυτή την περίπτωση.

Ελέγχουμε επομένως την εγκυρότητα των πιστοποιητικών του κόμβου PSQL_1 ακολουθώντας τη διαδικασία ελέγχου των πιστοποιητικών του συμπλέγματος:

1
2
openssl x509 -in /etc/etcd/peer.crt -noout -enddate
openssl x509 -in /etc/etcd/ca.crt -noout -enddate

Η έξοδος δείχνει ότι το πιστοποιητικό του κόμβου έχει λήξει:

1
2
notAfter=Dec 18 14:04:09 2025 GMT
notAfter=Dec 17 14:03:47 2030 GMT

Σε αυτή την περίπτωση, πρέπει να ανανεώσετε τα πιστοποιητικά του συμπλέγματος PostgreSQL.

error listing data dir: /var/lib/etcd/cleanroom

Εάν η υπηρεσία etcd δεν διαθέτει τις σωστές άδειες για τον κατάλογο /var/lib/etcd/cleanroom, η υπηρεσία αρνείται να ξεκινήσει και γράφει τις ακόλουθες καταχωρήσεις στο αρχείο καταγραφής:

1
2
3
4
5
6
Apr 10 14:15:26 PSQL_1 etcd[454701]: Go OS/Arch: linux/amd64
Apr 10 14:15:26 PSQL_1 etcd[454701]: setting maximum number of CPUs to 1, total number of available CPUs is 1
Apr 10 14:15:26 PSQL_1 etcd[454701]: error listing data dir: /var/lib/etcd/cleanroom
Apr 10 14:15:26 PSQL_1 systemd[1]: etcd.service: Main process exited, code=exited, status=1/FAILURE
Apr 10 14:15:26 PSQL_1 systemd[1]: etcd.service: Failed with result 'exit-code'.
Apr 10 14:15:26 PSQL_1 systemd[1]: Failed to start etcd.service - etcd - highly-available key value store

Για να επιλύσετε αυτό το πρόβλημα, ορίστε τις σωστές άδειες για τον κατάλογο με την ακόλουθη εντολή:

1
chown -R etcd:etcd /var/lib/etcd/cleanroom