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

Αντιμετώπιση προβλημάτων του συμπλέγματος PostgreSQL

Πληροφορίες

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

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

Για να ακολουθήσετε αυτή τη διαδικασία, πρέπει να έχετε πραγματοποιήσει τις πρόσθετες διαμορφώσεις για το εργαλείο patronictl.

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

Έλεγχος της κατάστασης του συμπλέγματος

Πληροφορίες

Ο έλεγχος της κατάστασης του συμπλέγματος εντοπίζει γρήγορα τον κόμβο ή τους κόμβους που παρουσιάζουν βλάβη.

Μπορείτε να ελέγξετε την κατάσταση του συμπλέγματος με την ακόλουθη εντολή, η οποία πρέπει να εκτελεστεί σε κάθε κόμβο του συμπλέγματος PostgreSQL:

1
patronictl -c /etc/patroni/config.yml topology
Παράδειγμα εξόδου σε πλατφόρμα που λειτουργεί

1
2
3
4
5
6
7
+ Cluster: 15-cleanroomvault5 ------+---------+---------+----+-----------+
| Member           | Host           | Role    | State   | TL | Lag in MB |
+------------------+----------------+---------+---------+----+-----------+
| PSQL_3           | psql_3         | Leader  | running | 2  |           |
| + PSQL_1         | psql_1         | Replica | running | 2  |         0 |
| + PSQL_2         | psql_2         | Replica | running | 2  |         0 |
+------------------+----------------+---------+---------+----+-----------+
Στην παραπάνω έξοδο, όλα δείχνουν ότι το σύμπλεγμα PostgreSQL λειτουργεί: η υστέρηση είναι 0 MB για όλους τους κόμβους Replica και όλοι οι κόμβοι βρίσκονται στη λίστα, με την κατάσταση running. Πρέπει να λάβετε αυτή την έξοδο σε όλους τους κόμβους για να επιβεβαιώσετε ότι οι υπηρεσίες patroni και etcd λειτουργούν.

Παράδειγμα εξόδου όταν υπάρχει πρόβλημα επικοινωνίας μεταξύ των κόμβων

1
2
3
4
5
6
7
+ Cluster: 15-cleanroomvault5 ------+---------+---------+----+-----------+
| Member           | Host           | Role    | State   | TL | Lag in MB |
+------------------+----------------+---------+---------+----+-----------+
| PSQL_3           | psql_3         | Leader  | running | 2  |           |
| + PSQL_1         | psql_1         | Replica | running | 2  |       230 |
| + PSQL_2         | psql_2         | Replica | running | 2  |         0 |
+------------------+----------------+---------+---------+----+-----------+
Στην παραπάνω έξοδο, η υστέρηση των 230 MB είναι μη φυσιολογική: θα μπορούσε να υποδεικνύει πρόβλημα επικοινωνίας μεταξύ του κόμβου 3 και του κόμβου 1.
Εάν το πρόβλημα παραμένει μετά από αρκετές ώρες, αυτό το επιβεβαιώνει.

Παράδειγμα εξόδου όταν ένας κόμβος δεν έχει ξεκινήσει ή σταματήσει σωστά

1
2
3
4
5
6
7
+ Cluster: 15-cleanroomvault5 ------+---------+---------+----+-----------+
| Member           | Host           | Role    | State   | TL | Lag in MB |
+------------------+----------------+---------+---------+----+-----------+
| PSQL_3           | psql_3         | Leader  | running | 2  |           |
| + PSQL_1         | psql_1         | Replica | started | 2  |   unknown |
| + PSQL_2         | psql_2         | Replica | stopped | 2  |   unknown |
+------------------+----------------+---------+---------+----+-----------+
Στην παραπάνω έξοδο, η κατάσταση (στήλη State) υποδεικνύει ότι ο κόμβος 1 βρίσκεται σε εκκίνηση. Εάν η κατάσταση started παραμένει για αρκετά λεπτά ή ακόμη και ώρες, ενδέχεται να υπάρχει πρόβλημα με την υπηρεσία patroni ή etcd σε αυτόν τον κόμβο.
Ο κόμβος 2 βρίσκεται στην κατάσταση stopped: έχει σταματήσει. Όταν ένας κόμβος του συμπλέγματος παρουσιάσει βλάβη, η πληροφορία αυτή εμφανίζεται μόνο προσωρινά, πριν ο κόμβος εξαφανιστεί από τη λίστα.

