Gå til indholdet

Fejlfinding for etcd

Info

Hele proceduren skal udføres som root. For at hæve dine privilegier til root kan du bruge kommandoen su -.

etcd er et distribueret nøgleværdilager (key-value store), der bruges som koordinationspunkt mellem noderne i PostgreSQL-clusteret. Det centraliserer og deler clusterets tilstand på en pålidelig måde, herunder identiteten af leader-noden, medlemmernes tilstand og låsemekanismerne.

patroni er afhængig af etcd til at styre valget af leader-noden og til automatisk at udløse failovers, når der opstår et problem. etcd er installeret på alle noder og sikrer clusterets overordnede konsistens uden at deltage i lagringen eller behandlingen af PostgreSQL-data.

patroni afhænger derfor af etcd og kan ikke fungere korrekt, hvis etcd ikke fungerer.

Info

Konfigurationen af etcd er gemt i filen /etc/default/etcd på hver node.

Logs

Hele proceduren bygger på logs fra tjenesten etcd, som du får med kommandoen nedenfor:

1
journalctl -u etcd

Tip

For at følge logs i realtid skal du tilføje indstillingen -f til kommandoen:

1
journalctl -fu etcd

Info

Logs fra etcd er også tilgængelige i /var/log/syslog.

Forklaring af fejllogs

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

Hvis netværksstrømmen TCP/2380 ikke er åben mellem to noder, får forbindelsen timeout, og etcd skriver følgende logs:

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

Hvor <PEER_PSQL_NODE_ID> er det ID, som etcd har tildelt målnoden, og <PEER_IP_PSQL_NODE> er målnodens IP-adresse.

Eksempel

I vores eksempel er PostgreSQL-clusteret konfigureret som følger:

Node Node-IP ID i etcd
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 køres fra serveren PSQL_1, fås følgende logs:

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 logs viser, at forbindelsen fra serveren PSQL_1 til serveren med IP-adressen 192.168.1.2 (PSQL_2) og ID'et 7176dd381f583d83 i etcd på porten TCP/2380 ikke lykkedes: den fik timeout. Vi kan udlede, at netværksstrømmen fra serveren PSQL_1 til serveren PSQL_2 blokeres (DROP) af en firewall.

Denne netværksstrøm kan blive blokeret (DROP) af den lokale firewall på PostgreSQL-appliancen: kontrollér appliancens firewallkonfiguration på de berørte noder. Hvis denne konfiguration er korrekt, er det en firewall i infrastrukturen, der blokerer (DROP) netværksstrømmen TCP/2380 mellem de to noder.

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

Når en forbindelse mellem to noder afvises, rapporterer etcd det med følgende logs:

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

Hvor <PEER_PSQL_NODE_ID> er det ID, som etcd har tildelt målnoden, og <PEER_IP_PSQL_NODE> er målnodens IP-adresse.

Afvisningen kan have flere årsager:

  • Tjenesten etcd fungerer ikke korrekt eller er stoppet på målnoden. Kontrollér i så fald status (systemctl status etcd) og loggene for tjenesten etcd på den pågældende node.
  • En firewall afviser (REJECT) netværksstrømmen TCP/2380 mellem de to noder. Det kan være appliancens lokale firewall eller en firewall i infrastrukturen.
Eksempel

I vores eksempel er PostgreSQL-clusteret konfigureret som følger:

Node Node-IP ID i etcd
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 køres fra serveren PSQL_1, fås følgende logs:

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 logs viser, at forbindelsen fra serveren PSQL_1 til serveren med IP-adressen 192.168.1.3 (PSQL_3) og ID'et e3d5ef565a5bb46c i etcd på porten TCP/2380 blev afvist.

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 certifikaterne for PostgreSQL-clusteret er udløbet, eller hvis de ikke er blevet installeret eller fornyet korrekt på den node, hvorfra du læser loggene, vises følgende fejl i loggene for 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")

Hvor <PEER_IP_PSQL_NODE> er IP-adressen på en af clusterets noder.

Denne log viser, at da den node, du er forbundet til, forsøgte at oprette forbindelse til clusterets andre noder (<PEER_IP_PSQL_NODE>), afviste de den og rapporterede en fejl i den aktuelle nodes certifikat.

Du bør derfor kontrollere gyldigheden af clusterets certifikater på den node, du er forbundet til.

Advarsel

Hvis den certificeringsmyndighed, der er konfigureret på en fjern node (i /etc/etcd/ca.crt), er forkert, vises fejlen også på den node, hvorfra du læser loggene: den angiver da, at den fjerne node ikke kan validere det præsenterede certifikat, fordi den ikke har den rigtige CA.

Eksempel

I vores eksempel er PostgreSQL-clusteret konfigureret som følger:

Node Node-IP ID i etcd
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 køres fra serveren PSQL_1, fås følgende logs:

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 logs viser, at noderne PSQL_2 og PSQL_3 afviste forbindelsen fra noden PSQL_1, fordi certifikatet for PSQL_1 ikke er gyldigt i denne sammenhæng.

Vi kontrollerer derfor gyldigheden af certifikaterne for noden PSQL_1 ved at følge proceduren til kontrol af clusterets certifikater:

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

Resultatet viser, at nodens certifikat er udløbet:

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

I så fald skal du forny certifikaterne for PostgreSQL-clusteret.

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

Hvis etcd ikke har de rigtige tilladelser til mappen /var/lib/etcd/cleanroom, nægter tjenesten at starte og skriver følgende logs:

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

For at løse dette problem skal du tildele mappen de rigtige tilladelser med følgende kommando:

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