Ga naar inhoud

Probleemoplossing voor etcd

Info

De volledige procedure moet als root worden uitgevoerd. Om uw bevoegdheden naar root te verhogen, kunt u de opdracht su - gebruiken.

etcd is een gedistribueerde sleutel-waardeopslag die wordt gebruikt als coördinatiepunt tussen de nodes van de PostgreSQL-cluster. Deze centraliseert en deelt op betrouwbare wijze de status van de cluster, waaronder de identiteit van de leader, de status van de leden en de vergrendelingsmechanismen.

patroni steunt op etcd om de verkiezing van de leader-node aan te sturen en bij een incident automatisch failovers te activeren. etcd is op alle nodes geïnstalleerd en garandeert de algehele consistentie van de cluster, zonder deel te nemen aan de opslag of verwerking van de PostgreSQL-gegevens.

patroni is dus afhankelijk van etcd en kan niet correct werken als etcd niet werkt.

Info

De configuratie van etcd wordt op elke node opgeslagen in het bestand /etc/default/etcd.

Logs

De volledige procedure steunt op de logs van de service etcd, die u met de onderstaande opdracht opvraagt:

1
journalctl -u etcd

Tip

Voeg de optie -f aan de opdracht toe om de logs live te volgen:

1
journalctl -fu etcd

Info

De logs van etcd zijn ook beschikbaar in /var/log/syslog.

Uitleg bij de foutlogs

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

Als de stroom TCP/2380 tussen twee nodes niet open is, treedt er voor de verbinding een time-out op en schrijft etcd de volgende 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

Waarbij <PEER_PSQL_NODE_ID> de ID is die etcd aan de doelnode heeft toegewezen, en <PEER_IP_PSQL_NODE> het IP-adres van de doelnode.

Voorbeeld

In ons voorbeeld is de PostgreSQL-cluster als volgt geconfigureerd:

Node IP van de node ID in etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Het uitvoeren van de opdracht journalctl -fu etcd vanaf de server PSQL_1 levert de volgende logs op:

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

Deze logs geven aan dat de verbinding van de server PSQL_1 naar de server met IP-adres 192.168.1.2 (PSQL_2) en ID 7176dd381f583d83 in etcd, op poort TCP/2380, niet is gelukt: er is een time-out opgetreden. Hieruit kunnen we afleiden dat de stroom van de server PSQL_1 naar de server PSQL_2 door een firewall wordt geblokkeerd (DROP).

Deze stroom kan worden geblokkeerd (DROP) door de lokale firewall van de PostgreSQL-appliance: controleer de firewallconfiguratie van de appliance op de betrokken nodes. Als deze configuratie correct is, blokkeert (DROP) een firewall van de infrastructuur de stroom TCP/2380 tussen de twee nodes.

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

Wanneer een verbinding tussen twee nodes wordt geweigerd, meldt etcd dit met de volgende 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

Waarbij <PEER_PSQL_NODE_ID> de ID is die etcd aan de doelnode heeft toegewezen, en <PEER_IP_PSQL_NODE> het IP-adres van de doelnode.

De weigering kan verschillende oorzaken hebben:

  • De service etcd werkt niet goed of is gestopt op de doelnode. Controleer in dat geval de status (systemctl status etcd) en de logs van de service etcd op die node.
  • Een firewall weigert (REJECT) de stroom TCP/2380 tussen de twee nodes. Dit kan de lokale firewall van de appliance zijn of een firewall van de infrastructuur.
Voorbeeld

In ons voorbeeld is de PostgreSQL-cluster als volgt geconfigureerd:

Node IP van de node ID in etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Het uitvoeren van de opdracht journalctl -fu etcd vanaf de server PSQL_1 levert de volgende logs op:

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

Deze logs geven aan dat de verbinding van de server PSQL_1 naar de server met IP-adres 192.168.1.3 (PSQL_3) en ID e3d5ef565a5bb46c in etcd, op poort TCP/2380, is geweigerd.

Op de server PSQL_3 toont de opdracht systemctl status etcd dat etcd gestopt is:

 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.

Zodra etcd is gestart, is het probleem opgelost.

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

Als de certificaten van de PostgreSQL-cluster verlopen zijn, of als ze niet correct zijn geïnstalleerd of vernieuwd op de node waarop u de logs leest, verschijnt de volgende fout in de logs van 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")

Waarbij <PEER_IP_PSQL_NODE> het IP-adres is van een van de nodes van de cluster.

Deze log geeft aan dat, toen de node waarmee u verbonden bent een verbinding probeerde tot stand te brengen met de andere nodes van de cluster (<PEER_IP_PSQL_NODE>), deze de verbinding weigerden en een fout in het certificaat van de huidige node meldden.

Controleer daarom de geldigheid van de certificaten van de cluster op de node waarmee u verbonden bent.

Waarschuwing

Als de certificeringsinstantie die op een externe node is geconfigureerd (in /etc/etcd/ca.crt) onjuist is, verschijnt de fout ook op de node waarop u de logs leest: deze geeft dan aan dat de externe node het gepresenteerde certificaat niet kan valideren, omdat hij niet over de juiste CA beschikt.

Voorbeeld

In ons voorbeeld is de PostgreSQL-cluster als volgt geconfigureerd:

Node IP van de node ID in etcd
PSQL_1 192.168.1.1 53d2c129945ccb8b
PSQL_2 192.168.1.2 7176dd381f583d83
PSQL_3 192.168.1.3 e3d5ef565a5bb46c

Het uitvoeren van de opdracht journalctl -fu etcd vanaf de server PSQL_1 levert de volgende logs op:

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

Deze logs geven aan dat de nodes PSQL_2 en PSQL_3 de verbinding van de node PSQL_1 hebben geweigerd, omdat het certificaat van PSQL_1 in deze context niet geldig is.

We controleren daarom de geldigheid van de certificaten van de node PSQL_1 met de procedure voor controle van de certificaten van de cluster:

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

De uitvoer toont dat het certificaat van de node verlopen is:

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

In dit geval moet u de certificaten van de PostgreSQL-cluster vernieuwen.

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

Als etcd niet de juiste machtigingen heeft voor de map /var/lib/etcd/cleanroom, weigert de service te starten en schrijft deze de volgende 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

Wijs met de volgende opdracht de juiste machtigingen aan de map toe om dit probleem op te lossen:

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