Sari la conținut

Depanare etcd

Info

Întreaga procedură trebuie efectuată ca root. Pentru a vă ridica privilegiile la root, puteți utiliza comanda su -.

etcd este un depozit distribuit de tip cheie-valoare, utilizat ca punct de coordonare între nodurile clusterului PostgreSQL. Centralizează și partajează în mod fiabil starea clusterului, inclusiv identitatea liderului, starea membrilor și mecanismele de blocare.

patroni se bazează pe etcd pentru a coordona alegerea nodului lider și pentru a declanșa automat comutările în caz de incident. Instalat pe toate nodurile, etcd garantează coerența globală a clusterului, fără a participa la stocarea sau procesarea datelor PostgreSQL.

Prin urmare, patroni depinde de etcd și nu poate funcționa corect dacă etcd nu funcționează.

Info

Configurarea etcd este stocată în fișierul /etc/default/etcd de pe fiecare nod.

Loguri

Întreaga procedură se bazează pe logurile serviciului etcd, pe care le obțineți cu comanda de mai jos:

1
journalctl -u etcd

Sfat

Pentru a urmări logurile în timp real, adăugați opțiunea -f la comandă:

1
journalctl -fu etcd

Info

Logurile etcd sunt disponibile și în /var/log/syslog.

Explicarea logurilor de eroare

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

Dacă fluxul TCP/2380 nu este deschis între două noduri, timpul de așteptare al conexiunii expiră, iar etcd scrie următoarele loguri:

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

Unde <PEER_PSQL_NODE_ID> este ID-ul atribuit de etcd nodului țintă, iar <PEER_IP_PSQL_NODE> este adresa IP a nodului țintă.

Exemplu

În exemplul nostru, clusterul PostgreSQL este configurat astfel:

Nod IP-ul nodului ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Executarea comenzii journalctl -fu etcd de pe serverul PSQL_1 produce următoarele loguri:

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

Aceste loguri indică faptul că conexiunea de la serverul PSQL_1 la serverul cu adresa IP 192.168.1.2 (PSQL_2) și ID-ul etcd 7176dd381f583d83, pe portul TCP/2380, nu a reușit: timpul de așteptare a expirat. Putem deduce că fluxul de la serverul PSQL_1 către serverul PSQL_2 este blocat (DROP) de un firewall.

Acest flux poate fi blocat (DROP) de firewallul local al appliance-ului PostgreSQL: verificați configurarea firewallului appliance-ului pe nodurile implicate. Dacă această configurare este corectă, un firewall al infrastructurii blochează (DROP) fluxul TCP/2380 dintre cele două noduri.

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

Atunci când o conexiune între două noduri este refuzată, etcd o semnalează prin următoarele loguri:

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

Unde <PEER_PSQL_NODE_ID> este ID-ul atribuit de etcd nodului țintă, iar <PEER_IP_PSQL_NODE> este adresa IP a nodului țintă.

Refuzul poate avea mai multe cauze:

  • Serviciul etcd funcționează defectuos sau este oprit pe nodul țintă. În acest caz, verificați starea (systemctl status etcd) și logurile serviciului etcd pe acel nod.
  • Un firewall respinge (REJECT) fluxul TCP/2380 dintre cele două noduri. Poate fi vorba de firewallul local al appliance-ului sau de un firewall al infrastructurii.
Exemplu

În exemplul nostru, clusterul PostgreSQL este configurat astfel:

Nod IP-ul nodului ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Executarea comenzii journalctl -fu etcd de pe serverul PSQL_1 produce următoarele loguri:

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

Aceste loguri indică faptul că conexiunea de la serverul PSQL_1 la serverul cu adresa IP 192.168.1.3 (PSQL_3) și ID-ul etcd e3d5ef565a5bb46c, pe portul TCP/2380, a fost refuzată.

Pe serverul PSQL_3, comanda systemctl status etcd arată că etcd este oprit:

 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.

Odată ce etcd este pornit, problema este rezolvată.

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

Dacă certificatele clusterului PostgreSQL au expirat sau dacă nu au fost instalate ori reînnoite corect pe nodul de pe care citiți logurile, în logurile etcd apare următoarea eroare:

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")

Unde <PEER_IP_PSQL_NODE> este adresa IP a unuia dintre nodurile clusterului.

Acest log indică faptul că, atunci când nodul la care sunteți conectat a încercat să stabilească o conexiune cu celelalte noduri ale clusterului (<PEER_IP_PSQL_NODE>), acestea au refuzat-o, semnalând o eroare privind certificatul nodului curent.

Prin urmare, trebuie să verificați validitatea certificatelor clusterului pe nodul la care sunteți conectat.

Avertisment

Dacă autoritatea de certificare configurată pe un nod la distanță (în /etc/etcd/ca.crt) este incorectă, eroarea apare și pe nodul de pe care citiți logurile: ea indică atunci că nodul la distanță nu poate valida certificatul prezentat, deoarece nu dispune de CA corectă.

Exemplu

În exemplul nostru, clusterul PostgreSQL este configurat astfel:

Nod IP-ul nodului ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Executarea comenzii journalctl -fu etcd de pe serverul PSQL_1 produce următoarele loguri:

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")

Aceste loguri indică faptul că nodurile PSQL_2 și PSQL_3 au refuzat conexiunea de la nodul PSQL_1, deoarece certificatul lui PSQL_1 nu este valid în acest context.

Verificăm, prin urmare, validitatea certificatelor nodului PSQL_1 urmând procedura de verificare a certificatelor clusterului:

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

Rezultatul arată că certificatul nodului a expirat:

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

În acest caz, trebuie să reînnoiți certificatele clusterului PostgreSQL.

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

Dacă etcd nu are permisiunile corecte asupra directorului /var/lib/etcd/cleanroom, serviciul refuză să pornească și scrie următoarele loguri:

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

Pentru a rezolva această problemă, atribuiți directorului permisiunile corecte cu următoarea comandă:

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