Παράδειγμα εξόδου όταν η υπηρεσία etcd παρουσιάζει βλάβη στον τρέχοντα κόμβο

1
2
3
2026-04-09 16:21:39,482 - WARNING - Retrying (Retry(total=1, connect=None, read=None, redirect=0, status=None)) after connection broken by 'NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fcaa1618390>: Failed to establish a new connection: [Errno 111] Connection refused')': /version
2026-04-09 16:21:39,482 - WARNING - Retrying (Retry(total=0, connect=None, read=None, redirect=0, status=None)) after connection broken by 'NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fcaa1618c10>: Failed to establish a new connection: [Errno 111] Connection refused')': /version
2026-04-09 16:21:39,483 - ERROR - Failed to get list of machines from https://PSQL_3:2379/v2: MaxRetryError("HTTPSConnectionPool(host='psql_3', port=2379): Max retries exceeded with url: /version (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fcaa1619490>: Failed to establish a new connection: [Errno 111] Connection refused'))")
Η παραπάνω έξοδος υποδεικνύει σφάλμα σύνδεσης με την υπηρεσία etcd, το οποίο εμποδίζει την ανάκτηση της κατάστασης του συμπλέγματος PostgreSQL.

Παράδειγμα εξόδου όταν ένας από τους κόμβους είναι αποσυγχρονισμένος

1
2
3
4
5
6
7
+ Cluster: 15-cleanroomvault5 ------+---------+---------+----+-----------+
| Member           | Host           | Role    | State   | TL | Lag in MB |
+------------------+----------------+---------+---------+----+-----------+
| PSQL_3           | psql_3         | Leader  | running | 3  |           |
| + PSQL_1         | psql_1         | Replica | running | 2  |       230 |
| + PSQL_2         | psql_2         | Replica | running | 3  |         0 |
+------------------+----------------+---------+---------+----+-----------+
Στην παραπάνω έξοδο, ο κόμβος PSQL_1 δεν βρίσκεται πλέον στην ίδια χρονογραμμή TL με τους άλλους. Για να λειτουργεί το σύμπλεγμα, όλοι οι κόμβοι πρέπει να βρίσκονται στην ίδια χρονογραμμή TL: μια διαφορά υποδεικνύει ότι ένας από τους κόμβους είναι αποσυγχρονισμένος.
Για να επιλύσετε αυτό το πρόβλημα, ακολουθήστε τη διαδικασία αποσυγχρονισμού κόμβου.

Έλεγχος της κατάστασης των υπηρεσιών

Αφού εντοπιστεί ο κόμβος που παρουσιάζει βλάβη, πρέπει να εντοπίσετε την υπηρεσία που δυσλειτουργεί. Οι δύο κύριες υπηρεσίες που χρησιμοποιούνται στο σύμπλεγμα PostgreSQL είναι οι patroni και etcd.

Πληροφορίες

Η υπηρεσία patroni εξαρτάται από την υπηρεσία etcd: εάν η etcd δεν λειτουργεί, δεν θα λειτουργεί ούτε η patroni.

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

1
2
systemctl status etcd
systemctl status patroni

Αυτές οι εντολές εμφανίζουν την κατάσταση της υπηρεσίας, μαζί με τις 10 τελευταίες γραμμές του αρχείου καταγραφής της.

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

Μια υπηρεσία με την κατάσταση active (running) δεν λειτουργεί απαραίτητα: μπορεί να εκτελείται και ταυτόχρονα να γράφει σφάλματα στο αρχείο καταγραφής. Επομένως, είναι σημαντικό να διαβάσετε τα αρχεία καταγραφής της υπηρεσίας για να κατανοήσετε την πραγματική της κατάσταση.

Παράδειγμα εξόδου για την υπηρεσία etcd όταν λειτουργεί
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
● etcd.service - etcd - highly-available key value store
   Loaded: loaded (/lib/systemd/system/etcd.service; enabled; preset: enabled)
   Active: active (running) since Thu 2026-04-09 16:40:01 CEST; 21h ago
   Docs: https://etcd.io/docs
           man:etcd
Main PID: 283425 (etcd)
   Tasks: 7 (limit: 2227)
   Memory: 73.2M
       CPU: 51min 9.223s
   CGroup: /system.slice/etcd.service
           └─283425 /usr/bin/etcd

