Gå till innehållet

Felsökning av etcd

Info

Hela proceduren ska utföras som root. För att höja dina privilegier till root kan du använda kommandot su -.

etcd är ett distribuerat nyckel-värde-lager som används som samordningspunkt mellan noderna i PostgreSQL-clustret. Det centraliserar och delar på ett tillförlitligt sätt clustrets tillstånd, bland annat ledarens identitet, medlemmarnas tillstånd och låsmekanismerna.

patroni förlitar sig på etcd för att styra valet av ledarnod och för att automatiskt utlösa redundansväxlingar när en incident inträffar. etcd är installerat på alla noder och garanterar clustrets övergripande konsekvens, utan att delta i lagringen eller behandlingen av PostgreSQL-data.

patroni är därför beroende av etcd och kan inte fungera korrekt om etcd inte fungerar.

Info

Konfigurationen för etcd lagras i filen /etc/default/etcd på varje nod.

Loggar

Hela proceduren bygger på loggarna för tjänsten etcd, som du hämtar med kommandot nedan:

1
journalctl -u etcd

Tips

Lägg till alternativet -f i kommandot för att följa loggarna i realtid:

1
journalctl -fu etcd

Info

Loggarna för etcd finns också i /var/log/syslog.

Förklaring av felloggar

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

Om flödet TCP/2380 inte är öppet mellan två noder överskrids tidsgränsen för anslutningen och etcd skriver följande loggar:

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

Där <PEER_PSQL_NODE_ID> är det ID som etcd har tilldelat målnoden och <PEER_IP_PSQL_NODE> är målnodens IP-adress.

Exempel

I vårt exempel är PostgreSQL-clustret konfigurerat på följande sätt:

Nod Nodens 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

Om du kör kommandot journalctl -fu etcd från servern PSQL_1 får du följande loggar:

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

Dessa loggar visar att anslutningen från servern PSQL_1 till servern med IP-adressen 192.168.1.2 (PSQL_2) och ID 7176dd381f583d83 i etcd, på porten TCP/2380, inte lyckades: tidsgränsen överskreds. Vi kan dra slutsatsen att flödet från servern PSQL_1 till servern PSQL_2 blockeras (DROP) av en brandvägg.

Detta flöde kan blockeras (DROP) av PostgreSQL-appliancens lokala brandvägg: kontrollera appliancens brandväggskonfiguration på de berörda noderna. Om denna konfiguration är korrekt är det en brandvägg i infrastrukturen som blockerar (DROP) flödet TCP/2380 mellan de två noderna.

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

När en anslutning mellan två noder avvisas rapporterar etcd det med följande loggar:

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

Där <PEER_PSQL_NODE_ID> är det ID som etcd har tilldelat målnoden och <PEER_IP_PSQL_NODE> är målnodens IP-adress.

Avvisningen kan ha flera orsaker:

  • Tjänsten etcd fungerar inte som den ska eller är stoppad på målnoden. Kontrollera i så fall statusen (systemctl status etcd) och loggarna för tjänsten etcd på den noden.
  • En brandvägg avvisar (REJECT) flödet TCP/2380 mellan de två noderna. Det kan vara appliancens lokala brandvägg eller en brandvägg i infrastrukturen.
Exempel

I vårt exempel är PostgreSQL-clustret konfigurerat på följande sätt:

Nod Nodens 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

Om du kör kommandot journalctl -fu etcd från servern PSQL_1 får du följande loggar:

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

Dessa loggar visar att anslutningen från servern PSQL_1 till servern med IP-adressen 192.168.1.3 (PSQL_3) och ID e3d5ef565a5bb46c i etcd, på porten TCP/2380, avvisades.

På servern PSQL_3 visar kommandot systemctl status etcd att etcd har stoppats:

 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 har startats är problemet löst.

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

Om certifikaten för PostgreSQL-clustret har gått ut, eller om de inte har installerats eller förnyats korrekt på den nod där du läser loggarna, visas följande fel i loggarna för 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")

Där <PEER_IP_PSQL_NODE> är IP-adressen för en av noderna i clustret.

Denna logg visar att när den nod som du är ansluten till försökte upprätta en anslutning till de andra noderna i clustret (<PEER_IP_PSQL_NODE>) avvisade de den och rapporterade ett fel i den aktuella nodens certifikat.

Du bör därför kontrollera giltigheten för clustrets certifikat på den nod som du är ansluten till.

Varning

Om den certifikatutfärdare som är konfigurerad på en fjärrnod (i /etc/etcd/ca.crt) är felaktig visas felet också på den nod där du läser loggarna: det betyder då att fjärrnoden inte kan validera det certifikat som visas upp, eftersom den inte har rätt CA.

Exempel

I vårt exempel är PostgreSQL-clustret konfigurerat på följande sätt:

Nod Nodens 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

Om du kör kommandot journalctl -fu etcd från servern PSQL_1 får du följande loggar:

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

Dessa loggar visar att noderna PSQL_2 och PSQL_3 avvisade anslutningen från noden PSQL_1, eftersom certifikatet för PSQL_1 inte är giltigt i detta sammanhang.

Vi kontrollerar därför giltigheten för certifikaten på noden PSQL_1 genom att följa proceduren för kontroll av clustrets certifikat:

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

Resultatet visar att nodens certifikat har gått ut:

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

I så fall måste du förnya certifikaten för PostgreSQL-clustret.

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

Om etcd inte har rätt behörigheter för katalogen /var/lib/etcd/cleanroom vägrar tjänsten att starta och skriver följande loggar:

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 problemet genom att tilldela katalogen rätt behörigheter med följande kommando:

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