Gå til innhold

Feilsøking av etcd

Info

Hele prosedyren må utføres som root. For å heve privilegiene dine til root kan du bruke kommandoen su -.

etcd er et distribuert nøkkel-verdi-lager som brukes som koordineringspunkt mellom nodene i PostgreSQL-clusteren. Det sentraliserer og deler tilstanden til clusteren på en pålitelig måte, blant annet identiteten til lederen, tilstanden til medlemmene og låsemekanismene.

patroni er avhengig av etcd for å styre valget av ledernoden og for å utløse failover automatisk når det oppstår en hendelse. etcd er installert på alle nodene og sikrer den overordnede konsistensen i clusteren, uten å delta i lagring eller behandling av PostgreSQL-data.

patroni er derfor avhengig av etcd og kan ikke fungere riktig hvis etcd ikke fungerer.

Info

Konfigurasjonen av etcd lagres i filen /etc/default/etcd på hver node.

Logger

Hele prosedyren baserer seg på loggene til etcd-tjenesten, som du henter med kommandoen nedenfor:

1
journalctl -u etcd

Tips

For å følge loggene i sanntid legger du til alternativet -f i kommandoen:

1
journalctl -fu etcd

Info

etcd-loggene er også tilgjengelige i /var/log/syslog.

Forklaring av feillogger

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

Hvis TCP/2380-flyten ikke er åpnet mellom to noder, får tilkoblingen tidsavbrudd, og etcd skriver følgende logger:

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

Der <PEER_PSQL_NODE_ID> er ID-en som etcd har tildelt målnoden, og <PEER_IP_PSQL_NODE> er IP-adressen til målnoden.

Eksempel

I vårt eksempel er PostgreSQL-clusteren konfigurert slik:

Node Nodens IP etcd-ID
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Når kommandoen journalctl -fu etcd kjøres fra serveren PSQL_1, får vi følgende logger:

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

Disse loggene viser at tilkoblingen fra serveren PSQL_1 til serveren med IP-adressen 192.168.1.2 (PSQL_2) og etcd-ID 7176dd381f583d83, på porten TCP/2380, ikke lyktes: den fikk tidsavbrudd. Vi kan utlede at flyten fra serveren PSQL_1 til serveren PSQL_2 blir forkastet (DROP) av en brannmur.

Denne flyten kan bli forkastet (DROP) av den lokale brannmuren på PostgreSQL-appliancen: kontroller brannmurkonfigurasjonen til appliancen på de berørte nodene. Hvis denne konfigurasjonen er riktig, er det en brannmur i infrastrukturen som forkaster (DROP) TCP/2380-flyten mellom de to nodene.

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

Når en tilkobling mellom to noder avvises, rapporterer etcd det med følgende logger:

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

Der <PEER_PSQL_NODE_ID> er ID-en som etcd har tildelt målnoden, og <PEER_IP_PSQL_NODE> er IP-adressen til målnoden.

Avvisningen kan ha flere årsaker:

  • etcd-tjenesten fungerer ikke som den skal, eller er stoppet på målnoden. Kontroller i så fall statusen (systemctl status etcd) og loggene til etcd-tjenesten på den noden.
  • En brannmur avviser (REJECT) TCP/2380-flyten mellom de to nodene. Det kan være den lokale brannmuren på appliancen eller en brannmur i infrastrukturen.
Eksempel

I vårt eksempel er PostgreSQL-clusteren konfigurert slik:

Node Nodens IP etcd-ID
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Når kommandoen journalctl -fu etcd kjøres fra serveren PSQL_1, får vi følgende logger:

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

Disse loggene viser at tilkoblingen fra serveren PSQL_1 til serveren med IP-adressen 192.168.1.3 (PSQL_3) og etcd-ID e3d5ef565a5bb46c, på porten TCP/2380, ble avvist.

På serveren PSQL_3 viser kommandoen systemctl status etcd at etcd er stoppet:

 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.

Når etcd er startet, er problemet løst.

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

Hvis sertifikatene til PostgreSQL-clusteren er utløpt, eller hvis de ikke ble riktig installert eller fornyet på noden du leser loggene fra, vises følgende feil i etcd-loggene:

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

Der <PEER_IP_PSQL_NODE> er IP-adressen til en av nodene i clusteren.

Denne loggen viser at da noden du er koblet til, forsøkte å opprette en tilkobling til de andre nodene i clusteren (<PEER_IP_PSQL_NODE>), avviste de den og rapporterte en feil i sertifikatet til den gjeldende noden.

Du bør derfor kontrollere gyldigheten til sertifikatene i clusteren på noden du er koblet til.

Adadvarsel

Hvis sertifiseringsinstansen som er konfigurert på en ekstern node (i /etc/etcd/ca.crt), er feil, vises feilen også på noden du leser loggene fra: den viser da at den eksterne noden ikke kan validere sertifikatet som presenteres, fordi den ikke har riktig CA.

Eksempel

I vårt eksempel er PostgreSQL-clusteren konfigurert slik:

Node Nodens IP etcd-ID
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Når kommandoen journalctl -fu etcd kjøres fra serveren PSQL_1, får vi følgende logger:

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

Disse loggene viser at nodene PSQL_2 og PSQL_3 avviste tilkoblingen fra noden PSQL_1, fordi sertifikatet til PSQL_1 ikke er gyldig i denne sammenhengen.

Vi kontrollerer derfor gyldigheten til sertifikatene på noden PSQL_1 ved å følge prosedyren for kontroll av sertifikatene i clusteren:

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

Utdataene viser at sertifikatet til noden er utløpt:

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

I dette tilfellet må du fornye sertifikatene til PostgreSQL-clusteren.

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

Hvis etcd ikke har de riktige tillatelsene til katalogen /var/lib/etcd/cleanroom, nekter tjenesten å starte og skriver følgende logger:

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

Løs dette problemet ved å tildele katalogen de riktige tillatelsene med følgende kommando:

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