Apr 10 09:26:31 PSQL_1 etcd[283425]: store.index: compact 1624026
Apr 10 09:26:31 PSQL_1 etcd[283425]: finished scheduled compaction at 1624026 (took 325.098µs)
Apr 10 10:26:31 PSQL_1 etcd[283425]: store.index: compact 1624386
Apr 10 10:26:31 PSQL_1 etcd[283425]: finished scheduled compaction at 1624386 (took 417.797µs)
Apr 10 11:26:31 PSQL_1 etcd[283425]: store.index: compact 1624746
Apr 10 11:26:31 PSQL_1 etcd[283425]: finished scheduled compaction at 1624746 (took 1.706489ms)
Apr 10 12:26:31 PSQL_1 etcd[283425]: store.index: compact 1625106
Apr 10 12:26:31 PSQL_1 etcd[283425]: finished scheduled compaction at 1625106 (took 300.098µs)
Apr 10 13:26:31 PSQL_1 etcd[283425]: store.index: compact 1625466
Apr 10 13:26:31 PSQL_1 etcd[283425]: finished scheduled compaction at 1625466 (took 311.398µs)
Παράδειγμα εξόδου για την υπηρεσία 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: failed (Result: exit-code) since Fri 2026-04-10 14:15:26 CEST; 5s ago
Duration: 21h 35min 20.382s
    Docs: https://etcd.io/docs
            man:etcd
    Process: 454701 ExecStart=/usr/bin/etcd $DAEMON_ARGS (code=exited, status=1/FAILURE)
Main PID: 454701 (code=exited, status=1/FAILURE)
        CPU: 12ms

Apr 10 14:15:26 PSQL_1 etcd[454701]: [WARNING] Deprecated '--logger=capnslog' flag is set; use '--logger=zap' flag instead
Apr 10 14:15:26 PSQL_1 etcd[454701]: etcd Version: 3.4.23
Apr 10 14:15:26 PSQL_1 etcd[454701]: Git SHA: Not provided (use ./build instead of go build)
Apr 10 14:15:26 PSQL_1 etcd[454701]: Go Version: go1.19.8
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.
Στην παραπάνω έξοδο, η υπηρεσία etcd έχει την κατάσταση failed και το σφάλμα που εμπόδισε την εκκίνησή της είναι αυτό της γραμμής 17: η υπηρεσία δεν μπορεί να διαβάσει το περιεχόμενο του καταλόγου /var/lib/etcd/cleanroom. Σε αυτή την περίπτωση, προσαρμόστε τις άδειες του καταλόγου.

Παράδειγμα εξόδου για την υπηρεσία patroni όταν λειτουργεί
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
   Loaded: loaded (/lib/systemd/system/patroni.service; enabled; preset: enabled)
   Drop-In: /etc/systemd/system/patroni.service.d
           └─local.conf
   Active: active (running) since Thu 2026-04-09 16:40:06 CEST; 22h ago
   Process: 283510 ExecStartPre=/usr/bin/testetcd.py (code=exited, status=0/SUCCESS)
Main PID: 283517 (patroni)
   Tasks: 13 (limit: 2227)
   Memory: 56.1M
       CPU: 26min 54.918s
   CGroup: /system.slice/patroni.service
           ├─283517 /usr/bin/python3 /usr/bin/patroni /etc/patroni/config.yml
           ├─283537 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/cleanroomvault5 --config-file=/etc/postgresql/15/cleanroomvault5/postgresql.conf"--listen_addresses=*" --port=5432 --cluster_name=15-cleanroomvault5 --wal_level=replica --hot_standby=on --max_connections=100 --max_wal_senders=10--max_prepared_transactions=0 --max_locks_per_transaction=64 --track_commit_timestamp=off --max_replication_slots=10 --max_worker_processes=8 --wal_log_hints=on
          ├─283538 "postgres: 15-cleanroomvault5: logger "
          ├─283540 "postgres: 15-cleanroomvault5: checkpointer "
           ├─283541 "postgres: 15-cleanroomvault5: background writer "
          ├─283542 "postgres: 15-cleanroomvault5: startup recovering 00000003000000000000000F"
          ├─283545 "postgres: 15-cleanroomvault5: walreceiver "
          └─283547 "postgres: 15-cleanroomvault5: postgres postgres [local] idle"
