Preskočiť na obsah

Riešenie problémov s etcd

Informácie

Celý postup je potrebné vykonať ako root. Na zvýšenie oprávnení na úroveň root môžete použiť príkaz su -.

etcd je distribuovaná databáza typu kľúč – hodnota, ktorá slúži ako koordinačný bod medzi uzlami clustera PostgreSQL. Spoľahlivo centralizuje a zdieľa stav clustera vrátane identity vedúceho uzla, stavu členov a mechanizmov uzamykania.

patroni sa spolieha na etcd pri riadení voľby vedúceho uzla a pri automatickom spúšťaní prevzatia služieb pri zlyhaní, keď dôjde k incidentu. etcd, nainštalovaný na všetkých uzloch, zaručuje celkovú konzistenciu clustera bez toho, aby sa podieľal na ukladaní alebo spracovaní údajov PostgreSQL.

patroni teda závisí od etcd a nemôže správne fungovať, ak etcd nefunguje.

Informácie

Konfigurácia etcd je uložená v súbore /etc/default/etcd na každom uzle.

Logs

Celý postup sa opiera o logy služby etcd, ktoré získate príkazom nižšie:

1
journalctl -u etcd

Tip

Ak chcete sledovať logy naživo, pridajte k príkazu možnosť -f:

1
journalctl -fu etcd

Informácie

Logy etcd sú dostupné aj v /var/log/syslog.

Vysvetlenie chybových logov

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

Ak tok TCP/2380 medzi dvoma uzlami nie je otvorený, vyprší časový limit pripojenia a etcd zapíše nasledujúce logy:

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

Kde <PEER_PSQL_NODE_ID> je ID, ktoré etcd priradil cieľovému uzlu, a <PEER_IP_PSQL_NODE> je IP adresa cieľového uzla.

Príklad

V našom príklade je cluster PostgreSQL nakonfigurovaný takto:

Uzol IP uzla ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Spustenie príkazu journalctl -fu etcd zo servera PSQL_1 poskytne nasledujúce logy:

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

Tieto logy uvádzajú, že pripojenie zo servera PSQL_1 k serveru s IP adresou 192.168.1.2 (PSQL_2) a ID etcd 7176dd381f583d83 na porte TCP/2380 nebolo úspešné: vypršal časový limit. Môžeme z toho vyvodiť, že tok zo servera PSQL_1 na server PSQL_2 zahadzuje (DROP) brána firewall.

Tento tok môže zahadzovať (DROP) lokálna brána firewall appliance PostgreSQL: skontrolujte konfiguráciu brány firewall appliance na príslušných uzloch. Ak je táto konfigurácia správna, tok TCP/2380 medzi dvoma uzlami zahadzuje (DROP) brána firewall infraštruktúry.

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

Keď je pripojenie medzi dvoma uzlami odmietnuté, etcd to oznámi nasledujúcimi logmi:

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

Kde <PEER_PSQL_NODE_ID> je ID, ktoré etcd priradil cieľovému uzlu, a <PEER_IP_PSQL_NODE> je IP adresa cieľového uzla.

Odmietnutie môže mať niekoľko príčin:

  • Služba etcd na cieľovom uzle nefunguje správne alebo je zastavená. V takom prípade skontrolujte stav (systemctl status etcd) a logy služby etcd na tomto uzle.
  • Brána firewall odmieta (REJECT) tok TCP/2380 medzi dvoma uzlami. Môže ísť o lokálnu bránu firewall appliance alebo o bránu firewall infraštruktúry.
Príklad

V našom príklade je cluster PostgreSQL nakonfigurovaný takto:

Uzol IP uzla ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Spustenie príkazu journalctl -fu etcd zo servera PSQL_1 poskytne nasledujúce logy:

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

Tieto logy uvádzajú, že pripojenie zo servera PSQL_1 k serveru s IP adresou 192.168.1.3 (PSQL_3) a ID etcd e3d5ef565a5bb46c na porte TCP/2380 bolo odmietnuté.

Na serveri PSQL_3 príkaz systemctl status etcd ukazuje, že etcd je zastavený:

 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.

Po spustení etcd je problém vyriešený.

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

Ak uplynula platnosť certifikátov clustera PostgreSQL alebo ak neboli správne nainštalované či obnovené na uzle, z ktorého čítate logy, v logoch etcd sa zobrazí nasledujúca chyba:

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

Kde <PEER_IP_PSQL_NODE> je IP adresa jedného z uzlov clustera.

Tento log uvádza, že keď sa uzol, ku ktorému ste pripojení, pokúsil nadviazať pripojenie s ostatnými uzlami clustera (<PEER_IP_PSQL_NODE>), tie ho odmietli a nahlásili chybu certifikátu aktuálneho uzla.

Preto by ste mali skontrolovať platnosť certifikátov clustera na uzle, ku ktorému ste pripojení.

Upozornenie

Ak je certifikačná autorita nakonfigurovaná na vzdialenom uzle (v /etc/etcd/ca.crt) nesprávna, chyba sa zobrazí aj na uzle, z ktorého čítate logy: vtedy znamená, že vzdialený uzol nemôže overiť predložený certifikát, pretože nemá správnu certifikačnú autoritu.

Príklad

V našom príklade je cluster PostgreSQL nakonfigurovaný takto:

Uzol IP uzla ID etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Spustenie príkazu journalctl -fu etcd zo servera PSQL_1 poskytne nasledujúce logy:

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

Tieto logy uvádzajú, že uzly PSQL_2 a PSQL_3 odmietli pripojenie z uzla PSQL_1, pretože certifikát PSQL_1 v tomto kontexte nie je platný.

Preto skontrolujeme platnosť certifikátov uzla PSQL_1 podľa postupu kontroly certifikátov clustera:

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

Výstup ukazuje, že platnosť certifikátu uzla uplynula:

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

V takom prípade musíte obnoviť certifikáty clustera PostgreSQL.

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

Ak etcd nemá správne povolenia pre adresár /var/lib/etcd/cleanroom, služba sa odmietne spustiť a zapíše nasledujúce logy:

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

Na vyriešenie tohto problému priraďte adresáru správne povolenia nasledujúcim príkazom:

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