Apr 10 14:51:07 PSQL_1 patroni[283517]: 2026-04-10 14:51:07,381 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:51:17 PSQL_1 patroni[283517]: 2026-04-10 14:51:17,428 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:51:27 PSQL_1 patroni[283517]: 2026-04-10 14:51:27,381 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:51:37 PSQL_1 patroni[283517]: 2026-04-10 14:51:37,428 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:51:47 PSQL_1 patroni[283517]: 2026-04-10 14:51:47,381 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:51:57 PSQL_1 patroni[283517]: 2026-04-10 14:51:57,428 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:52:07 PSQL_1 patroni[283517]: 2026-04-10 14:52:07,381 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:52:17 PSQL_1 patroni[283517]: 2026-04-10 14:52:17,428 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:52:27 PSQL_1 patroni[283517]: 2026-04-10 14:52:27,381 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Apr 10 14:52:37 PSQL_1 patroni[283517]: 2026-04-10 14:52:37,474 INFO: no action. I am (PSQL_1), a secondary, and following a leader (PSQL_2)
Παράδειγμα εξόδου για την υπηρεσία patroni όταν βρίσκεται σε σφάλμα

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
    Loaded: loaded (/lib/systemd/system/patroni.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/patroni.service.d
            └─local.conf
    Active: active (running) since Thu 2026-04-09 16:40:06 CEST; 23h ago
    Process: 283510 ExecStartPre=/usr/bin/testetcd.py (code=exited, status=0/SUCCESS)
Main PID: 283517 (patroni)
    Tasks: 12 (limit: 2227)
    Memory: 61.7M
        CPU: 28min 8.337s
    CGroup: /system.slice/patroni.service
            ├─283517 /usr/bin/python3 /usr/bin/patroni /etc/patroni/config.yml
            ├─283537 /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/cleanroomvault5 --config-file=/etc/postgresql/15/cleanroomvault5/postgresql.conf "--listen_addresses=*" --port=5432 --cluster_name=15-cleanroomvault5 --wal_level=replica --hot_standby=on --max_connections=100 --max_wal_senders=10 --max_prepared_transactions=0 --max_locks_per_transaction=64 --track_commit_timestamp=off --max_replication_slots=10 --max_worker_processes=8 --wal_log_hints=on
            ├─283538 "postgres: 15-cleanroomvault5: logger "
            ├─283540 "postgres: 15-cleanroomvault5: checkpointer "
            ├─283541 "postgres: 15-cleanroomvault5: background writer "
            ├─283542 "postgres: 15-cleanroomvault5: startup recovering 00000003000000000000000F"
            └─283547 "postgres: 15-cleanroomvault5: postgres postgres [local] idle"

Apr 10 15:52:37 PSQL_1 patroni[283517]: 2026-04-10 15:52:37,680 WARNING: Loop time exceeded, rescheduling immediately.
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:37,681 INFO: Lock owner: PSQL_2; I am PSQL_1
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,069 ERROR: Request to server https://PSQL_3:2379 failed: ReadTimeoutError("HTTPSConnectionPool(host='psql_3', port=2379): Read timed out. (read timeout=3.3331721344341836)")
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,069 INFO: Reconnection allowed, looking for another server.
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,069 INFO: Retrying on https://PSQL_1:2379
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,073 ERROR: Request to server https://PSQL_1:2379 failed: MaxRetryError("HTTPSConnectionPool(host='psql_1', port=2379): Max retries exceeded with url: /v3/lease/keepalive (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fd77c411090>: Failed to establish a new connection: [Errno 111] Connection refused'))")
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,073 INFO: Reconnection allowed, looking for another server.
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,073 INFO: Retrying on https://PSQL_2:2379
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,074 ERROR: Request to server https://PSQL_2:2379 failed: MaxRetryError("HTTPSConnectionPool(host='psql_2', port=2379): Max retries exceeded with url: /v3/lease/keepalive (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fd77c411090>: Failed to establish a new connection: [Errno 111] Connection refused'))")
Apr 10 15:52:41 PSQL_1 patroni[283517]: 2026-04-10 15:52:41,074 INFO: Reconnection allowed, looking for another server.
Στην παραπάνω περίπτωση, η υπηρεσία έχει την κατάσταση active (running) χωρίς στην πραγματικότητα να λειτουργεί: τα αρχεία καταγραφής εμφανίζουν διάφορα σφάλματα σύνδεσης με την υπηρεσία etcd, την οποία χρειάζεται η patroni.
Σε αυτό το παράδειγμα, η υπηρεσία patroni δεν ευθύνεται απαραίτητα: καθώς εξαρτάται από την υπηρεσία etcd, διορθώστε πρώτα τα προβλήματα της etcd και, στη συνέχεια, ελέγξτε ξανά την κατάσταση της patroni.

Διαδικασίες αντιμετώπισης προβλημάτων των υπηρεσιών

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